|
|||||||
| Arcade | Registrazione | Blogs | Regolamento | Feedback | FAQ | Lista Utenti | Calendario | Segna come Letti |
| Ultimi 5 blog pubblicati su PcTuner Blog | ||
|
||
![]() |
|
|
Strumenti Discussione | Modalità Visualizzazione |
|
|
#1 |
|
Registered User
|
lettura eeprom interna ed assegnazione su variabili
Mi sta fumando la capoccia.
Devo leggere le prime 5 locazione della eepr interna (da 0x00 fino a 0x04) ed assegnare ogni lettura ad una variabile. Alla prima variabile a cui dovrà essere assegnata la prima locazione eepr (0x00) alla seconda variabile la seconda locazione (0x01) e così via. La prima variabile è in posizione 0x20 (è un pic 16F870). Sto tentando con un loop ma mi si intreccia tutto. Please.... Ciauuuuuz |
|
|
|
|
|
#2 |
|
Registered User
|
Sembra che i vostri sorgenti siano dei segreti di stato.
__________________Perché per aiutarvi se non si sa cosa state facendo si possono fare solo delle congetture. In questo caso io userei l'indirizzamento indiretto.
Camillo
Il VeroProgrammatore può contare fino a 1024 con le dita delle mani. Grazie a .mau. Le donne e i gatti fanno quello che vogliono, gli uomini e i cani dovrebbero rilassarsi e abituarsi all'idea. R.A.Heinlein |
|
|
|
|
|
#3 |
|
Registered User
|
Il sorgente non l'ho messo perchè non riuscivo a scriverlo.....
Ora l'ho fatto ma ho timore. Sicuramente non riesco a ragionarla semplice, certo quello che ho scritto si potra fare con un quarto di istruzioni..... eccolo sono le due routine che ho impostato. una di questa chiama alla routine di lettura eepr che funzia bene. Le variabili a cui dovranno essere assegnati i valori lettisono sec_int_ingr1_Dr sec_int_ingr2_Dr sec_verde_Dr sec_int_ingr2_Dv sec_rosso_Dv Codice:
;**********************************************************************
; Lett_Assegn_Tempi Routine di Assegnazione tempi
; legge tutti i tempi, di entrambe i dissuasori dalla eeprom
; e li assegna alle variabili chiamando la routine Assegna (sotto)
;**********************************************************************
Lett_Assegn_Tempi
movlw 0x00
movwf cont_lett_eepr ;azzero la variabile cont_lett_eepr
Loop_Lett_Assegn_Tempi
movf cont_lett_eepr,W ;W = cont_lett_eepr
movwf EEADR ;EEADR = W = cont_lett_eepr
call Leggi_Eepr
call Assegna
incf cont_lett_eepr ;Incrementa il contatore
movlw 00000101B ;controlla se è arrivato a 5
xorwf cont_lett_eepr,W
btfsc STATUS,Z
goto Loop_Lett_Assegn_Tempi ;se no continua il loop
return ;altrimenti ritorna
;-----------------------------------------------------------------------
;**********************************************************************
; Assegna Routine di Assegnazione tempo alla corrispondente varialbile
; Viene chiamata dalla routine Lett_Assegn_Tempi ad ogni lettura di eepr
; e li assegna alle variabili
;**********************************************************************
Assegna
movwf appoggio
movlw 00000000B
xorwf cont_lett_eepr,W
btfsc STATUS,Z
goto Ins0
movlw 00000001B
xorwf cont_lett_eepr,W
btfsc STATUS,Z
goto Ins1
movlw 00000010B
xorwf cont_lett_eepr,W
btfsc STATUS,Z
goto Ins2
movlw 00000011B
xorwf cont_lett_eepr,W
btfsc STATUS,Z
goto Ins3
movlw 00000100B
xorwf cont_lett_eepr,W
btfsc STATUS,Z
goto Ins4
Ins0
movf appoggio,W
movwf sec_int_ingr1_Dr
return
Ins1
movf appoggio,W
movwf sec_int_ingr2_Dr
return
Ins2
movf appoggio,W
movwf sec_verde_Dr
return
Ins3
movf appoggio,W
movwf sec_int_ingr2_Dv
return
Ins4
movf appoggio,W
movwf sec_rosso_Dv
return
;-----------------------------------------------------------------------
|
|
|
|
|
|
#4 |
|
Registered User
|
questa è tua.........
Ho fatto una ricerchina sul forum.
Questa è una routine che tu mi passasti un pò di tempo fa. Credo faccia al mio caso. Potresti spiegarmi cosa significa "Mette i dati letti in HL (FSR) e seguenti." Che cos'è FSR? Inoltre quell' _HL_ signignificano qualcosa i due trattini bassi. Codice:
;********************************************************************* ; LEGGE dei byte consecutivi da EEPROM interna. ; Mette i dati letti in HL (FSR) e seguenti. ; L'indirizzo di partenza Š in addrEE che si incrementa. Read6EE: movlw 6 movwf cntbyte ;Quanti byte deve leggere. readloop: movfw addrEE call ReadEE movwf _HL_ incf addrEE,F incf HL,F decfsz cntbyte,F goto readloop return |
|
|
|
|
|
#5 |
|
Registered User
|
Dunque.....
HL credo lo debbo considerare come la mia prima variabile (sec_int_ingr1_Dr (vedi mio codice sopra)) cntbyte dovrebbe essere simile al mio contatore cont_lett_eepr (vedi mio codice sopra). Sbaglio? Insomma quello che io non ho fatto con un mucchio di istruzioni si può fare con poche righe.............. ... anche per questo ho timore a postare i sorgenti Vabbuòòòò Ultima Modifica di superciuck : 04-04-2006 16.43.47. |
|
|
|
|
|
#6 |
|
Registered User
|
Ad una prima visione sembra tutto a posto.
__________________Non ti ritrovi i dati che speravi o ti si pianta. Sicuro che i dati siano scritti bene sulla EEPROM? Hai provato a simularlo o a emularlo. A questo punto è arrivata un'altro post mentre stavo rispondendo al primo. HL e _HL_ sono una mia mania perché fino a una decina di anni fa programmavo in Z80 dove il registro a 16BIT HL è utilizzato prevalentemente con uso di puntatore alla memoria. Attualmente devi fare così: Codice:
#define HL FSR #define _HL_ INDF FSR per il PIC è il puntatore alla memoria per l'uso indiretto. Per cui devi inizializzare HL con la prima locazione in cui vuoi scrivere: Codice:
movlw sec_int_ingr1_Dr ;Primo indirizzo della RAM. movwf HL ;Carica l'indirizzo indiretto. A quest'altro punto è giunto un'ulteriore post. Quanto scrivi in quest'ultimo è corretto. Poi. Qualunque algoritmo può essere scritto in migliaia di modi diversi, e non bisogna assolutamente vergognarsi, la scrittura è fatta in funzione della propria istruzione ed esperienza, le ottimizzazioni possono essere fatte in un secondo tempo. Quello che è importante è la voglia di imparare e di conseguenza fare le cose.
Camillo
Il VeroProgrammatore può contare fino a 1024 con le dita delle mani. Grazie a .mau. Le donne e i gatti fanno quello che vogliono, gli uomini e i cani dovrebbero rilassarsi e abituarsi all'idea. R.A.Heinlein |
|
|
|
|
|
#7 |
|
Registered User
|
allora.... ho corretto così ma sembra non funzicare
Codice:
;********************************************************************* ; LEGGE dei byte consecutivi da EEPROM interna. ; Mette i dati letti in HL (FSR) e seguenti. ; L'indirizzo di partenza Š in addrEE che si incrementa. Lett_Assgn_Tempi movlw 5 movwf cont_lett_eepr ;Quanti byte deve leggere. movlw 0 movwf addrEE ;locazione iniziale. readloop: movfw addrEE BANCO_2 ;Seleziona il banco di registri 2 movwf EEADR call Leggi_Eepr movwf sec_int_ingr1_Dr incf addrEE,F incf sec_int_ingr1_Dr,F decfsz cont_lett_eepr,F goto readloop return Ho capito che non può funzionare. Il problema quello che non riesco a capire: una volta effettuata la lettura call Leggi_Eepr gli dico di inserire la lettura fatta, che in quel momento è nell'accumulatore nel registro sec_int_ingr1_Dr. Poi vado ad incrementare locazione da leggere poi arriva il probl. Io ho incrementato il valore del registro sec_int_ingr1_Dr e non la posizione. Domanda allora per capire come faccio a gestire, nel mio caso a incrementare la posizione di mem del registro per inserici poi la lettura successiva? E' tutto qui il punto che ancora non ho capito. Ciòè in parole povere come posso fare eseguire queste operazioni. Leggi eeepr metti il risultato alla locazione 0x020 incrementa locazione eepr da leggere incrementa la locazione su cui inserire la lettura torna all'inizio. Ultima Modifica di superciuck : 04-04-2006 17.44.26. |
|
|
|
|
|
#8 |
|
Registered User
|
tutto ok
Tutto funzia ora.......
tnx so + Codice:
;********************************************************************* ; LEGGE dei byte consecutivi da EEPROM interna. ; Mette i dati letti in HL (FSR) e seguenti. ; L'indirizzo di partenza Š in addrEE che si incrementa. ;************************************************************************ Lett_Assgn_Tempi movlw 05 movwf cont_lett_eepr ;Quanti byte deve leggere movlw 00 movwf addrEE ;Prima locazione eepr da leggere. movlw sec_int_ingr1_Dr ;Primo indirizzo della RAM. movwf FSR ;Carica l'indirizzo indiretto. readloop: movfw addrEE BANCO_2 ;Seleziona il banco di registri 2 movwf EEADR call Leggi_Eepr movwf INDF incf addrEE,F incf FSR,F decfsz cont_lett_eepr,F goto readloop return ;--------------------------------------------------------------------------- |
|
|
|
![]() |
Per le vostre immagini su questo forum potete usare PcTunerUp! Iscriviti gratuitamente alla nostra newsletter. |
| Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 visitatori) | |
| Strumenti Discussione | |
| Modalità Visualizzazione | |
|
|