Newsgroup: it.hobby.elettronica.digitale
Titolo: Uso del andlw con pic

Inanzitutto scusate la lunghezza del messaggio ma ho un problema in un
programma asm che ho scritto e che mi sta facendo dannare da giorni.
praticamente invio un dato ad un pic con comandi da fargli svolgere.
finchè si tratta della semplice ricezione tutto ok (già accuratamente
verificata).
i problemi mi sorgono nel momento in cui voglio spezzare il registro
ricezione (REG_RIC) in due registri distinti: nel primo (chiamiamolo REG1)
devo mettere i primi 4 bit e nel secondo (REG2) gli ultimi 4.
ho pensato di usare due maschere AND (0x0F e 0xF0) per isolare i singoli
bit e poi memorizzarli dei rispettivi registri. in seguito con l'uso di
uno XOR identifico che comando è e faccio partire le varie procedure.
Teoricamente la cosa funziona, ma quando lo faccio partire mi esegue cose
diverse....ora non riporto l'intero programma ma solo le sostanziali
modifiche che mi hanno dato da tribolare.
;definizione costanti
CCOMANDO1  equ  B'00010000'  ;è 16
;inizializzazione variabili
REG_RIC  res  1
REG1  res  1
REG2  res  1
movf	REG_RIC,W
andlw	0x0F
movwf	REG1
;ora in REG1 dovrei avere i primi quattro bit di REG_RIC
movf	REG_RIC,W
andlw	0xF0
movwf	REG2
;e in REG2 gli ultimi 4. potrei anche fare uno SWAP ma preferisco
;risparmiare memoria... ^_^
;Ora riporto una routine di controllo con XOR
comando1
  movlw   COMANDO1
  xorwf   ShiftReg,W
  btfss   STATUS,Z
  goto    _fincom1
  ;qui metto le azioni da compiere
  goto    MainLoop
_fincom1
Questa è la routine di ricezione di un numero compreso tra 16 e 31.
La mia idea è infatti che se arriva un byte tra B'0001 0000' e B'0001
1111' dovrebbe partire COMANDO1.
Penso che sia un errore banale, ma la propongo a voi che magari con occhio
più lucio ed esperto troverete :)
Vi ringrazio.
Enrico
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


 
--------------------------------
Inviato via 
http://usenet.libero.it

 Inviato via 
http://usenet.libero.it


Continua a non funzionare anche usando una maschera AND del tipo B'1110
0000' (che dovrebbe farlo partire da 16 a 31)...
il comando parte da 7 (B'0000 0111') fino al 17 (B'0001 0001') e dal 23
(B'0001 0111') al 33 (B'0010 0001')....non sono andato avanti, ma ho visto
che cmq parte anche in altri casi...dannazione...qualcuno ha dei
suggerimenti??
Enrico_b ha scritto:


   goto    _fincom1
quindi prima definisci CCOMANDO1, dopo usi per il controllo un registro
denominato COMANDO1, hai solo
fatto un errore di digitazione nella scrittura del post oppure è giusto?
Ciao
Pow
--
----------------------------------------------------
Ama il tuo mestiere con passione
E' il significato della tua vita
Auguste Rodin (1840-1917)

 Pow
No no... ^_^ è solo un errore di battitura...la mia tastiera ogni tanto
preme la C ccc :)
cmq grazie!


 ha scritto nel messaggio
news:b9ro0q$36r$1...@news.newsland.it...


 > > > piů lucio ed esperto troverete :)


Ho controllato il programma che hai precedentemente postato.Lo riporto qui
sotto per chiarezza.
;definizione costanti
CCOMANDO1 equ B'00010000' ;č 16
;inizializzazione variabili
REG_RIC res 1
REG1 res 1
REG2 res 1
movf REG_RIC,W
andlw 0x0F
movwf REG1
;ora in REG1 dovrei avere i primi quattro bit di REG_RIC
movf REG_RIC,W
andlw 0xF0
movwf REG2
;e in REG2 gli ultimi 4. potrei anche fare uno SWAP ma preferisco
;risparmiare memoria... ^_^
;Ora riporto una routine di controllo con XOR
comando1
  movlw COMANDO1
  xorwf ShiftReg,W <<<<<<<<<<<<<< shiftreg e' inizializzato ?
                                      il comando e' arrivato in REG_RIC,spezzato
                                      in REG1 e REG2, ma qui lo compari con 8 bit.
                                      xorwf REG_RIC,W forse e' quella giusta.
  btfss STATUS,Z <<<<<<<<<<<<<< questa istruzione testa il bit Z , il quale e'
                                      a 1 se il risultato dell'istruzione precedente
                                      e' uguale a 0.Quindi, a comando esatto ( 10H ),
                                      l'istruzione goto non verra' mai eseguita.
  goto _fincom1
  ;qui metto le azioni da compiere
  goto MainLoop
_fincom1
 
Visto la "semplicita'" della routine, simulala con MPLAB 6.20, guardando i
registri
ti accorgi subito dov'e' l'errore.
Comunque, se non e' cosi', invia la parte incriminata
Ciao
Ivano


 Inviato via 
http://usenet.libero.it


 _fincom1
Ho trovato!! finalmente...era proprio una svista...alla fine di ogni ciclo
di controllo lo rimandavo al main in attesa di un altro byte...cosě non mi
arrivava mai alla parte in cui si controllava l'altro registro REG2...ho
tribolato per giorni cercando una soluzione ad un problema
inesistente...il problema era altrove!
vabbč
cmq ringrazio per l'attenzione.
