spero più che altro di capire il meccanismo vedendo il codice funzionante
Programma 16f84a
Moderatore:
Paolino
34 messaggi
• Pagina 3 di 4 • 1, 2, 3, 4
0
voti
[21] Re: Programma 16f84a
Va bene,ti do tutto il tempo che vuoi
spero più che altro di capire il meccanismo vedendo il codice funzionante
spero più che altro di capire il meccanismo vedendo il codice funzionante
-

carlomusumeci
353 5 7 - Sostenitore

- Messaggi: 526
- Iscritto il: 8 apr 2011, 0:35
1
voti
[22] Re: Programma 16f84a
Allora questo è il codice per scrivere sulla eeprom senza il tuo codice all'interno
mancavano alcune varibili e me ne scuso ... ma si potevano comunque aggiungere a priori facilmente
Qui ho integrato il tuo ultimo codice postato che comunque non fa riferimento alle chiamate eeprom magari le inserisci tu guardando gli esempi nel main del mio codice sopra
i due codici li compilo senza errori se hai problimi come al solito posta i tuoi dubbi
le funzioni non le ho provate sul PIC posso farlo domani ora sono impossibilitato ma dovrebbero andare
mancavano alcune varibili e me ne scuso ... ma si potevano comunque aggiungere a priori facilmente
- Codice: Seleziona tutto
;Creato da Francesco Marangi il 2009 - 2010, con quarzo da 4 MHz
PROCESSOR 16F84A
RADIX DEC
INCLUDE "P16F84A.INC"
ERRORLEVEL -302
__CONFIG _PWRTE_ON & _CP_OFF & _WDT_OFF & _XT_OSC
ORG 0CH
;REGISTRI USATI DALLE MACRO E PROCEDURE PER SCRIVERE NELLA EPROOM
Index EQU 29h
Index_Memoria EQU 2Eh
Valore EQU 30h
ValoreE EQU 31h
temp EQU 39h
ORG 00H
goto inizio
ORG 04H
retfie
settaEepromL macro I_Index, V_Valore
movlw I_Index
movwf Index
movlw V_Valore
movwf ValoreE
call scriviEEprom
endm
settaEeprom macro I_Index, V_Valore
movf I_Index,W
movwf Index
movf V_Valore,W
movwf ValoreE
call scriviEEprom
endm
scrivoEEprom macro indirizzo, E_Valore
bcf STATUS,RP0 ;bank 0
movf indirizzo,w
movwf EEADR ;first addr to eeadr
movf E_Valore,w
movwf EEDATA ;first data to eedata
bsf STATUS,RP0 ;bank 1
bsf EECON1, WREN ;enable write
movlw 0x55
movwf EECON2 ;write 55h
movlw 0xAA
movwf EECON2 ;write AAh
bsf EECON1,WR ;set wr bit begin wrt
call ritardaEEIF
bcf STATUS,RP0 ;bank 0
endm
leggoEEprom macro indirizzo
movf indirizzo,w
call leggoEEpromM
endm
leggoEEpromL macro indirizzo
movlw indirizzo
call leggoEEpromM
endm
leggoEEpromM
bcf STATUS,RP0
movwf EEADR
bsf STATUS,RP0
bsf EECON1,RD
bcf STATUS,RP0
movf EEDATA,W
return
;ZONA INIZIALIZZAZIONE DELLE VARIABILI
inizio
bsf STATUS, RP0
movlw 00000000B
movwf TRISA
movlw 11110000B
movwf TRISB
bcf STATUS, RP0
clrf PORTB
clrf PORTA
;Primo metodo passo direttamente le costanti alla macro (scrivo nel banco 5 delle'eèprom il valore 2)
settaEepromL 0x05, 2
;Secondo metodo passo delle varibili che istanzio nel programma (scrivo nel banco 3 della eprom il valore 3)
movlw 0x03
movwf Index_Memoria
movlw 3
movwf Valore
settaEeprom Index_Memoria, Valore
;Per leggere
leggoEEprom Index_Memoria ;dopo questa chimata nel registro W è presente il valore 3
;--- qui leggo il valore nwl registro e lo utilizzo
movwf PORTB ;i LED SU LE USCITE DEL PIC SI ACCENDERENNO DANDO IL NUMERO BINARIO 3
leggoEEpromL 0x05 ;dopo questa chimata nel registro W è presente il valore 2
;--- qui leggo il valore nwl registro e lo utilizzo
;AD ESEMPIO
movwf PORTB ;i LED SU LE USCITE DEL PIC SI ACCENDERENNO DANDO IL NUMERO BINARIO 2
;============================ MAIN lOOP PRINCIPALE DEL PIC ====================
mainloop
goto mainloop
;====================== GESTIONE ITERUPT ==========================
;Indice del valore da scrivere in index_menu, valore in valore
scriviEEprom
controlla
scrivoEEprom Index, ValoreE
movf ValoreE,w
movwf temp
leggoEEprom Index
subwf temp, w
btfss STATUS,Z
goto controlla
return
ritardaEEIF
btfss EECON1,EEIF
goto ritardaEEIF
BCF EECON1,EEIF
return
END
Qui ho integrato il tuo ultimo codice postato che comunque non fa riferimento alle chiamate eeprom magari le inserisci tu guardando gli esempi nel main del mio codice sopra
- Codice: Seleziona tutto
;**************************************************
;CENTRALINA LUCI CARLO MUSUMECI
;**************************************************
PROCESSOR 16F84A
RADIX DEC
INCLUDE "P16F84A.INC"
ERRORLEVEL -302
__CONFIG _PWRTE_ON & _CP_OFF & _WDT_OFF & _XT_OSC
#DEFINE LED 0
#DEFINE NEXT 4
#DEFINE MEMORIZZA 7
ORG 0CH
Count RES 2
;REGISTRI USATI DALLE MACRO E PROCEDURE PER SCRIVERE NELLA EPROOM
Index EQU 29h
Index_Memoria EQU 2Eh
Valore EQU 30h
ValoreE EQU 31h
temp EQU 39h
;Reset Vector
;Start point at CPU reset
ORG 00H
goto inizio
ORG 04H
retfie
settaEepromL macro I_Index, V_Valore
movlw I_Index
movwf Index
movlw V_Valore
movwf ValoreE
call scriviEEprom
endm
settaEeprom macro I_Index, V_Valore
movf I_Index,W
movwf Index
movf V_Valore,W
movwf ValoreE
call scriviEEprom
endm
scrivoEEprom macro indirizzo, E_Valore
bcf STATUS,RP0 ;bank 0
movf indirizzo,w
movwf EEADR ;first addr to eeadr
movf E_Valore,w
movwf EEDATA ;first data to eedata
bsf STATUS,RP0 ;bank 1
bsf EECON1, WREN ;enable write
movlw 0x55
movwf EECON2 ;write 55h
movlw 0xAA
movwf EECON2 ;write AAh
bsf EECON1,WR ;set wr bit begin wrt
call ritardaEEIF
bcf STATUS,RP0 ;bank 0
endm
leggoEEprom macro indirizzo
movf indirizzo,w
call leggoEEpromM
endm
leggoEEpromL macro indirizzo
movlw indirizzo
call leggoEEpromM
endm
leggoEEpromM
bcf STATUS,RP0
movwf EEADR
bsf STATUS,RP0
bsf EECON1,RD
bcf STATUS,RP0
movf EEDATA,W
return
inizio
bsf STATUS,RP0 ; seleziona banco registri 1
movlw 00010000B ;
movwf TRISA ;assegna IN OUT in TRISA
movlw 10000000B ; //////
movwf TRISB ; idem
movlw 00000100B
movwf OPTION_REG
;Commuta sul primo banco dei registri
bcf STATUS,RP0 ;seleziona Banco registri 0
;============================ MAIN lOOP PRINCIPALE DEL PIC ====================
mainloop
GIOCO1
call GIOCOLUCI1
btfsc PORTA,NEXT
goto GIOCO2
goto GIOCO1
GIOCO2
call GIOCOLUCI2
btfsc PORTA,NEXT
goto GIOCO3
goto GIOCO2
GIOCO3
call GIOCOLUCI3
btfsc PORTA,NEXT
goto GIOCO4
goto GIOCO3
GIOCO4
call GIOCOLUCI4
btfsc PORTA,NEXT
goto GIOCO5
goto GIOCO4
GIOCO5
call GIOCOLUCI5
btfsc PORTA,NEXT
goto GIOCO6
goto GIOCO5
GIOCO6
call GIOCOLUCI6
btfsc PORTA,NEXT
goto GIOCO1
goto GIOCO6
goto mainloop
;====================== GESTIONE ITERUPT ==========================
;Indice del valore da scrivere in index_menu, valore in valore
scriviEEprom
controlla
scrivoEEprom Index, ValoreE
movf ValoreE,w
movwf temp
leggoEEprom Index
subwf temp, w
btfss STATUS,Z
goto controlla
return
ritardaEEIF
btfss EECON1,EEIF
goto ritardaEEIF
BCF EECON1,EEIF
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,SOTTO PROGRAMMI;;;;;;;;;;;;;;;;;;;;;;;;
GIOCOLUCI1
movlw 00000110B ;mostra nel display 7 segmenti collegato in PORTB il numero " 1 "
movwf PORTB ;//////////////////////////////////////////////////////////
movlw 00000001B
movwf PORTA
call Delay
movlw 00000010B
movwf PORTA
call Delay
movlw 00000100B
movwf PORTA
call Delay
movlw 00001000B
movwf PORTA
call Delay
RETURN
GIOCOLUCI2
movlw 01011011B
movwf PORTB
movlw 00000001B
movwf PORTA
call Delay
movlw 00000011B
movwf PORTA
call Delay
movlw 00000111B
movwf PORTA
call Delay
movlw 00001111B
movwf PORTA
call Delay
RETURN
GIOCOLUCI3
movlw 01001111B ; DISPLAY CHE TI DICE IL NUMERO DEL GIOCO
movwf PORTB
;SEQUENZA GIOCO 3
movlw 00001110B
movwf PORTA
call Delay
movlw 00001101B
movwf PORTA
call Delay
movlw 00001011B
movwf PORTA
call Delay
movlw 00000111B
movwf PORTA
call Delay
return
GIOCOLUCI4
movlw 01100110B
movwf PORTB
;SEQUENZA GIOCO 4
movlw 00000001B
movwf PORTA
call Delay
movlw 00000011B
movwf PORTA
call Delay
movlw 00000111B
movwf PORTA
call Delay
movlw 00001111B
movwf PORTA
call Delay
movlw 00000111B
movwf PORTA
call Delay
movlw 00000011B
movwf PORTA
call Delay
movlw 00000001B
movwf PORTA
call Delay
movlw 00000000B
movwf PORTA
call Delay
RETURN
GIOCOLUCI5
movlw 01101101B ; DISPLAY CHE TI DICE IL NUMERO DEL GIOCO
movwf PORTB
;SEQUENZA LUCI 5
movlw 00000001B
movwf PORTA
call Delay
movlw 00000011B
movwf PORTA
call Delay
movlw 00000111B
movwf PORTA
call Delay
movlw 00001111B
movwf PORTA
call Delay
movlw 00001110B
movwf PORTA
call Delay
movlw 00001100B
movwf PORTA
call Delay
movlw 00001000B
movwf PORTA
call Delay
RETURN
GIOCOLUCI6
movlw 01111101B ; DISPLAY CHE TI DICE IL NUMERO DEL GIOCO
movwf PORTB
;SEQUENZALUCI
movlw 00000001B
movwf PORTA
call Delay
movlw 00000011B
movwf PORTA
call Delay
movlw 00000110B
movwf PORTA
call Delay
movlw 00001100B
movwf PORTA
call Delay
movlw 00001000B
movwf PORTA
call Delay
RETURN
Delay
movlw 6
movwf TMR0
movlw 16
movwf Count
DelayLoop
movf TMR0,W
btfss STATUS,Z
goto DelayLoop
movlw 6
movwf TMR0
decfsz Count,1
goto DelayLoop
return
END
i due codici li compilo senza errori se hai problimi come al solito posta i tuoi dubbi
le funzioni non le ho provate sul PIC posso farlo domani ora sono impossibilitato ma dovrebbero andare
0
voti
[23] Re: Programma 16f84a
inanzi tutto ti ringrazio per il lavoro che hai fatto...sto leggendo la parte che hai integrato al mio codice...ma il pulsante MEMORIZZA non è collegato a nessuna istruzione...come avviene la scrittura nella eeprom? automaticamente o se rimando un interruzione alla locazione 04h?
Ho notato questa parte di codice
ma non arriva mai a scrivieeprom,perche prima c'è l'istruzione GOTO Mainloop,
Ho notato questa parte di codice
- Codice: Seleziona tutto
GIOCO5
call GIOCOLUCI5
btfsc PORTA,NEXT
goto GIOCO6
goto GIOCO5
GIOCO6
call GIOCOLUCI6
btfsc PORTA,NEXT
goto GIOCO1
goto GIOCO6
goto mainloop
;====================== GESTIONE ITERUPT ==========================
;Indice del valore da scrivere in index_menu, valore in valore
scriviEEprom
controlla
scrivoEEprom Index, ValoreE
movf ValoreE,w
movwf temp
leggoEEprom Index
subwf temp, w
btfss STATUS,Z
goto controlla
return
ritardaEEIF
btfss EECON1,EEIF
goto ritardaEEIF
BCF EECON1,EEIF
return
ma non arriva mai a scrivieeprom,perche prima c'è l'istruzione GOTO Mainloop,
Ultima modifica di
carlomusumeci il 9 mar 2015, 1:33, modificato 1 volta in totale.
-

carlomusumeci
353 5 7 - Sostenitore

- Messaggi: 526
- Iscritto il: 8 apr 2011, 0:35
1
voti
[24] Re: Programma 16f84a
Io nel tuo ultimo codice mostrato non c'è l'uso del pulsante memorizza o.O
nel tuo main e nel tu ultimo codice non lo vedo e ne tanto meno vedo l'uso della eeprom
quindi ho solo copiato il tuo ultimo codice postato al mio
Nel codice dove ho inserito anche il tuo
ancora non è richiamata nessuna eprom, penso che la logica di un pulsante
e le relative istruzioni da me mostrate nel main come esempio, nel primo codice, riesci facilmente ad assemblarle non penso sia difficile
Intanto prova il primo codici cosi com'è e vedi se la eeprom funzione
se funziona cerca di capire le poche istruzioni usate per richiamare le macro per scrivere nella eprom
le trovi dopo il label inizio
e poi integra il tutto nella seconda soluzione, dove ripeto non ho trovato ne richiami al pulsante MEMORIZZA NE ALL'USO DELLA EPROM, quindi li le mie funzioni eeprom lo solo integrate ma mai richiamate
nel tuo main e nel tu ultimo codice non lo vedo e ne tanto meno vedo l'uso della eeprom
quindi ho solo copiato il tuo ultimo codice postato al mio
Nel codice dove ho inserito anche il tuo
ancora non è richiamata nessuna eprom, penso che la logica di un pulsante
e le relative istruzioni da me mostrate nel main come esempio, nel primo codice, riesci facilmente ad assemblarle non penso sia difficile
Intanto prova il primo codici cosi com'è e vedi se la eeprom funzione
se funziona cerca di capire le poche istruzioni usate per richiamare le macro per scrivere nella eprom
le trovi dopo il label inizio
e poi integra il tutto nella seconda soluzione, dove ripeto non ho trovato ne richiami al pulsante MEMORIZZA NE ALL'USO DELLA EPROM, quindi li le mie funzioni eeprom lo solo integrate ma mai richiamate
1
voti
[25] Re: Programma 16f84a
carlomusumeci ha scritto:inanzi tutto ti ringrazio per il lavoro che hai fatto...sto leggendo la parte che hai integrato al mio codice...ma il pulsante MEMORIZZA non è collegato a nessuna istruzione...come avviene la scrittura nella eeprom? automaticamente o se rimando un interruzione alla locazione 04h?
Ho notato questa parte di codice
- Codice: Seleziona tutto
GIOCO5
call GIOCOLUCI5
btfsc PORTA,NEXT
goto GIOCO6
goto GIOCO5
GIOCO6
call GIOCOLUCI6
btfsc PORTA,NEXT
goto GIOCO1
goto GIOCO6
goto mainloop
;====================== GESTIONE ITERUPT ==========================
;Indice del valore da scrivere in index_menu, valore in valore
scriviEEprom
controlla
scrivoEEprom Index, ValoreE
movf ValoreE,w
movwf temp
leggoEEprom Index
subwf temp, w
btfss STATUS,Z
goto controlla
return
ritardaEEIF
btfss EECON1,EEIF
goto ritardaEEIF
BCF EECON1,EEIF
return
ma non arriva mai a scrivieeprom,perche prima c'è l'istruzione GOTO Mainloop,
Carlo ... ma ascolti quando ti scrivo
quelle due funzioni non richiamano nessuna funzione ma sono usate dalle macro che scrivono nella eeprom
erroneamente forse lo messe alla fine del rpogramma essendo procedure
ma non vengono eseguite nel main ma dalle macro sono insomma procedure di supporto per le macro
Le istruzioni che richiamano le macro per scrivere nelle eprom lo messe nel primo codice come esempio
e sono per la precisone queste dopo il label inizio,
- Codice: Seleziona tutto
;ZONA INIZIALIZZAZIONE DELLE VARIABILI
inizio
bsf STATUS, RP0
movlw 00000000B
movwf TRISA
movlw 11110000B
movwf TRISB
bcf STATUS, RP0
clrf PORTB
clrf PORTA
;Primo metodo passo direttamente le costanti alla macro (scrivo nel banco 5 delle'eèprom il valore 2)
settaEepromL 0x05, 2
;Secondo metodo passo delle varibili che istanzio nel programma (scrivo nel banco 3 della eprom il valore 3)
movlw 0x03
movwf Index_Memoria
movlw 3
movwf Valore
settaEeprom Index_Memoria, Valore
;Per leggere
leggoEEprom Index_Memoria ;dopo questa chimata nel registro W è presente il valore 3
;--- qui leggo il valore nwl registro e lo utilizzo
movwf PORTB ;i LED SU LE USCITE DEL PIC SI ACCENDERENNO DANDO IL NUMERO BINARIO 3
leggoEEpromL 0x05 ;dopo questa chimata nel registro W è presente il valore 2
;--- qui leggo il valore nwl registro e lo utilizzo
;AD ESEMPIO
movwf PORTB ;i LED SU LE USCITE DEL PIC SI ACCENDERENNO DANDO IL NUMERO BINARIO 2
spero ora di essere stato chairo, il secondo vcodice tutto quello che ce dopo il label inizio devi sistemarlo tu
1
voti
[27] Re: Programma 16f84a
Ora prova il primo codice vedi se scrive nella eeprom
dopo di questo prenditi una pausa
e assembla il primo codice al tuo a tuo piacimento
fai un piccolo passo alla volta prima controlla se il rpimo codice funonzia
se non funziona il primo te lo rivedo domani magari provandolo io sul PIC ma ora come detto non posso
ma dovrebbe comunque andare (lo preso da un mio vecchio progetto funzionante e testato)
per testarlo puoi anche non usare i led ma leggi i valori che ti restituisce il progtammatore dei PIC quando leggi la sua eeprom se nel registro 5 e 3 scrive allora funziona e poi devi solo divertirti a integrare il tuo codice al mio
io ora vado a dormire a domani
dopo di questo prenditi una pausa
e assembla il primo codice al tuo a tuo piacimento
fai un piccolo passo alla volta prima controlla se il rpimo codice funonzia
se non funziona il primo te lo rivedo domani magari provandolo io sul PIC ma ora come detto non posso
ma dovrebbe comunque andare (lo preso da un mio vecchio progetto funzionante e testato)
per testarlo puoi anche non usare i led ma leggi i valori che ti restituisce il progtammatore dei PIC quando leggi la sua eeprom se nel registro 5 e 3 scrive allora funziona e poi devi solo divertirti a integrare il tuo codice al mio

io ora vado a dormire a domani
0
voti
[28] Re: Programma 16f84a
va bene...quindi posso scegliere se usare il primo o il secondo metodo...ma solo uno...fanno lo stesso lavoro in pratica
con la differenza che il primo metodo scrive nella locazione 5 della eeprom il valore 2
invece il secondo metodo scrive nella locazione 3 il valore 3
giusto?
- Codice: Seleziona tutto
;Primo metodo passo direttamente le costanti alla macro (scrivo nel banco 5 delle'eèprom il valore 2)
settaEepromL 0x05, 2
;Secondo metodo passo delle varibili che istanzio nel programma (scrivo nel banco 3 della eprom il valore 3)
movlw 0x03
movwf Index_Memoria
movlw 3
movwf Valore
settaEeprom Index_Memoria, Valore
con la differenza che il primo metodo scrive nella locazione 5 della eeprom il valore 2
invece il secondo metodo scrive nella locazione 3 il valore 3
giusto?
-

carlomusumeci
353 5 7 - Sostenitore

- Messaggi: 526
- Iscritto il: 8 apr 2011, 0:35
0
voti
[30] Re: Programma 16f84a
e certo,,,
le costanti,hanno un valore fisso che non cambia
le variabili possono variare il suo valore
le costanti,hanno un valore fisso che non cambia
le variabili possono variare il suo valore
-

carlomusumeci
353 5 7 - Sostenitore

- Messaggi: 526
- Iscritto il: 8 apr 2011, 0:35
34 messaggi
• Pagina 3 di 4 • 1, 2, 3, 4
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 21 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)