Vai Indietro   PcTuner Forum > Sezione Hardware > Programmazione PIC
Arcade Registrazione Blogs Regolamento Feedback FAQ Lista Utenti Calendario Segna come Letti

Ultimi 5 blog pubblicati su PcTuner Blog
Data Titolo

Rispondi
 
Strumenti Discussione Modalità Visualizzazione
Vecchio 04-04-2006, 15.48.42   #1
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
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
superciuck Non in Linea   Rispondi Citando
Vecchio 04-04-2006, 16.10.11   #2
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 967
Feedback: (0)
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
Camillo Non in Linea   Rispondi Citando
Vecchio 04-04-2006, 16.23.10   #3
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
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
;-----------------------------------------------------------------------
superciuck Non in Linea   Rispondi Citando
Vecchio 04-04-2006, 16.36.09   #4
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
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
superciuck Non in Linea   Rispondi Citando
Vecchio 04-04-2006, 16.41.39   #5
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
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.
superciuck Non in Linea   Rispondi Citando
Vecchio 04-04-2006, 17.27.12   #6
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 967
Feedback: (0)
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
_HL_ i sottolineati, nella mia bacata mente, sostituiscono il (HL) dello Z80.
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.
Comunque la routine che hai postato precedentemente dovrebbe funzionare.

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
Camillo Non in Linea   Rispondi Citando
Vecchio 04-04-2006, 17.40.26   #7
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
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
questo prima del tuo ultimo post.
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.
superciuck Non in Linea   Rispondi Citando
Vecchio 05-04-2006, 11.21.34   #8
Registered User
 

Iscritto da: 28-02-2006
Locazione: Ancona
Messaggi: 323
Feedback: (0)
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
;---------------------------------------------------------------------------
superciuck Non in Linea   Rispondi Citando
Rispondi 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

Regole di scrittura
non Puoi inserire messaggi
non Puoi rispondere ai messaggi
non Puoi inviare allegati
non Puoi modificare i tuoi messaggi

codice vB è Attivo
Smilies è Attivo
[IMG] il codice è Attivo
Il codice HTML è Disattivato
Trackbacks are Disattivato
Pingbacks are Disattivato
Refbacks are Disattivato
Vai al Forum


Tutti gli Orari sono GMT +1. Attualmente sono le 09.15.11.


Powered by vBulletin Versione 3.6.12
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0