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
LLP 1
MICROCONTROLEUR 68HC11F1
Algorithmique appliqué au traitement du signal
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 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
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
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
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
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
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
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
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
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
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
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
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)
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)
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)
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
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
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
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
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
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
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
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
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
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)
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)
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é .
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