Newsgroup: it.hobby.elettronica.digitale
Titolo: PIC Ciclo di conteggio

Ciao a tutti,
sono alle prime armi con i pic, e mi sono sorti diversi problemi. Ne
presento uno.
Devo fare un ciclo in cui ho 8 bit memorizzati nel registo W, e devo
confrontare ciascun bit per sapere quali valgono 1 e quali valgono 0.
Ho creato una variabile contatore COUNTER, inizializzata a 7, che secondo i
miei piani, deve contenere la posizione del bit attuale che si sta
esaminando. In pratica, ad ogni ciclo faccio un confronto con il bit di
posizione "counter" contenuto in W, e decremento via via COUNTER in modo da
confrontare i bit da quello in posizione 7 a quello in posizione zero.
Inizializzo COUNTER così:
movlw 7         ; inizializzo contatore bit a 7
 movwf COUNTER ;
mentre il ciclo è questo:
(exit è inizialmente 0)
Ciclo
  btfsc Exit, 0   ; Se exit = 1 finisco il ciclo
  goto CicloEnd  ;
  btfsc W,COUNTER         ; Se il bit i (counter) di W è a zero salta
  Call SendHighBit ; se è 1 spedisci uno
  btfss W, COUNTER ; Se il bit i di W è a 1 salta
  call SendLowBit  ; se è 0 spedisci zero
  decfsz COUNTER, 1  ; dec counter, se è zero imposta EXIT ;
  goto ciclo
  bsf eXIT,0  ; Se i è a 0, exit = true
  goto ciclo
Sulle linee in cui faccio :  btfsc W,COUNTER  ottengo questo warnings:
Warning: Argument out of range.  Least significant bits used.
Cosa significa? Come posso confrontare bit a bit un byte con un ciclo del
genere?
Grazie per ogni suggerimento,
Nick

Ciao! il problema č che non puoi utilizzare il contatore in questo modo, il
compilatore non lo accetta, puoi scirvere btfsc w,contatore solo se
contatore č un numero dichiarato con equ e quindi una costante. Per testare
i bit con un ciclo devi usare i comandi rrf o rlf, in modo da testare sempre
la stessa posizione all'interno del byte e facendo scorrere i bit di una
posizione alla volta.
esempio
ciclo
            btfsc    ciao,0
            rrf        ciao,f
            decsfz contatore,f
            goto    ciclo

 confrontare i bit da quello in posizione 7 a quello in posizione zero.
Non puoi usare un contatore...
Devi testare il bit 0 poi shifti il byte di un bit a sinistra e cosi' 
via per otto volte.
ciao
S

Ringrazio tutti. Il ciclo č risolto ma ho altri problemi... posterň ancora
vista la vostra gentilezza ;-)
Nick
"Nick" <roger...@liberoNOSPAM.it> ha scritto nel messaggio
news:9JCRa.47601$it4.1...@news1.tin.it...

Il giorno Thu, 17 Jul 2003 19:23:49 GMT, "Nick" <roger...@liberoNOSPAM.it>
ha scritto:
Per quanto riguarda l'uso dell'istruzione btfsc/btfss gli altri ti hanno già
risposto.
All'uscita da SendHighBit viene eseguito il test sul valore 1 del bit, che
invece dovrebbe essere evitato, in quanto il programma ha già verificato che il
bit è pari a 0.
Il contatore va inizializzato ad 8, altrimenti ti testa solo 7 bit.
C'è inoltre qualche "goto" di troppo.
Un miglioramento del ciclo potrebbe essere:
Inizializzo COUNTER così:
movlw 8         ; inizializzo contatore bit a 8
movwf COUNTER ;
[...]
movwf dato
Ciclo
  btfsc dato,0         ; Se il bit i (counter) di W è a zero salta
  goto Bit1
  call SendLowBit  ; se è 0 spedisci zero
  goto Cont_ciclo
Bit1
  call SendHighBit ; se è 1 spedisci uno
Cont_ciclo
  rrf dato,1
  decfsz COUNTER, 1  ; dec counter, se è zero esci dal ciclo ed imposta EXIT
  goto ciclo
  bsf eXIT,0  ; Se i è a 0, exit = true
Ora il dato da testare non è più in W ma nella variabile "dato".