Mémoire EEprom

Emile

Senior Member
Bonjour à tous,

Je viens de m'initier aux PICAXE et j'y prends gout !

Je souhaite apprendre à utiliser la fonction d'écriture dans l'EEPROM du PIC , afin que des données soient conservées après une panne de courant ou une mise hors tension du PICAXE.

J'ai lu dans le manuel les fonctions EEPROM et WRITE mais je voulais savoir si il s'agit de 2 fonctions complémentaires ou de 2 fonctions bien distinctes.

Imaginons que je veuille faire clignoter des leds en fonction du nombre d'extinctions / d'allumage du pic.

Exemple :

J'allume le pic , celui-ci lit dans son programme il voit que c'est la premiere fois qu'il s'allume donc il fait clignoter 1 fois la led.
Il enregistre sont état " 1 " par exemple pour une fois.
Le pic s'éteint.

On le rallume , il va donc voir dans sa mémoire et voit 1 il rajoute n +1 mémorise et fait clignoter la led 1 + 1 = 2 fois et s'éteint.

Evidemment ce scénario ne sert à rien mais il me permettrait de comprendre le principe de fonctionnement des fonctions lecture écriture.

Si quelqu'un peut m'expliquer j'en serais ravi :)

Meme chose je ne comprends pas à quoi correspond B0 B1 etc... ca ne me parle pas.

Exemple tiré de la notice :


main:
for b0 = 0 to 63 ‘ Démarre une boucle
serin 6,T2400,b1 ‘ recoit des données du port série (RS232)
write b0,b1 ‘ Ecrit la valeur B1 dans B0
next b0 ‘ next loop


Les histoires de Bo B1 c'est du chinois , je pense que j'ai une grosse lacune dans la compréhension de qui est qui ou quoi comment dans le PIC

une fois cela compris je pense que tout ira mieux , à condition qu'une ame charitable m'explique !!

Merci à vous ;)

Emile :)
 

westaust55

Moderator
La commande d'EEPROM est une directive de programmation de rédacteur pour stocker quelques valeurs dans la mémoire d'EEPROM seulement lorsque le programme est téléchargé dans le morceau de PICAXE. VWRITE peut stocker de nouvelles valeurs dans la mémoire d'EEPROM quand le programme fonctionne réellement.


bit0, bit1, etc. sont des variables de 1 bit qui peuvent seulement avoir des valeurs de 0 ou de 1.
b0, b1 et d'autres sont des variables (à 8 bits) de byte qui peuvent avoir une forme de valeur 0 255.
w0, w1, etc sont des variables de mot qui (de 16 bits) peuvent avoir une forme de valeur 0 65535.

For some concept of the overlay of these variables, refer to: http://www.picaxeforum.co.uk/showthread.php?t=11514
 

westaust55

Moderator
Emile,

Also a copy of the response to the PM you sent to me as it may also be of interest to others:

When any micro controller is first powered up or reset, all pins are initially set as inputs so if a connected circuit is driven by the PICAXE chip it may be floating until the internal program has time to make the pin an output and set it to a low state. Finally the program you write can then set the output high or low but that may be a millisecond or two after the PICAXE (or any other microcontroller)is energized or reset.
This can be a problem with a critical circuit such as medical, automotive or explosive devices, etc. Where the pin is effectively floating as an input and may take on any voltage for that brief start-up period.
One way to help prevent this is to use, for example, a pull-down resistor for each output so that the circuit is held in a low state until the PICAXE chip gains full control of the circuit.

I have found this piece of code on the forum.

Can you explain me this ?
See the comments at the right of each line of program code.

Code:
#Picaxe 14M		; here we define the PICAXE type as the 14M

Eeprom 0,(0)		; this puts the value 9 (zero) into EEPROM location 0 when the program is downloaded – it is a programmer directive not a program command

Read 0, bit0		; Read from EEPROM location 0 into bit variable bit0
  			; This would be better to have read 0, b0
outpin0 = bit0	; put the value from the bit variable bit0 into the 14M output 0 pin
Do			; set up  a looping structure
If pin0 = 1 Then	; check if the input 0 pin is at a high (1) state/level
   bit0 = not bit0	; if input 0 is high (1) then we do the next commands –
 			;first invert the value of bit0 so 0 == > 1 and 1 == > 0
   outpin0 = bit0	; output the new value of bit0 on 14M pin output 0
   Write 0, bit0	; write the bit variable bit0 value back to EEPROM location 0
   			; actually we only write bytes which are 8 bits so in fact we
  			; are writing byte b0 to EEPROM. Would be better to have 
  			; the program line as write 0, b0

   Pause 10		; just wait for 10 milliseconds
   Do : 				; now we wait
   Loop Until pin0 <> 1	; until input pin 0 is low (0). Can use Loop until pin0 = 0
End If 			; end of the IF block
Loop			; loop back to the first DO command forever
 

Emile

Senior Member
Merci pour ta réponse très complète je vais regarder cela de près !

Une autre question ; j'ai mis dans le pic un programme de base qui fait clignoter 3 leds sur les sorties 0 1 2 toutes les 10 ms.

Cela fonctionne mais il faut attendre plusieurs secondes avant que le PICAXE execute le programme après sa mise sous tension ; voici le programme :

main:
label_10: high 0
pause 10
low 0
pause 10
high 1
pause 10
low 1
pause 10
high 2
pause 10
low 2
goto label_10


Je pensais que le programme s'éxecutait de suite à la mise sous tension non ? Est ce une erreur de programmation ?
Comment faire pour que l'allumage se fasse à la mise sous tension et cela sans délais ?

Merci beaucoup

Emile
 

westaust55

Moderator
Si j'interprète correctement, vous avez besoin du retard de quelques secionds avant la boucle pour clignoter le LED' ; comemnces de s. Les lignes supplémentaires au début feront cela pour vous.

Code:
Initialise:
Pause 3000	[COLOR="Red"]; this line will wait 3,000 ms (=3 seconds) before the main program loop commences[/COLOR]

main:

label_10: high 0
pause 10
low 0
pause 10
high 1
pause 10
low 1
pause 10
high 2
pause 10
low 2
goto label_10 
[code]

Le PICAXE commencera toujours à exécuter le programme précédemment installé immédiatement à moins que la goupille de SERIALIN soit haute pour indiquer qu'un nouveau programme doit être téléchargé.
 
Last edited:

Emile

Senior Member
Salut !

Une question à propos de cette phrase :

actually we only write bytes which are 8 bits so in fact we
; are writing byte b0 to EEPROM. Would be better to have
; the program line as write 0, b0


Je ne comprends pas ce que tu essayes d'expliquer.

Quelle difference entre Bit et B ?

Bit est suffisant pour seulement 0 ou 1 ? et B permet d'aller jusqua 255 ?

Autre question entre la fonction Eeprom et Write , si j'ai bien compris la fonction Eeeprom permet d'écrire lors du lancement du programme (telechargement) et la fonction Write elle , permet d'ecrire lors de la lecture du programme ?

Mais comment savons nous quand utiliser Eeprom plutot que Write ?
Je veux pouvoir mémoriser un état après l'extinction du PIC (coupure de l'alimentation).

merci.

Emile
 
Last edited:

westaust55

Moderator
Oui,
un peu est l'élément le plus fondamental des données et peut seulement avoir les valeurs 0 et 1.
un byte se compose de 8 bits. Chaque peu peut être un 0 ou 1 et là sont 256 combinaisons possibles de 0 à 255.

Si vous regardez mon diagramme ici, la partie gauche supérieure peut vous aider à comprendre le peu de PICAXE, byte et à exprimer l'arranagement variable:
http://www.picaxeforum.co.uk/showthread.php?t=11514

Le PICAXE peut seulement écrire bytes entiers/entiers ainsi écrivant un peu écrira un 0 ou 1 à l'endroit d'EEPROM mais il n'importe pas qui vous a mordu écrit à l'EEPROm que le résultat est chaque byte d'EEPROM néanmoins aura seulement une valeur d'un 0 ou d'un 1.

La commande EEPROM charge seulement des données dans la mémoire d'EEPROM une fois quand le programme est téléchargé dans l'EEPROM, pas chaque fois que le PICAXE active.
Vous pouvez employer la commande WRITE tandis que le programme fonctionne pour sauver une valeur à EEPROM Cette valeur sera toujours là la prochaine fois que le PICAXE active de nouveau. Au retireve la valeur, vous employez la commande de READ.
 

CrashDrives

New Member
salut Emile,

les b0 à b55 sont des variables qui peuvent contenir une lettre ou un nombre compris entre 0 et 255.

il y a aussi les wordvariables (w1, w2, ...) qui peuvent contenir (comme l'a dit westaust55)une donnée de 0 à 6553

pour ton prog, j'ai fais une esquisse mais je ne sais pas si il fonctionne, je l'essaierais plus tard

le voici :
Code:
read 1,b1        'lit la valeur dans l'eeprom à l'emplacement 1 dans la variable b1
inc b1           'incrémente b1
write 1,b1       'enregistre l'incrémentation dans l'eeprom au même emplacement
for b2 = 0 to b1 'commence le cycle du clignotement de la led en fonction de b1
high b.0         'la sortie b.0 mis à l'état haut
pause 500        'pause de 500 ms
low b.0          'la sortie b.0 mis à l'état bas
pause 500        'pause de 500 ms
next b2          'une fois que b2=b1 le programme s'arrête
 

Emile

Senior Member
Bonjour une question bete :

Quelle différence entre :

write b0,b1


et


write 0,b1

Merci :)

Emile
 

westaust55

Moderator
A fixed value is stated directly. For example 0, 1, 2

A system defined variable will have the prefix:
bit – (examples bit0, bit7) = smallest storage element can have values of 0 and 1 only
b – (examples b0, b1, b5, b12) = a byte has 8 bits and can hold values 0 to 255
w – (examples w4, w5, w6) = a word variable which has 16 bits / 2bytes and can hold values 0 to 65535.

So, to use write 0, b1
The 0 is a fixed and unchanging value, or in this case an EEPROM memory location and the value in variable b1 is always saved to location zero (0)
Whereas, write b0, b1
Will save the value from variable b1 into the location whose address is equal to the value of variable b0.
For example, if b0 = 5, then write b0, b1 will save the value from b1 into EEPROM location 5.
 
Top