La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

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

Présentations similaires


Présentation au sujet: "LLP1 MICROCONTROLEUR MICROCONTROLEUR 68HC11F1 Algorithmique appliqué au traitement du signal B.HOAREAU Lycée Louis Payen."— Transcription de la présentation:

1

2 LLP1 MICROCONTROLEUR MICROCONTROLEUR 68HC11F1 Algorithmique appliqué au traitement du signal B.HOAREAU Lycée Louis Payen

3 LLP2 Sommaire Présentation technique du controlboyF1 F-prog1: Allumer / éteindre une led. Configuration E/S dun 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

4 LLP3 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 dimpulsion 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 dimpulsion ou une période F-CNA : mise en œuvre du triple CNA 8 bits max 512

5 LLP4 Informations Techniques Carte ControlboyF1 Microcontrôleur 68HC11F1 16Mhz EEPROM 32k RAM 32k Liaison Rs232 Connecteur 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ées Connecteur D : PORTD : 4 entrées ou sorties logiques PORTG : 2 entrées ou sorties logiques Connecteur 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

6 LLP5 Fprog1 : Allumer / éteindre une led. Configuration E/S dun port #include "startcf1.bas" DDRD = 0' Port D en entrée DDRA = % ' 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, k for cnt=cnt to 0 step -1 for i=0 to 100 next return 0 end function

7 LLP6 F-prog2: Allumer - éteindre une led si appui sur capteur 1 ' programme principal ' Prog2 : Allumer - éteindre une led si appui sur capteur 1 PORTA = % ' 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

8 LLP7 ' programme principal ' Prog3: Allumer - éteindre une led si appui sur capteur 1 et 2 PORTA = % ' 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

9 LLP8 ' Prog4 : Allumer - éteindre une led si appui sur capteur 1 OU 2 PORTA = % ' 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

10 LLP9 ' Prog5 : Utilisation d'un masque PORTA = % ' Initialisation (éteindre leds) do If PORTA.4 = 0 then PORTA = PORTA AND % ' allumer led 2 et Led 4 else PORTA = PORTA OR % ' é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

11 LLP10 ' programme principal ' Prog6 : Clignotement conditionnel PORTA = % ' 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

12 LLP11 ' programme principal ' Prog7 : Clignotement conditionnel 2 PORTA = % ' 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

13 LLP12 #include "startcf1.bas" Byte T(5), j déclaration du tableau DDRD = 0' Port D en entrée DDRA = % ' A0 à A3 en sortie A4 à A7 en entrée T(0) = % Initialisation T(1) = % T(2) = % T(3) = % ' programme principal ' Prog8 : Générer une séquence en utilisant un tableau ' PORTA = % ' Initialisation (éteindre leds) do for j = 0 to 3 J sincré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

14 LLP13 ' programme principal ' Prog9 : Compter des impulsions et afficher sur leds ' PORTA = % ' 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 % Inverse pour affichage tempo(100) ' à cause des rebonds loop ' fin du programme principal Prog9 : Compter des impulsions et afficher sur leds

15 LLP14 Byte j int T, Th DDRD = 0' Port D en entrée DDRA = % ' 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 = % ' 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

16 LLP15 #include "startcf1.bas" byte b, c DDRD = 0' Port D en entrée DDRA = % ' A0 à A3 en sortie A4 à A7 en entrée lcdinit() 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 E7 ADCTL = ch ' lance le CNA do loop until ADCTL.7=1' attendre return ADR' registre contient le resultat end function F-ANAL1 : Réaliser une Conversion Analogique Numérique (CAN)

17 LLP16 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 dinterruption (ou sous programme dinterruption). A la fin de lexécution de la routine, le processeur reprend lexécution du programme principal là ou il lavait quitté. Lintérêt principal dune 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 lexemple du programme F-Prog9 quil faut détecter le front montant du signal : le microprocesseur passe 98% de son temps à attendre larrivée de limpulsion. 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 quil pourrait faire mille autres choses ! Attention : les interruptions ne résolvent pas les problèmes dalgorithmique … La configuration consiste à 1- Faire les paramétrages éventuels 2- Valider linterruption (masque à 1) 3- Valider flag 4- CLI (I=0 du registre CCR) A la fin de la routine dinterruption il faut à nouveau valider le flag afin dautoriser une nouvelle interruption. Lorsquune 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)

18 LLP17 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 ' ,4 ms #include "startcf1.bas" byte t, passage, flag ' Configuration DDRD = 0' Port D en entrée DDRA = % ' A0 à A3 en sortie A4,A5,A7 en entrée A6 en sortie Paramétrage interruption PACTL.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 programme TMSK2.6 = 1' Validation interruption timer (masque à 1) TFLG2.6 = 1 flag dinterruption timer cli' autoriser les interruptions (affecte bit I du CCR)

19 LLP18 ' 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

20 LLP19 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ée DDRA = % ' 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

21 LLP20 lcdinit() print "Comptage" do comp2=0 PACNT=0 PACNT est un registre de comptage tempo(500) qui sincré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

22 LLP21 F-compt4.bas : Mesurer une largeur dimpulsion ' 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ée DDRA = % ' 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

23 LLP22 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

24 LLP23 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 TIC3at $1014 ' résultat de input capture int TOC2at $1018 ' valeur de comparaison pour outputcapture sur A6 byte TCTL1at $1020 byte TCTL2at $1021 byte TMSK1at $1022 byte TFLG1at $1023 BYTE n,nt, flag,j BYTE T byte comp,comp2,mb int resultat, last flag = 0 DDRD = 0' Port D en entrée DDRA = % ' 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

25 LLP24 ' 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

26 LLP25 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 = TOC ' temps haut =1000 flag = 0 else PORTA.6 = 0 TOC2 = TOC ' temps bas = 2000 flag = 1 end if TFLG1.6 = 1' autoriser nouvelle interruption OutputCompare sur A6 /oc2 end function

27 LLP26 F-TIC : Timer Input Capture (TIC) : mesurer une largeur dimpulsion 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 TIC1at $1010 ' résultat de input capture sur PA2. Int FFEE int TIC2at $1012 ' résultat de input capture sur PA1. Int FFEC int TIC3at $1014 ' résultat de input capture sur PA0. Int FFEA int TOC2at $1018 ' valeur de comparaison pour outputcapture sur A6 int FFE6 byte TCTL1at $1020 byte TCTL2at $1021 byte TMSK1at $1022 byte TFLG1at $1023 BYTE n,nt, flag,j BYTE T byte comp,comp2,mb int resultat, last flag = 0 DDRD = 0' Port D en entrée DDRA = % ' 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

28 LLP27 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 = % ' 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)

29 LLP28 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 TIC2 Il faut faire une soustraction avec lancienne valeur de TIC2 pour connaître la largeur de limpulsion (ou période)

30 LLP29 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 dhorloge (DACSCLK) 1 mot de 16 bits doit être chargé en série (ligne DIN) pour contrôler lun des 3 CAN : Les 8 bits de poids forts permettent (en autre) de sélectionner lun des 3 CAN Les 8 bits de poids faibles doivent contenir la valeur à convertir Exemple : Sélection valeur LC LB LA Le CAN 1 est sélectionné et 67 est chargé pour conversion 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 dhorloge Un front montant du /CS entraîne lexécution du mot transféré.

31 LLP30 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. Initialisation max512(ch) ' Envoie dabord du numéro de CAN max512(val) ' Envoie de la donnée à convertir PORTM = 0x30' CS = 1 Fin transfert, exécution. end function function max512(val) ' le nom val est mal choisi … attention à la confusion ! byte cnt for 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 0 PORTM = 0x20' SDIN = 0 (on envoie 0) PORTM = 0x21' SCLK = 1 (front montant horloge) end if PORTM = 0x20' SCLK = 0 (horloge à 0) val = val + val ' décalage à gauche (=val*2) pour bit suivant next cnt end function


Télécharger ppt "LLP1 MICROCONTROLEUR MICROCONTROLEUR 68HC11F1 Algorithmique appliqué au traitement du signal B.HOAREAU Lycée Louis Payen."

Présentations similaires


Annonces Google