Programmation d'un timer avec un microprocesseur ADuC812 en C

Résolu
sissi2005 Messages postés 5 Date d'inscription mercredi 16 mars 2005 Statut Membre Dernière intervention 6 avril 2005 - 16 mars 2005 à 09:15
cleter Messages postés 92 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 15 mai 2006 - 7 avril 2005 à 18:50
bonjour,

je dois realiser une rampe de tension allant de 0 a 5V en utilisant le DAC 12 bits du microprocesseur ADuC812. il possede 3 registres : un avec les 8 bits de point fort, un avec les 8 bits de point faible ou est stockee la valeur numerique qui sera convertie et le dernier le registre de controle pour le DAC. Pour le timer il y en a 2 : le registre de commande et le registre de donnee.

Je suis loin de maitriser le C et on m'impose de l'utiliser. Je ne sais pas comment realiser ce programme en C gerant le timer? j'ai bien regarde les programme deja propose mais je n'y ai rien compris! Cette rampe doit mettre 40s pour passer de 0 a 5V. Il y a donc $1000 valeurs (4096 valeurs) à répartir sur 40 s, soit un changement tous les 9.76 ms. Quelau'un peut m'aider?

merci d'avance

Sylvie

9 réponses

sissi2005 Messages postés 5 Date d'inscription mercredi 16 mars 2005 Statut Membre Dernière intervention 6 avril 2005
6 avril 2005 à 16:34
salut,

j'ai essaye l'affectation des deux registres en un ca ne marche pas. Sinon je m'en suis sortie avec mon timer. ca marche.
A+
3
cleter Messages postés 92 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 15 mai 2006
17 mars 2005 à 11:51
heu la, c'est tres spécifique, et les timer que tu doi utilisé son ceux de ton proc, et non pas ceux de windows ou linux!!



je connai pas ce proc la, mais je suppose qu'il n'y a pas d'os qui tourne dessus.



Pour programmé ton timer, tu doi deja te munir de la doc de ton proc,
regardé comment lancer les timers (quel son les registre a modifer
etc...). Et en suite, dans ton programme en C tu modifie les registre
qui von bien pr lancé, arreter ton timer.



Je ne connai pas ce proc, et ca fai longtps que j'ai pas fai du si bas
niveau (jai la mémoir qui flanche) mai je pense que c'est la démarche a
suivre. Si tu arrive a le faire en assembleur, c pas plus dur en C.
0
sissi2005 Messages postés 5 Date d'inscription mercredi 16 mars 2005 Statut Membre Dernière intervention 6 avril 2005
17 mars 2005 à 16:39
bonjour,

En gros le timer a deux registres de 8 bits:
TMOD et TCON qui controlent les timers 0 et 1 du uP.
TCON:
bit7 :TF1 qui est un flag qui signal un depassement de la valeur pour le timer 1
bit6 :TR1 qui permet d'eteindre ou de lancer le timer 1
bit5,bit4 : c'est les meme qu'au dessus mais pour le timer 0
bit3 : IE1 interruption externe sur la pin INT1 (pour moi ca ne sert a rien je pense)
bit2 : IT1 interruption externe mais je n'ai pas bien compris ce qu'elle faisait.
c'est dit : external interrupt Trigger type
set or cleared by software to specify edge-sensitive detection. tu comprends ce que ca fait??
TMOD est constitue
bit1,bit0 : c'est les meme qu'au dessus mais pour le timer 0

pour TMOD :
bit7 : gate Si c'est a 0 on ne declenche le compteur que lorsqu'il a une interruption sur INT1 donc detecte par le bit 3 de TCON1 et que TR1=1 (donc que le timer est lance)
si c'est a 1 le timer se met en route des que TR1=1 (donc je le mettrai a 1)
bit6 : C/T permet de choisir si on veut utiliser le timer (0) ou le compteur (1) (donc je met 0)

bit5 et 4 : la ca se complique un peu. Il gere les registres TH1 et TL1 ou sont stockees les donnees du timer.
si bit5=bit4=0 alors on a 8 bits pour le timer et 5 bits appele prescaler qui doit surement donner une valeur approchee.
si bit5=0 bit4=1 alors on a 16 bit de donnee pour le timer
si bit5=1 bit4=0 alors on a 8 bit qui se recharge automatiquement. on charge dans TH1 une valeur qui est automatiquement recharge dans TL1 quand il y a un debordement
bit5=bit4=1 alors on arrete le timer.

Je pense qu'il faut choisir bit5=0 et bit4=1 mais je n'en sais rien.

bit3, bit2, bit1, bit 0 on a la meme chose pour le timer0
D'apres mois il faut mettre 0001XXXX pour TMOD et 01000000 pour TCON

donc d'apres toi je cree une procedure qui met la valeur que je souhaite dans les registres TH1 et TL1 apres je valide le bit6 :TR1 du registre TCON qui lance le timer et j'attends le depassement en scutant le bit7 :TF1 du registre TCON. lorsqu'il est passe a 1 ,j'arrete le timer et je remet a 0 le TF1 et je sors de la procedure. t'es d'accord?

j'ai une autre question toute simple pour toi. pour declarer une variable 8 bits en C on met Byte et pour 16 bits c'est quoi ? int?

merci de m'avoir guider je compte encore su toi!!!

Sylvie
0
cleter Messages postés 92 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 15 mai 2006
17 mars 2005 à 19:23
Heu bah ca ressemble bcp au 8051 ca :D



Heu, pr ton 16bits je dirai surtou pa int (car la taille du int depen
des compilateur) mais plutot WORD (si ca existe) sinon, je tavou ke
j'en c rien, mais ton proc, c'est un proc 16bits?



Par contre pour savoir quand ton timer a fini, je serai toi j'utiliserai les interruptions

c'est plus propre, et plus simple (kan on a compri commen ca fonctionne) mais je sais pas si tu les a vu.



c pour un projet d'ecole?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sissi2005 Messages postés 5 Date d'inscription mercredi 16 mars 2005 Statut Membre Dernière intervention 6 avril 2005
18 mars 2005 à 12:01
bonjour,

Oui c'est un projet d'ecole. Ce projet me permettra en autre de valider mon diplome. Pour ma part, je fais plutot de l'electronique et la programmation je n'en ai pas fait bcp et encore moi en C donc c'est pas facile.

J'ai vu les interruptions mais il y a longtemps. Je sais qu'il faut valider les interruptions generales a l'aide d'un registre et apres l'interruption liee au timer. Il me semble aussi qu'il faut indiquer l'adresse du vecteur d'interruption dans certain cas et sauver toous les registres avant de renter dans l'interruption. C'est ca?
je ne sais pas si c'est vraiment utile d'utiliser les interruptions car dans mon cas, tant que je n'ai pas atteins le temps voullu je ne peux rien faire. donc une scrutation suffit tu ne crois pas?

Mon proc est un proc 8 bits mais je me demandais s'il n'etait pas possible de declarer une variable sur 16 bits et de la mettre par exemple dans une autre variable 16bits correspondant a TH1+TL1 (tous deux sur 8bits), etant donnee les adresses de ces deux registres se suivent. Comme ca au lieu d'adresser en deux fois je le fait une fois et automatiquement les deux registres sont configues. Je ne peux pas?
0
cleter Messages postés 92 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 15 mai 2006
18 mars 2005 à 16:10
slt,

bein, moi aussi je sui plutot electronique, et la programmation, on y echappe pas (surtout si on est branché info-indus).

Et pour ce qui est des interruptions, oui il me semble que tu as
raison. Mais meme si tu ne peux rien faire, c'est quand meme plus
propre. Et puis si a un moment donné tu te décides d'afficher des infos
sur un ptit afficheur, ou autres chose ds le genre, tu verras qu'avec
les interruptions ca genera pas. Alors qu'avec les scrutations ca va
etre plus tendu pour faire des modifs.

En plus, si tu es noté sur ce projet, les prof appréciront bcp si tu
utilises les interruption (enfin je pense, du moin c'est le cas ds mon
ecole). maintenant c'est toi qui voi, mais si tu la deja vu, je pense
pas que ca soit bcp plus dur pour toi de les utiliser, surtout que tu a
l'air d'avoir compris le fonctionnement. Et si tu veux un peu plus
d'aide sur ce point la, je veux bien faire un effort. (histoire de voir
si je suis encore capable de le faire ).

Pour ce qui est de ta variable 16bits, je tique un peu, perso je
prendrai pas le risque, car a la compilation, je sais pas trop comment
il va te pondre ca. Peu etre que ca marche, mais je prendrai pas le
risque, en plus tu modifira pas les 2 registre (TH1 et TL1) en mm tps,
donc autant les modifier indépendement. Mais bon pour ca, c'est a toi
de tester. Et tient moi au courant, j'aimerai bien savoir ce que ca
donne.



Et puis, juste par curiosité, c'est quoi le but du projet? et c'est quoi le diplome que tu prépare?
0
sissi2005 Messages postés 5 Date d'inscription mercredi 16 mars 2005 Statut Membre Dernière intervention 6 avril 2005
18 mars 2005 à 16:38
salut,

je suis en ecole d'ingenieur. Je prepare un diplome de physique appliquee et instrumentation. Donc il y a un peu de programmation (vraiment un tout petit peu), beaucoup de physique theorique, pas mal d'electronique, de capteur mais aussi tout ce qui est programmation Labview.

Je suis daccord avec toi sur les interruptions mais comment je stoppe mon prog pendant le temps que mon timer tout. Il y a moyen en C de faire ca?
Pour les profs je ne suis pas sur qu'il y verra quelque chose. Il y connait rien en programmation. Il me suit surtout sur labview. C'est mon tuteur de stage peut etre qui apprecira et encore. Si j'ai un pbs avec le timer je te demenderai sans soucis.

En fait pour la variable 16 bits, c'etait un de mes prof qui nous avait dis ca mais je n'ai jamais essaye.

Pour mon projet je dois tester un cable qui peut mesurer jusqu'a 800m de long. Il y a deux coax et deux paires torsade. Pour les paires torsade je dois tester sur l'une le conductivite et sur l'autre ellle me servira de bus de dialogue entre mon uP et de l'autre cote Labview. Pour les coax, sur l'un je dois generer une tension 0 a -1250V et sur l'autre un courant de qq fA soit pas bcp.

voila en gros.
A+
0
cleter Messages postés 92 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 15 mai 2006
18 mars 2005 à 17:20
Heu bein ca me parle pas des masse ton projet! lol, mais bon, si ca sert a quelque chose tant mieu.

Et heu, pour les interruptions,

quand tu autorise les interruptions, ton programme principal doit
contenir une boucle infini qui fait ce quel a besoin, et quan une
interruption intervien, ca va voir dans le vecteur d'interruption quel
est la fonction a appler, et hop ca lance cette fonction (elle doit
etre la plus courte possible, enfin c'est préférable) pdt que cette
fonction est en route, ton programme principal est arreté. Il reprendra
la ou il s'est arrété des que la fonction d'interruption ce sera fini.

En général on essaye de faire ces fonctions d'interruption en
assembleur afin que ce soit vraiment le plus cour possible). mais dans
ton cas, tu devra surtout vérifier que le tps d'execution de ta
fonction soi plus courte que celui de ton timer.
0
cleter Messages postés 92 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 15 mai 2006
7 avril 2005 à 18:50
Félicitation :D
0
Rejoignez-nous