Les picaxes et leur basic 4
La mémoire RAM
On a vu dans le tableau de la page 1, la mémoire RAM d'un 20M2 comporte 512 octets.
Les 28 premiers octets (bytes) sont désignés par b0 à b27, utilisables directement par le programme pour les calculs, formules, etc...
Et les autres?
Plusieurs méthodes:
- L'adressage direct par peek et poke
La commande poke permet d'enregistrer un octet.
poke 1,12 emregistre la valeur 12 dans le byte n°1, ce qui est équivalent à b1=12
L'intérêt est de stocker temporairement des valeurs contenues dans les mémoires b0 à b27 pour les libérer et les rendre utilisables dans des calculs:
poke 30, b5 enregistre le contenu de b5 dans la mémoire 30
poke 30, b5, b6 enregistre b5 dans la mémoire 30 et b6 dans 31
Pour enregistrer des variables word, il faut écrire poke 30, word w13. w13 sera enregistré dans les mémoire 30 et 31
La commande peek opère l'opération inverse, et lit le contenu des variables RAM pour les réutiliser dans les variables b0 à b27
peek 30,b5 replace le contenu de la mémoire 30 dans la mémoire b5
- L'adressage indrect par "bptr" (byte pointer)
bptr est une fonction spéciale permettant de pointer une mémoire RAM nommée @bptr
bptr est un numéro de mémoire RAM et @bptr le contenu de cette mémoire.
Voici une application de l'adressage indirecte: la moyenne glissante.
A expérimenter sur le simulateur de PE6
Principe:
On définit un tableau de 10 valeurs dans la RAM
A chaque lecture, on incremente un compteur tournant sur 10 valeurs
Chaque nouvelle valeur lue remplace la valeur la plus ancienne
On fait la moyenne des 10 valeurs du tableau
#picaxe 20M2
symbol cpt=b1
symbol cpt2=b3
symbol lect=b2
symbol somme=w12
symbol moyenne=w13
serout C.0,N2400,(254,1) ;RAZ LCD
do
for cpt=30 to 39 ;boucle
readadc C.3,lect ;lecture valeur (ADC7)
bptr=cpt ;indexe tableau circulaire de 0 a 9)
@bptr=lect ;copie valeur lue dans tableau
somme=0 ;RAZ somme
for cpt2=30 to 39 ;compteur circulaire de 0 a 9
bptr=cpt2 ;indexe tableau
somme=somme+@bptr ;somme des valeurs tableau
next
moyenne=somme/10 ;moyenne
serout C.0,N2400,(254,128,#moyenne," ")
next
loop