Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Programma 16f84a

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[21] Re: Programma 16f84a

Messaggioda Foto Utentecarlomusumeci » 8 mar 2015, 23:24

Va bene,ti do tutto il tempo che vuoi :D :D
spero più che altro di capire il meccanismo vedendo il codice funzionante :-)
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

1
voti

[22] Re: Programma 16f84a

Messaggioda Foto Utentefloppinoo » 9 mar 2015, 0:59

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

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 O_/
le funzioni non le ho provate sul PIC posso farlo domani ora sono impossibilitato ma dovrebbero andare
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

0
voti

[23] Re: Programma 16f84a

Messaggioda Foto Utentecarlomusumeci » 9 mar 2015, 1:21

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,
Ultima modifica di Foto Utentecarlomusumeci il 9 mar 2015, 1:33, modificato 1 volta in totale.
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

1
voti

[24] Re: Programma 16f84a

Messaggioda Foto Utentefloppinoo » 9 mar 2015, 1:32

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
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

1
voti

[25] Re: Programma 16f84a

Messaggioda Foto Utentefloppinoo » 9 mar 2015, 1:41

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
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

0
voti

[26] Re: Programma 16f84a

Messaggioda Foto Utentecarlomusumeci » 9 mar 2015, 1:47

va bene...vedo di riuscire a collegarlo al mio programma
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

1
voti

[27] Re: Programma 16f84a

Messaggioda Foto Utentefloppinoo » 9 mar 2015, 1:50

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 O_/

io ora vado a dormire a domani
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

0
voti

[28] Re: Programma 16f84a

Messaggioda Foto Utentecarlomusumeci » 9 mar 2015, 2:02

va bene...quindi posso scegliere se usare il primo o il secondo metodo...ma solo uno...fanno lo stesso lavoro in pratica
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?
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

1
voti

[29] Re: Programma 16f84a

Messaggioda Foto Utentefloppinoo » 9 mar 2015, 2:17

Si fanno la stessa cosa solo che il primo gli passi direttamente i valori come costanti
il secondo gli passi delle variabili

spero tu sappia la differenza tra costanti e variabili ?
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

0
voti

[30] Re: Programma 16f84a

Messaggioda Foto Utentecarlomusumeci » 9 mar 2015, 2:23

e certo,,,
le costanti,hanno un valore fisso che non cambia
le variabili possono variare il suo valore
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 21 ospiti