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

Algorithmique appliqué au traitement du signal

Présentations similaires


Présentation au sujet: "Algorithmique appliqué au traitement du signal"— Transcription de la présentation:

1 Algorithmique appliqué au traitement du signal
MICROCONTROLEUR 68HC11F1 Algorithmique appliqué au traitement du signal LLP B. Hoareau B.HOAREAU Lycée Louis Payen 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 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 LLP

4 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

5 Fprog1 : Allumer / éteindre une led . Configuration E/S d’un 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 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 LLP

6 ' Prog2 : Allumer - éteindre une led si appui sur capteur 1
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 = % ' 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

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

8 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 LLP

9 Modifier un bit sans toucher aux autres
Prog5 : Utilisation d'un masque Modifier un bit sans toucher aux autres ' 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 LLP

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

11 ' Prog7 : Clignotement conditionnel 2
Tant que capteur activé, faire clignoter led verte sinon faire clignoter led rouge ' programme principal ' Prog7 : Clignotement conditionnel 2 PORTA = % ' Initialisation (éteindre leds) do do while PORTA.4 = 0 PORTA.0 = 0 tempo(100) PORTA.0 = 1 loop PORTA.1 = 0 PORTA.1 = 1 ' fin du programme principal LLP

12 ' 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 = % ' 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 ‘ 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

13 Prog9 : Compter des impulsions et afficher sur leds
' programme principal ' Prog9 : Compter des impulsions et afficher sur leds ' PORTA = % ' Initialisation (éteindre leds) do loop until PORTA.4 =1 ‘Attendre capteur ouvert 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 LLP

14 Prog10 : Générer un signal de rapport cyclique variable
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 loop ' fin du programme principal LLP

15 F-ANAL1 : Réaliser une Conversion Analogique Numérique (CAN)
#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 loop until ADCTL.7=1 ' attendre return ADR ' registre contient le resultat end function 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 processeur reprend 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’exemple du programme F-Prog9 qu’il faut détecter le front montant du signal : le microprocesseur passe 98% de son 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 flag 4- 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) La documentation motorola indique qu’on efface (clear) le flag en écrivant « 1 » dans tflg L’instruction CLI est dans le fichier de config starcf1.bas . Le débugger l’utilise donc il faut systématiquement cli. 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 ) ' ,05 ms ' ,1 ms ' ,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 = ' selectionner la vitesse (16,4ms sur cboyF1 16Mhz) PACTL.0 = ' en fonction de ce qu'on souhaite ' Voir tableau en haut du programme TMSK2.6 = 1 ' Validation interruption timer (masque à 1) TFLG2.6 = ‘flag d’interruption timer cli ' autoriser les interruptions (affecte bit I du CCR) LLP

18 ' initialisation passage = 0 flag = 0 ‘ Programme principal do PORTA.0 = ' Allumer led verte tempo(200) PORTA.0 = ‘ Éteindre led verte 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 = ' Allumer led rouge else PORTA.1 = ' Eteindre led rouge flag = 1 end if TFLG2.6 = 1 ' autoriser interruption à nouveau (obligatoire !) end function 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ée DDRA = % ' A0 à A3 en sortie A4,A5,A7 en entrée A6 en sortie ' utilisation du registre PA : Pulse Accumulator PACTL.5= ' PMOD =1 Mode Pulsetimer : mesure le temps A7 mis à 1 ' PMOD =0 Mode comptage ' (Ne pas confondre avec le timer) PACTL.4= ' PEDG =0 PACTL.6= ' Validation pour travailler en compteur/pulsetimer sur A7 TMSK2.4= ' PAII = 1 Validation interruption sur A7 TFLG2.4= ' PAIF =1 Flag Autorise nouvelle interruption sur A7 TMSK2.5= ' POVI =1 Validation Interruption overflow TFLG2.5= ' POVF =1 Flag autorise new int overflow TMSK2.6= ' RTII=0 Inhibition du timer (arret timer) TFLG2.6= ' RTIF=0 Flag associé au timer cli ' autoriser les inter LLP

20 PACNT=0 ‘ PACNT est un registre de comptage
lcdinit() print "Comptage" do comp2=0 PACNT= ‘ 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= ' Pour visualiser l'interruption for j=1 to ' 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 TFLG2.5 = 1 ‘ POVF=1 c’est pas exactement cela, mais pour simplifier on fera comme si …. Ce serait plutot mise à 0 de POVF (la mise à 1 se faisant par le microcontroleur lors d’un interruption) LLP

21 F-compt4.bas : 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= ' PMOD =1 Mode Pulsetimer : mesure le temps A7 mis à 1 ' PMOD =0 Mode comptage d'impulsions ' (Ne pas confondre avec le timer) PACTL.4= ' PEDG =0 PACTL.6= ' PAEN Validation pour travailler en compteur/pulsetimer sur A7 TMSK2.4= ' PAII = 1 Validation interruption sur A7 TFLG2.4= ' PAIF =1 Flag Autorise nouvelle interruption sur A7 TMSK2.5= ' POVI =0 Pas de validation Interruption overflow TFLG2.5= ' POVF =0 Flag autorise pas new int overflow ' Ne pas activer si mode pulsetimer sur A7 TMSK2.6= ' RTII=0 Inhibition du timer (arret timer) TFLG2.6= ' RTIF=0 flag lié au timer cli ' autoriser les inter LLP

22 wai ' attendre interruption comp2=0 ' initialisation PACNT=0
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= ' Pour visualiser l'interruption for j=1 to ' 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 = ' PAIF à 1 pour autoriser nouvelle interruption end function Note : il manque la fonction tempo, c’est idem que les programmes précédents LLP

23 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 $ ' résultat de input capture int TOC2 at $ ' 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 = % ' A0 à A3 en sortie A4,A5,A7 en entrée A6 en sortie LLP

24 ' utilisation du registre PA : Pulse Accumulator
PACTL.5= ' PMOD =1 Mode Pulsetimer : mesure le temps A7 mis à 1 ' PMOD =0 Mode comptage d'impulsions ' (Ne pas confondre avec le timer) PACTL.4= ' PEDG =0 PACTL.6= ' PAEN Validation pour travailler en compteur/pulsetimer sur A7 TMSK2.4= ' PAII = 1 Validation interruption sur A7 TFLG2.4= ' PAIF =1 Flag Autorise nouvelle interruption sur A7 TMSK2.5= ' POVI =1 Validation Interruption overflow TFLG2.5= ' POVF =1 Flag autorise new int overflow ' Ne pas activer si mode pulsetimer sur A7 TMSK2.6= ' RTII=0 Inhibition du timer (arret timer) TFLG2.6= ' 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 = ' A0 en entrée TMSK1.0 = ' validation interruption Input Capture sur A0 TFLG1.0 = ' flag associé TCTL2 = ' Config pour mesure entre 2 fronts descendant ' Configuration pour Output Compare OC2 TMSK1.6 = ' validation interruption output capture sur A6 / Oc2 TFLG1.6 = ' Flag associé TCTL1.7 = ' Config fonctionnement sortie A6 page 115 doc motorola TCTL1.6 = ' 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 = ' Valeur de comparaison 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 = ' 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 LLP

26 ' INPUT CAPTURE : Mesure une période ' Régler oscillo sur 2ms/carreau
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 $ ' résultat de input capture sur PA2 . Int FFEE int TIC2 at $ ' résultat de input capture sur PA1 . Int FFEC int TIC3 at $ ' résultat de input capture sur PA0 . Int FFEA int TOC2 at $ ' 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 = % ' A0 A2 A3 A6 en sortie A1, A4,A5,A7 en entrée ' utilisation du registre PA : Pulse Accumulator PACTL.5= ' PMOD =1 Mode Pulsetimer : mesure le temps A7 mis à 1 ' PMOD =0 Mode comptage d'impulsions ' (Ne pas confondre avec le timer) PACTL.4= ' PEDG =0 PACTL.6= ' PAEN Validation pour travailler en compteur/pulsetimer sur A7 LLP

27 ' Configuration pour input capture sur A1:
TMSK2.4= ' PAII = 1 Validation interruption sur A7 TFLG2.4= ' PAIF =1 Flag Autorise nouvelle interruption sur A7 TMSK2.5= ' POVI =1 Validation Interruption overflow TFLG2.5= ' POVF =1 Flag autorise new int overflow ' Ne pas activer si mode pulsetimer sur A7 TMSK2.6= ' RTII=0 Inhibition du timer (arret timer) TFLG2.6= ' 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 = ' validation interruption output capture sur A6 TFLG1.6 = ' Flag associé TCTL1.7 = ' Config fonctionnement sortie A6 page 115 doc motorola TCTL1.6 = ' 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 = ' Valeur de comparaison ' Configuration pour input capture sur A1: ' Vérifier plus haut que A1 en entrée pour inputcapture IC2 TMSK1.1 = ' validation interruption Input Capture sur A1 TFLG1.1 = ' flag associé TCTL2 = % ' b3 b2 (pour IC2) ' : pas de déclenchement ' : mesure période ' : mesure période ' : 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

28 print "INPcapt=", resultat tempo(500) loop
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= ' Pour visualiser l'interruption for j=1 to ' 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 l’ancienne valeur de TIC2 pour connaître la largeur de l’impulsion (ou période) 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 ‘ 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 d’horloge Un front montant du /CS entraîne l’exécution du mot transféré . LLP

30 Do for j=0 to ' 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 = x 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 = Fin transfert, exécution. end function function max512(val) ' le nom val est mal choisi … attention à la confusion ! byte cnt for cnt = 0 to ' 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 LLP


Télécharger ppt "Algorithmique appliqué au traitement du signal"

Présentations similaires


Annonces Google