310 likes | 465 Views
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
E N D
MICROCONTROLEUR 68HC11F1 Algorithmique appliqué au traitement du signal B.HOAREAU Lycée Louis Payen LLP
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 LLP
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 LLP
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 LLP
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, k for cnt=cnt to 0 step -1 for i=0 to 100 next next return 0 end function LLP
F-prog2: Allumer - éteindre une led si appui sur capteur 1 Algo : Si capteur 1 appuyé alors allumer led rouge sinon éteindre led rouge ' 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 LLP
Prog3 : Allumer - éteindre une led si appui sur capteur 1 ET capteur 2 ' 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 LLP
Prog4 : Allumer - éteindre une led si appui sur capteur 1 OU 2 ' 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 LLP
Prog5 : Utilisation d'un masque Modifier un bit sans toucher aux autres ' 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 LLP
Prog6 : Clignotement conditionnel ' 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 LLP
' Prog7 : Clignotement conditionnel 2 Tant que capteur activé, faire clignoter led verte sinon faire clignoter led rouge ' 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 LLP
' Prog8 : Générer une séquence en utilisant un tableau #include "startcf1.bas" Byte T(5), j ‘ déclaration du tableau DDRD = 0 ' Port D en entrée DDRA = %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 LLP
Prog9 : Compter des impulsions et afficher sur leds ' 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 LLP
Prog10 : Générer un signal de rapport cyclique variable 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 LLP
F-ANAL1 : Réaliser une Conversion Analogique Numérique (CAN) #include "startcf1.bas" byte b, c DDRD = 0 ' Port D en entrée DDRA = %00001111 ' 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 LLP
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) LLP
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ée DDRA = %01001111 ' 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 d’interruption timer cli ' autoriser les interruptions (affecte bit I du CCR) LLP
' 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 LLP
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 = %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 LLP
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 LLP
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ée DDRA = %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 LLP
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 LLP
F-TOC : Timer Output Compare (TOC) : générer un signal carré haute ou basse fréquence sous interruption Une interruption est générée chaque fois que le free compteur atteint une valeur de comparaison ' 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ée DDRA = %01001111 ' A0 à A3 en sortie A4,A5,A7 en entrée A6 en sortie LLP
' 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 LLP
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 LLP
F-TIC : Timer Input Capture (TIC) : mesurer une largeur d’impulsion ou une période A chaque front (montant ou descendant ou successif suivant config) la valeur du free compteur est stockée dans registre TIC ' 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ée DDRA = %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 LLP
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) LLP
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) LLP
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’horloge Un front montant du /CS entraîne l’exécution du mot transféré . LLP
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 d’abord 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 LLP