Bonjour
Comment lire et écrire des données dans l'e²prom interne du 68hc11 en langage c, ou en utilisant les registres ?
merci
Thomas
-----
Bonjour
Comment lire et écrire des données dans l'e²prom interne du 68hc11 en langage c, ou en utilisant les registres ?
merci
Thomas
Bonjour.
L'implantation de l'EEPROM varie d' un type de HC11 à l' autre et il faut donc se reporter au datasheet correspondant.
Je connais très mal le langage C, mais le principe reste le même:
une adresse fait 16 bits; il faut donc la charger dans un tel registre, puis lire ce registre.
En assembleur, cela donne ceci, en supposant que tu veuille lire l' octet à l' adresse $CA32
A+Code:ldx #$CA32 ;charge l' adresse dans registre X ldaa 0,X ;charge le contenu à l' adresse ci-dessus dans registre A staa PORTC ;traitement dans le PortC (pour exemple)
Dernière modification par abracadabra75 ; 12/06/2007 à 17h33.
Il n'y a que dans le dictionnaire où 'réussite' vient avant 'travail'.
ok
donc en c ça donnerait qqc du genre :
ADRESSE_EEPROM = 0xCA32;
DONNEE = 0xED; //Pour écriture dans eeprom
ou x = DONNEE; //pour lecture
avec ADRESSE_EEPROM et DONNEE les registres d'adresses et de don,nées de l' eeprom
merci beaucoup
Bonjour.
Je ne comprends pas la deuxième ligne, mais comme je te l' ai dit, mes connaissances du C sont fort minces.
Cependant il me semble que tu fais des confusions terminologiques.
Les 'registres' sont des domaines du HC11. Par exemple, le registre A est à l' adresse $1000, le B à $1004.
Dans ton programme en C, il te faut des mots de 2 octets pour les loger à la bonne adresse.
Attention: tu ne peux pas écrire comme ça dans l'e²prom.
Celle-ci contenant le programme, est protégée en écriture.
Si on veut écrire dedans quand on est en phase d' exécution du programme, cest possible, mais il faut positionner le registre OPTION dans les 64 premiers cycles d' eécution et avoir une routine logée en RAM.
Il faut la loger en RAM, car lorsqu' on veut écrire dans l' E²PROM, à ce moment la lecture y est interdite, et donc on ne peut exécuter le programme.
Par contre si tu utilises un HC11F1 avec le programme dans une mémoire externe, là ça devient possible d' avoir la routine en mémoire externe.
J' espère avoir un peu éclairé ta lanterne.
A+
Il n'y a que dans le dictionnaire où 'réussite' vient avant 'travail'.
merci
cela est un peu complquiué, et je pense que je vais opter pour une eeprom i²c (en + j'aurais plus de mémoire )
pour l'eeprom, c'est bon maintenant, j'ai donc trouvé une solution, qui me semble un peu moins compliquée.
Je ne voudrais pas ouvrir une nouvelle discussion ,alors je te pose une question qui n'a rien à voir ici :
toi qui m'as l'air de bien savoir développer en ASM (moi je n'y connais STRICTEMENT rien à l'ASM), connais tu une routine qui permet d'attendre x cycles (le microprocesseur se "pause" duran,t x cycles) ?
et les autres, copmment intégrer une ligne ASM dans du code c ? asm( ); ?
Pour lire l' eeprom, passer par de l' I²c qui n'est pas géré par le HC11 est sûrement plus compliqué que d ' écrire les 3 instructions de lecture.
Pour l' écriture, je ne suis jamais passé par I²C, donc je ne peux te répondre. Et d' ailleurs, as tu assez d' espace disponible dans ton HC11?
Il me semble que pour inclure de l' asm dans du C, il existe une pseudo-instruction telle que , tout simplement 'asm', ou 'include asm', mettre le code, puis quelquechose comme 'endasm'.
Pour introduire une attente définie, il faut soit compter les cycles d'exécution, soit utiliser le compteur du timer. Les 2 techniques sont aussi valables l' une que l' autre, la première étant cependant plus précise et commode pour les temps très courts (< 1 ms).
Pour les plus longs, j' ai écrit une oucle d' attente, mais.... en assembleur.
A+
Il n'y a que dans le dictionnaire où 'réussite' vient avant 'travail'.
mes délais sont de l'ordre de 10µs à une dizaine de secondes !!
sinon pour l'eeprom, oui je pense avoir assez de place, puisque 100 octets devraient me suffire.
voili voilou
ba tu peux toujours me donner ton instruction asm pour compter les cycles, j'essairait de l'inclure dans du c
Je te mets en pj le code du sous-programme; le minimum mesurable est 100µs, le maximum 1 seconde, avec une erreur constante de 7 µs quelque soit le temps demandé.
On peut étendre à 25 µs et monter à 1,5 s en rajoutant 3 ou 4 lignes.
L' appel se fait comme tout sous-programme (call? gosub?), par exemple
Il est sûrement possible de diminuer l' erreur des 7 µs en se creusant un peu la tête.Code:call tempo_0.1s
Pour 10 secondes? Ben, on exécute 10 fois 1 seconde!
A+
Il n'y a que dans le dictionnaire où 'réussite' vient avant 'travail'.
merci