30
LLP 1 MICROCONTROLEUR 68HC11F1 Algorithmique appliqué au traitement du signal B.HOAREAU Lycée Louis Payen

MICROCONTROLEUR 68HC11F1

  • Upload
    lotte

  • View
    40

  • Download
    0

Embed Size (px)

DESCRIPTION

MICROCONTROLEUR 68HC11F1. Algorithmique appliqué au traitement du signal. B.HOAREAU Lycée Louis Payen. Sommaire. Présentation technique du controlboyF1 F-prog1: Allumer / éteindre une led . Configuration E/S d’un port. F-prog2: Allumer - éteindre une led si appui sur capteur 1 - PowerPoint PPT Presentation

Citation preview

Page 1: MICROCONTROLEUR  68HC11F1

LLP 1

MICROCONTROLEUR 68HC11F1

Algorithmique appliqué au traitement du signal

B.HOAREAU Lycée Louis Payen

Page 2: MICROCONTROLEUR  68HC11F1

LLP 2

Sommaire

• Présentation technique du controlboyF1

• F-prog1: Allumer / éteindre une led . Configuration E/S d’un port.

• F-prog2: Allumer - éteindre une led si appui sur capteur 1

• F-prog3: Allumer - éteindre une led si appui sur capteur 1 ET 2

• F-prog4 : Allumer - éteindre une led si appui sur capteur 1 OU 2

• F-prog5 : Utilisation d'un masque

• F-prog6 : Clignotement conditionnel

• F-prog7 : Clignotement conditionnel 2

• F-prog8 : Générer une séquence en utilisant un tableau

• F-prog9 : Compter des impulsions et afficher sur leds

• F-prog10 : Générer un signal de rapport cyclique variable

Page 3: MICROCONTROLEUR  68HC11F1

LLP 3

• F-anal1 : Réaliser une conversion Analogique Numérique (CAN)

• Notion sur les interruptions et principe général de mise en oeuvre

• F-timer2 : Utiliser le timer pour générer des impulsions

• F-compt3.bas : Compter des impulsions par interruptions (interruption sur A7 et interruption pour gestion de débordement comptage (overflow)

• F-compt4.bas : Mesurer une largeur d’impulsion

• F-TOC : Timer Output Compare (TOC) : générer un signal carré haute ou basse fréquence sous interruption

• F-TIC : Timer Input Capture (TIC) : mesurer une largeur d’impulsion ou une période

• F-CNA : mise en œuvre du triple CNA 8 bits max 512

Page 4: MICROCONTROLEUR  68HC11F1

LLP 4

Informations Techniques Carte ControlboyF1

Microcontrôleur 68HC11F1 16MhzEEPROM 32kRAM 32kLiaison Rs232Connecteur A : PortA 8 entrées ou sorties logiques Connecteur B : PORTB : 8 sorties logiques à Darlington 500mA .50V.Connecteur C : PORTC : 8 entrées numériques optocoupléesConnecteur D : PORTD : 4 entrées ou sorties logiques

PORTG : 2 entrées ou sorties logiquesConnecteur E : PORTE : 8 entrées analogiques (CAN résolution 8 bits) . Peut être utilisé aussi comme des entrées logiques traditionnelles.Connecteur F : PORT N : 4 entrées logiques

3 sorties analogiques avec CNA 8 bits (Max 512) Connecteur LCD : PORTM :6 sorties logiques

PORTN :4 entrées logiques Connecteur X : Extension bus du 68HC11F1 : Gnd,Vcc,Rst,Irq,Xirq,R/W,E,CSIO2,D0 àD7 , A0 à A3

Page 5: MICROCONTROLEUR  68HC11F1

LLP 5

Fprog1 : Allumer / éteindre une led . Configuration E/S d’un port

#include "startcf1.bas" DDRD = 0 ' Port D en entrée

DDRA = %00001111 ' A0 à A3 en sortie A4 à A7 en entrée

' programme principal

' Prog1 : Allumer - éteindre une led

do PORTA.0 =0 ' allumer tempo(200) PORTA.0 =1 ' Eteindre tempo(200) loop ‘ boucler à do' fin du programme principal

' Sous programmes et fonctions :

function tempo(cnt)int i, kfor cnt=cnt to 0 step -1

for i=0 to 100next

nextreturn 0end function

Page 6: MICROCONTROLEUR  68HC11F1

LLP 6

•F-prog2: Allumer - éteindre une led si appui sur capteur 1

' programme principal

' Prog2 : Allumer - éteindre une led si appui sur capteur 1 PORTA = %00001111 ' Initialisation (éteindre leds) do

If PORTA.4 = 0 then PORTA.1 = 0 ' allumer led rouge else PORTA.1 = 1 ' éteindre led rouge end if loop ' fin du programme principal

Algo : Si capteur 1 appuyé alors allumer led rouge sinon éteindre led rouge

Page 7: MICROCONTROLEUR  68HC11F1

LLP 7

' programme principal

' Prog3: Allumer - éteindre une led si appui sur capteur 1 et 2

PORTA = %00001111 ' Initialisation (éteindre leds) do If PORTA.4 = 0 and PORTA.5 = 0 then PORTA.1 = 0 ' allumer led rouge else PORTA.1 = 1 ' éteindre led rouge end if

loop

' fin du programme principal

Prog3 : Allumer - éteindre une led si appui sur capteur 1 ET capteur 2

Page 8: MICROCONTROLEUR  68HC11F1

LLP 8

' Prog4 : Allumer - éteindre une led si appui sur capteur 1 OU 2 PORTA = %00001111 ' Initialisation (éteindre leds) do If PORTA.4 = 0 OR PORTA.5 = 0 then PORTA.1 = 0 ' allumer led rouge else PORTA.1 = 1 ' éteindre led rouge end if

loop ' fin du programme principal

Prog4 : Allumer - éteindre une led si appui sur capteur 1 OU 2

Page 9: MICROCONTROLEUR  68HC11F1

LLP 9

' Prog5 : Utilisation d'un masque PORTA = %00001111 ' Initialisation (éteindre leds) do If PORTA.4 = 0 then PORTA = PORTA AND %11110101 ' allumer led 2 et Led 4 else PORTA = PORTA OR %00001010 ' éteindre led 2 et led 4 end if

loop ' fin du programme principal

Prog5 : Utilisation d'un masque

Modifier un bit sans toucher aux autres

Page 10: MICROCONTROLEUR  68HC11F1

LLP 10

' programme principal

' Prog6 : Clignotement conditionnel PORTA = %00001111 ' Initialisation (éteindre leds) do do while PORTA.4 = 0 ‘ tant que capteur appuyé PORTA.0 = 0 ‘ allumer led tempo(100) PORTA.0 = 1 ‘ Eteindre led tempo(100) loop ‘ Boucler à do

loop ' fin du programme principal

Prog6 : Clignotement conditionnel

Page 11: MICROCONTROLEUR  68HC11F1

LLP 11

' programme principal

' Prog7 : Clignotement conditionnel 2 PORTA = %00001111 ' Initialisation (éteindre leds)

do do while PORTA.4 = 0 PORTA.0 = 0 tempo(100) PORTA.0 = 1 tempo(100) loop PORTA.1 = 0 tempo(100) PORTA.1 = 1 tempo(100)

loop

' fin du programme principal

' Prog7 : Clignotement conditionnel 2

Tant que capteur activé, faire clignoter led verte sinon faire clignoter led rouge

Page 12: MICROCONTROLEUR  68HC11F1

LLP 12

#include "startcf1.bas" Byte T(5), j ‘ déclaration du tableau

DDRD = 0 ' Port D en entréeDDRA = %00001111 ' A0 à A3 en sortie A4 à A7 en entrée

T(0) = %00001010 ‘ Initialisation T(1) = %00000110 T(2) = %00000101 T(3) = %00001001

' programme principal

' Prog8 : Générer une séquence en utilisant un tableau' PORTA = %00001111 ' Initialisation (éteindre leds) do for j = 0 to 3 ‘ J s’incrémente de 0 à 3 PORTA = T(j) ‘ Affectation du tableau T(j) au port A tempo(400) next j

loop ' fin du programme principal

' Prog8 : Générer une séquence en utilisant un tableau

Page 13: MICROCONTROLEUR  68HC11F1

LLP 13

' programme principal

' Prog9 : Compter des impulsions et afficher sur leds' PORTA = %00001111 ' Initialisation (éteindre leds)

do do loop until PORTA.4 =1 ‘Attendre capteur ouvert do loop until PORTA.4 =0 ‘Attendre capteur fermé compteur = compteur + 1 PORTA = compteur XOR %00001111 ‘ Inverse pour affichage tempo(100) ' à cause des rebonds loop ' fin du programme principal

Prog9 : Compter des impulsions et afficher sur leds

Page 14: MICROCONTROLEUR  68HC11F1

LLP 14

Byte j int T, Th DDRD = 0 ' Port D en entrée DDRA = %00001111 ' A0 à A3 en sortie A4 à A7 en entrée T = 500 Th = 100

' programme principal' Prog10 : Rapport cyclique variable' Si T1 appuyé, TH augmente à 100%' Si T2 appuyé, TH diminue à 0%

PORTA = %00001111 ' Initialisation (éteindre leds) do PORTA.1 = 0 tempo(Th) PORTA.1 = 1 tempo(T-Th) if PORTA.4 = 0 and Th<=(T-10) then Th = Th+10 end if if PORTA.5 = 0 and Th>=10 then Th = Th-10 end if

loop ' fin du programme principal

Prog10 : Générer un signal de rapport cyclique variable

Page 15: MICROCONTROLEUR  68HC11F1

LLP 15

#include "startcf1.bas"

byte b, cDDRD = 0 ' Port D en entréeDDRA = %00001111 ' A0 à A3 en sortie A4 à A7 en entréelcdinit()

print "CONVERSION" ' programme principal

OPTIONS.7 = 1 ' Valider CNA

do c = analogin(0) ' Conversion sur E0 print "CAN=", c ‘Affichage sur LCD

tempo(200) loop' fin du programme principal

'******************************* analog in ************************************

function analogin(ch) ' ch= 0 pour E0 à 7 pour E7ADCTL = ch ' lance le CNAdoloop until ADCTL.7=1 ' attendrereturn ADR ' registre contient le resultat

end function

F-ANAL1 : Réaliser une Conversion Analogique Numérique (CAN)

Page 16: MICROCONTROLEUR  68HC11F1

LLP 16

Notion sur les interruptions et principe général de mise en oeuvre

Lorsque le microprocesseur exécute les instructions du programme principal , il peut être interrompu par un signal interne (timer) ou externe (Patte PA7) pour exécuter une tâche spécifique appelée routine d’interruption (ou sous programme d’interruption) . A la fin de l’exécution de la routine, le processeurreprend l’exécution du programme principal là ou il l’avait quitté.L’intérêt principal d’une interruption est de réaliser des tâches (comptage, génération de signaux …) sans utiliser tout le temps machine . Par exemple, pour compter des impulsions on a vu dans l’exempledu programme F-Prog9 qu’il faut détecter le front montant du signal : le microprocesseur passe 98% deson temps à attendre l’arrivée de l’impulsion . De même, pour générer un signal carré par exemple, le processeur va passer tout son temps à attendre (temporisations temps haut et temps bas du signal)alors qu’il pourrait faire mille autres choses ! Attention : les interruptions ne résolvent pas les problèmes d’algorithmique …La configuration consiste à

1- Faire les paramétrages éventuels

2- Valider l’interruption (masque à 1)3- Valider flag4- CLI (I=0 du registre CCR)

A la fin de la routine d’interruption il faut à nouveau valider le flag afin d’autoriser une nouvelle interruption.Lorsqu’une interruption est générée, elle ne doit pas elle même être interrompue (le drapeau ‘flag ’ est automatiquement positionné par le microcontrôleur)

Page 17: MICROCONTROLEUR  68HC11F1

LLP 17

F-timer2 : Utiliser le timer pour générer des impulsions

' Utilisation du Timer ' Clignoter led ROUGE à basse fréquence sous interruption' Pour modifier le timer (CboyF1 16mhz):' PACTTL.1 PACTL.0 (détermine le temps entre 2 interruptions timer )' 0 0 2,05 ms' 0 1 4,1 ms' 1 0 8,2 ms' 1 1 16,4 ms

#include "startcf1.bas"

byte t, passage, flag ' Configuration

DDRD = 0 ' Port D en entréeDDRA = %01001111 ' A0 à A3 en sortie A4,A5,A7 en entrée A6 en

sortie

‘ Paramétrage interruptionPACTL.1 = 1 ' selectionner la vitesse (16,4ms sur cboyF1 16Mhz)PACTL.0 = 1 ' en fonction de ce qu'on souhaite

' Voir tableau en haut du programmeTMSK2.6 = 1 ' Validation interruption timer (masque à 1)

TFLG2.6 = 1 ‘flag d’interruption timer

cli ' autoriser les interruptions (affecte bit I du CCR)

Page 18: MICROCONTROLEUR  68HC11F1

LLP 18

' initialisation passage = 0 flag = 0 ‘ Programme principal do PORTA.0 = 0 ' Allumer led verte tempo(200) PORTA.0 = 1 ‘ Éteindre led verte tempo(200) loop

' Fonction interruption du TIMER :

interrupt function rtiint at $FFF0 ‘adresse spécifique interruption timer passage=passage+1 if passage >=20 then ’ 20*16.4ms = 328ms if flag=1 then PORTA.1 = 0 ' Allumer led rouge flag = 0 else PORTA.1 =1 ' Eteindre led rouge flag = 1 end if passage = 0 end if TFLG2.6 = 1 ' autoriser interruption à nouveau (obligatoire !)end function

Page 19: MICROCONTROLEUR  68HC11F1

LLP 19

•F-compt3.bas : Compter des impulsions par interruptions (interruption sur A7 et interruption pour gestion de débordement comptage (overflow)

#include "startcf1.bas"

BYTE n,nt, flag,j BYTE T INT comp,comp2,mb

DDRD = 0 ' Port D en entréeDDRA = %01001111 ' A0 à A3 en sortie A4,A5,A7 en entrée A6 en sortie

' utilisation du registre PA : Pulse Accumulator PACTL.5=0 ' PMOD =1 Mode Pulsetimer : mesure le temps A7 mis à 1 ' PMOD =0 Mode comptage ' (Ne pas confondre avec le timer) PACTL.4=1 ' PEDG =0 PACTL.6=1 ' Validation pour travailler en compteur/pulsetimer sur A7

TMSK2.4=1 ' PAII = 1 Validation interruption sur A7 TFLG2.4=1 ' PAIF =1 Flag Autorise nouvelle interruption sur A7 TMSK2.5=1 ' POVI =1 Validation Interruption overflow TFLG2.5=1 ' POVF =1 Flag autorise new int overflow

TMSK2.6=0 ' RTII=0 Inhibition du timer (arret timer) TFLG2.6=0 ' RTIF=0 Flag associé au timer cli ' autoriser les inter

Page 20: MICROCONTROLEUR  68HC11F1

LLP 20

lcdinit() print "Comptage" do comp2=0 PACNT=0 ‘ PACNT est un registre de comptage tempo(500) ‘ qui s’incrémente à chaque impulsion sur A7 comp=PACNT ‘ on récupère la valeur du registre print "comp=",comp ' affiche valeur compteur print "comp2=",comp2," " ' si débordement de comp loop ' interruption de fin d'impulsion : ' Survient à la fin de l'impulsion sur A7 interrupt function rtiint at $FFDA ‘ spécifique pulsetimer PORTA.6=1 ' Pour visualiser l'interruption for j=1 to 100 ' Génère une petite impulsion sur A6 NOP next j PORTA.6=0

if flag=1 then flag=0 PORTA.2 = 0 else flag=1 PORTA.2 = 1 end if TFLG2.4 = 1 ' PAIF à 1 pour autoriser nouvelle interruption end function

' interruption pour overflow : ‘ Exécuté si PACNT est passé de 255 à 0

interrupt function overflow at $FFDC comp2 = comp2+1 TFLG2.5 = 1 ' Autorise int POVF = 1

end function

Page 21: MICROCONTROLEUR  68HC11F1

LLP 21

F-compt4.bas : Mesurer une largeur d’impulsion

' Mesurer une largeur d'impulsion ' Régler les impulsions à 5ms environ pour les tests' Faire varier très doucement la largeur d'impulsion (ou freq)#include "startcf1.bas" BYTE n,nt, flag,j BYTE T byte comp,comp2,mb

DDRD = 0 ' Port D en entréeDDRA = %01001111 ' A0 à A3 en sortie A4,A5,A7 en entrée A6 en

sortie ' utilisation du registre PA : Pulse Accumulator PACTL.5=1 ' PMOD =1 Mode Pulsetimer : mesure le temps A7 mis à 1 ' PMOD =0 Mode comptage d'impulsions ' (Ne pas confondre avec le timer) PACTL.4=0 ' PEDG =0 PACTL.6=1 ' PAEN Validation pour travailler en compteur/pulsetimer sur A7

TMSK2.4=1 ' PAII = 1 Validation interruption sur A7 TFLG2.4=1 ' PAIF =1 Flag Autorise nouvelle interruption sur A7 TMSK2.5=0 ' POVI =0 Pas de validation Interruption overflow TFLG2.5=0 ' POVF =0 Flag autorise pas new int overflow ' Ne pas activer si mode pulsetimer sur A7

TMSK2.6=0 ' RTII=0 Inhibition du timer (arret timer) TFLG2.6=0 ' RTIF=0 flag lié au timer cli ' autoriser les inter

Page 22: MICROCONTROLEUR  68HC11F1

LLP 22

lcdinit()print "Comptage"

do wai ' attendre interruption comp2=0 ' initialisation PACNT=0 wai ' attendre nouvelle interruption comp=PACNT print "comp=",comp ' affiche valeur compteur tempo(500) loop ' interruption de fin d'impulsion : ' Survient à la fin de l'impulsion sur A7 interrupt function rtiint at $FFDA PORTA.6=1 ' Pour visualiser l'interruption for j=1 to 100 ' Génère une petite impulsion sur A6 NOP next j PORTA.6=0 if flag=1 then flag=0 PORTA.2 = 0 else flag=1 PORTA.2 = 1 end if TFLG2.4 = 1 ' PAIF à 1 pour autoriser nouvelle interruption end function

Page 23: MICROCONTROLEUR  68HC11F1

LLP 23

F-TOC : Timer Output Compare (TOC) : générer un signal carré haute ou basse fréquence

sous interruption

' OUTPUT COMPARE : générer un signal carré' Régler oscillo sur 200us/carreau' Visualiser le signal sur A6' Modifier les valeurs de comparaison dans routine d'interruption outputcompare

#include "startcf1.bas" ' definitions supplémentaires int TIC3 at $1014 ' résultat de input capture int TOC2 at $1018 ' valeur de comparaison pour outputcapture sur A6

byte TCTL1 at $1020 byte TCTL2 at $1021 byte TMSK1 at $1022 byte TFLG1 at $1023 BYTE n,nt, flag,j BYTE T byte comp,comp2,mb int resultat, last flag = 0

DDRD = 0 ' Port D en entréeDDRA = %01001111 ' A0 à A3 en sortie A4,A5,A7 en entrée A6 en sortie

Une interruption est générée chaque fois que le free compteur atteint une valeur de comparaison

Page 24: MICROCONTROLEUR  68HC11F1

LLP 24

' utilisation du registre PA : Pulse Accumulator

PACTL.5=1 ' PMOD =1 Mode Pulsetimer : mesure le temps A7 mis à 1 ' PMOD =0 Mode comptage d'impulsions ' (Ne pas confondre avec le timer) PACTL.4=0 ' PEDG =0 PACTL.6=0 ' PAEN Validation pour travailler en compteur/pulsetimer sur A7

TMSK2.4=0 ' PAII = 1 Validation interruption sur A7 TFLG2.4=0 ' PAIF =1 Flag Autorise nouvelle interruption sur A7 TMSK2.5=0 ' POVI =1 Validation Interruption overflow TFLG2.5=0 ' POVF =1 Flag autorise new int overflow ' Ne pas activer si mode pulsetimer sur A7

TMSK2.6=0 ' RTII=0 Inhibition du timer (arret timer) TFLG2.6=0 ' RTIF=0 lié au timer (flag indiquant qu'il vient d'y ‘ avoir une interruption timer afin que l'interruption ne soit pas interrompue elle même (par ‘ le timer) si trop longue ...) . Doit être remis à 1 dans le sous programme d'interruption si on ‘ veut une nouvelle interruption du timer. Ne devrait pas être le cas ici puisqu'on utilise le pusletimer...)

' Configuration pour input capture sur A0: ' DDRA.0 = 0 ' A0 en entrée TMSK1.0 = 0 ' validation interruption Input Capture sur A0 TFLG1.0 = 0 ' flag associé TCTL2 = 0 ' Config pour mesure entre 2 fronts descendant ' Configuration pour Output Compare OC2 TMSK1.6 = 1 ' validation interruption output capture sur A6 / Oc2 TFLG1.6 = 1 ' Flag associé TCTL1.7 = 0 ' Config fonctionnement sortie A6 page 115 doc motorola TCTL1.6 = 0 ' si 1, A6 change d'état (toggle) à chaque interruption ' conseil hoareau : toujours mettre à 0 TCTL1 car sinon même lorsque ' le 68HC11 est en stop, un signal carré est généré , le free compteur ' ne s'arrêtant jamais ...

TOC2 = 1000 ' Valeur de comparaison

Page 25: MICROCONTROLEUR  68HC11F1

LLP 25

cli ' autoriser les inter lcdinit()

print "OUTPUT COMPARE" do print "Voir signal sur A6" tempo(500) loop

‘ Chaque fois que freecompteur=toc2, une interruption est générée : interrupt function outputcompare at $FFE6 ' adresse specifique

if flag=1 then PORTA.6 = 1 ' rien ne m'empêche d'utiliser une autre sortie !!! TOC2 = TOC2 + 1000 ' temps haut =1000 flag = 0 else PORTA.6 = 0 TOC2 = TOC2 + 2000 ' temps bas = 2000 flag = 1 end if

TFLG1.6 = 1 ' autoriser nouvelle interruption OutputCompare sur A6 /oc2

end function

Page 26: MICROCONTROLEUR  68HC11F1

LLP 26

•F-TIC : Timer Input Capture (TIC) : mesurer une largeur d’impulsion ou une période

' INPUT CAPTURE : Mesure une période' Régler oscillo sur 2ms/carreau ' GBF : TTL 400Hz modifier symétrie' Affichage sur lcd'#include "startcf1.bas" ' definitions supplémentaires int TIC1 at $1010 ' résultat de input capture sur PA2 . Int FFEE int TIC2 at $1012 ' résultat de input capture sur PA1 . Int FFEC int TIC3 at $1014 ' résultat de input capture sur PA0 . Int FFEA int TOC2 at $1018 ' valeur de comparaison pour outputcapture sur A6 int FFE6 byte TCTL1 at $1020 byte TCTL2 at $1021 byte TMSK1 at $1022 byte TFLG1 at $1023 BYTE n,nt, flag,j BYTE T byte comp,comp2,mb int resultat, last flag = 0

DDRD = 0 ' Port D en entréeDDRA = %01001101 ' A0 A2 A3 A6 en sortie A1, A4,A5,A7 en entrée

' utilisation du registre PA : Pulse Accumulator

PACTL.5=1 ' PMOD =1 Mode Pulsetimer : mesure le temps A7 mis à 1 ' PMOD =0 Mode comptage d'impulsions ' (Ne pas confondre avec le timer) PACTL.4=0 ' PEDG =0 PACTL.6=0 ' PAEN Validation pour travailler en compteur/pulsetimer sur A7

A chaque front (montant ou descendant ou successif suivant config) la valeur du free compteur est stockée dans registre TIC

Page 27: MICROCONTROLEUR  68HC11F1

LLP 27

TMSK2.4=0 ' PAII = 1 Validation interruption sur A7 TFLG2.4=0 ' PAIF =1 Flag Autorise nouvelle interruption sur A7 TMSK2.5=0 ' POVI =1 Validation Interruption overflow TFLG2.5=0 ' POVF =1 Flag autorise new int overflow ' Ne pas activer si mode pulsetimer sur A7

TMSK2.6=0 ' RTII=0 Inhibition du timer (arret timer) TFLG2.6=0 ' RTIF=0 lié au timer (flag indiquant qu'il vient d'y avoir une interruption timer afin que l'interruption ne soit pas interrompue elle même (par le timer) si trop longue ...) . Doit être remis à 1 dans le sous programme d'interruption si on veut une nouvelle interruption du timer. Ne devrait pas être le cas ici puisqu'on utilise le pusletimer...) ' Configuration pour Output Compare OC2 TMSK1.6 = 0 ' validation interruption output capture sur A6 TFLG1.6 = 0 ' Flag associé TCTL1.7 = 0 ' Config fonctionnement sortie A6 page 115 doc motorola TCTL1.6 = 0 ' si 1, A6 change d'état (toggle) à chaque interruption ' conseil hoareau : toujours mettre à 0 TCTL1 car sinon même lorsque ' le 68HC11 est en stop, un signal carré est généré , le free compteur ' ne s'arrêtant jamais ... TOC2 = 1000 ' Valeur de comparaison

' Configuration pour input capture sur A1: ' Vérifier plus haut que A1 en entrée pour inputcapture IC2 TMSK1.1 = 1 ' validation interruption Input Capture sur A1 TFLG1.1 = 1 ' flag associé TCTL2 = %00000100 ' b3 b2 (pour IC2) ' 0 0 : pas de déclenchement ' 0 1 : mesure période ' 1 0 : mesure période ' 1 1 : mesure entre 2 fronts ' Pour IC1 il faut configurer les bits b1 b0 .. voir page 110 du 68HC11

cli ' autoriser les inter last=0 resultat = 0 lcdinit() print "INPUT Capture" tempo(10)

Page 28: MICROCONTROLEUR  68HC11F1

LLP 28

do print "INPcapt=", resultat tempo(500) loop interrupt function inputcapture at $FFEC ' adresse specifique pour IC2

resultat= TIC2-last ' Input capture sur A1 : registre TIC2 last = TIC2

PORTA.6=1 ' Pour visualiser l'interruption for j=1 to 100 ' Génère une petite impulsion sur A6 NOP next j PORTA.6=0

if flag=1 then flag=0 PORTA.2 = 0 else flag=1 PORTA.2 = 1 end if

TFLG1.1 = 1 ' autoriser nouvelle interruption input capture sur A1 end function

A chaque interruption, la valeur du free compteur est recopiée dans TIC2Il faut faire une soustraction avec l’ancienne valeur de TIC2 pour connaître la largeur de l’impulsion (ou période)

Page 29: MICROCONTROLEUR  68HC11F1

LLP 29

Mise en œuvre du triple CNA 8bits (max512) de la carte cboyF1

Le Max512 dispose de 3 sorties analogiques . 3 lignes en entrées permettent de piloter le circuit:1 ligne /CS pour la sélection (DACCS)1 ligne DIN pour les données séries (DACDIN)1 ligne SCLK d’horloge (DACSCLK)

1 mot de 16 bits doit être chargé en série (ligne DIN) pour contrôler l’un des 3 CAN :Les 8 bits de poids forts permettent (en autre) de sélectionner l’un des 3 CAN Les 8 bits de poids faibles doivent contenir la valeur à convertir

Exemple : Sélection valeur LC LB LA

0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 ‘ Le CAN 1 est sélectionné et 67 est chargé pour conversion

0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 ‘ Le CAN 3 est sélectionné et 9 est chargé pour conversion

Un front descendant sur /CS indique au MAX512 le début du transfert (initialisation)Il est possible de charger simultanément 2 ou 3 CAN, mais avec la même valeur !Le décalage se fait à chaque front montant d’horlogeUn front montant du /CS entraîne l’exécution du mot transféré .

Page 30: MICROCONTROLEUR  68HC11F1

LLP 30

Do for j=0 to 255 ' pour générer une rampe analogout(4, j) ' envoi sur convertisseur 3 de la valeur i tempo(1) ' pour modifier la pente de la rampe next j Loop

' Voir chronogramme du max 512 et schéma de câblage des entrées (Doc controlord) function analogout(ch, val) ' 1: A, 2: B, 4: C

PORTM = 0x20 ' CS = 0 0x signifie hexadécimal. Initialisationmax512(ch) ' Envoie d’abord du numéro de CANmax512(val) ' Envoie de la donnée à convertirPORTM = 0x30 ' CS = 1 Fin transfert, exécution.

end function

function max512(val) ' le nom val est mal choisi … attention à la confusion !byte cntfor cnt = 0 to 7 ' 8 bits à transférer

if val and 0x80 then ' On fait un masque pour test bit poids fort ' test vrai : bit poids fort vaut 1

PORTM = 0x22 ' SDIN = 1 (on envoie 1)PORTM = 0x23 ' SCLK = 1 (front montant horloge)

else 'sinon c'est que bit poids fort vaut 0PORTM = 0x20 ' SDIN = 0 (on envoie 0)PORTM = 0x21 ' SCLK = 1 (front montant horloge)

end ifPORTM = 0x20 ' SCLK = 0 (horloge à 0)val = val + val ' décalage à gauche (=val*2) pour bit suivant

next cnt end function