Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Programma 16f84a

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Programma 16f84a

Messaggioda Foto Utentecarlomusumeci » 8 mar 2015, 1:48

capisco...quindi cosi facendo posso anche non fare tutto questo giro di codici
scrivoEEprom macro indirizzo, E_Valore
Codice: Seleziona tutto
      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
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

[12] Re: Programma 16f84a

Messaggioda Foto Utentefloppinoo » 8 mar 2015, 2:11

certo richiami quella macro come vuoi da ogni punto del programma passandogli
indice e valore a tuo piacimento, la macro la scrivi solo una volta nel programma prima del main
e tra le dichiarazioni delle variabili (io generalmente le metto li le macro).
Poi la richiami nel tuo programma dove vuoi e tutte le volte che vuoi
con solo 1 2 line di codice come ti ho mostrato
usando il primo metodo se sono semplici costanti
il secondo se sono variabili.
:ok:

*Volendo potresti trasformare la macro principale in una procedura /funzione
cosi risparmi la memoria del PIC ma se lo usi solo in pochi punti del programma
gia cosi va benissimo.
Ultima modifica di Foto Utentefloppinoo il 8 mar 2015, 2:16, modificato 1 volta in totale.
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

0
voti

[13] Re: Programma 16f84a

Messaggioda Foto Utentecarlomusumeci » 8 mar 2015, 2:14

Capisco la richiamo con una semplice " call " domani provo :) grazie mille
,in pratica chiamandola memorizzo in eprom quel punto del programma che É in esecuzione
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

[14] Re: Programma 16f84a

Messaggioda Foto Utentefloppinoo » 8 mar 2015, 2:19

carlomusumeci ha scritto:Capisco la richiamo con una semplice " call " domani provo :) grazie mille
,in pratica chiamandola memorizzo in eprom quel punto del programma che É in esecuzione


no aspe le macro le chiami direttamente senza call in questo modo


Codice: Seleziona tutto
settaEepromL 0x03, 1
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

0
voti

[15] Re: Programma 16f84a

Messaggioda Foto Utentefloppinoo » 8 mar 2015, 12:16

Allora come va ?
ti chiedo la parola magica in informatica, FUNZIONA ?

Dimmi se hai problemi che risolviamo comunque dovrebbe andare al primo colpo
magari oggi ti posto il codice in maniera più ordinata ieri lo fatto di fretta ... ma già cosi dovrebbe andare.

fammi sapere O_/
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

0
voti

[16] Re: Programma 16f84a

Messaggioda Foto Utentecarlomusumeci » 8 mar 2015, 13:14

niente non sto riuscendo...
Codice: Seleziona tutto
      ;**************************************************
;CENTRALINA LUCI CARLO MUSUMECI
;**************************************************

        PROCESSOR       16F84A
        RADIX           DEC
        INCLUDE         "P16F84A.INC"
        ERRORLEVEL      -302

        ;Setup of PIC configuration flags

        ;XT oscillator
        ;Disable watch dog timer
        ;Enable power up timer
        ;Disable code protect

        __CONFIG        3FF1H

        LED     EQU     0
        NEXT   EQU      4
     MEMORIZZA   EQU      7
        ORG     0CH
Index_Memoria   EQU     2Eh
        Count   RES     2
         Shift   RES      1
        nTick   RES      1

        ;Reset Vector
        ;Start point at CPU reset

        ORG     00H
      
        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
         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 

      movlw 0x04                 ; banco eeprom da utilizzare
        movwf Index_Memoria         ; banco di registro eeprom
      

      

Mainloop
GIOCO1
      call   GIOCOLUCI1
      btfsc   PORTA,NEXT
      goto   GIOCO2
      btfsc   PORTB,MEMORIZZA              ;pulsante "MEMORIZZA" premuto?
    settaEeprom Index_Memoria, Valore        ;SI MEMORIZZA
       goto   GIOCO1                       ;NO CONTINUA IL GIOCO
GIOCO2
      call   GIOCOLUCI2
      btfsc   PORTA,NEXT
      goto   GIOCO3
      btfsc   PORTB,MEMORIZZA
    settaEeprom Index_Memoria, Valore
      goto   GIOCO2
GIOCO3   
      call   GIOCOLUCI3
      btfsc   PORTA,NEXT
      goto   GIOCO4
      btfsc   PORTB,MEMORIZZA
    settaEeprom Index_Memoria, Valore
      goto   GIOCO3
GIOCO4   
      call   GIOCOLUCI4
      btfsc   PORTA,NEXT
      goto   GIOCO5
      btfsc   PORTB,MEMORIZZA
    settaEeprom Index_Memoria, Valore
      goto   GIOCO4
GIOCO5   
      call   GIOCOLUCI5
      btfsc   PORTA,NEXT
      goto   GIOCO6
      btfsc   PORTB,MEMORIZZA
    settaEeprom Index_Memoria, Valore
      goto   GIOCO5
GIOCO6   
      call   GIOCOLUCI6
      btfsc   PORTA,NEXT
      goto   GIOCO1
      btfsc   PORTB,MEMORIZZA
    settaEeprom Index_Memoria, Valore
      goto   GIOCO6

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,,,macro che definiscono sequenza dei giochi;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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   125
      movwf   Count

   
DelayLoop
      movf    TMR0,W
        btfss   STATUS,Z
        goto    DelayLoop       
      movlw   6               
        movwf   TMR0           
      decfsz  Count,1
        goto    DelayLoop
      return
      END

Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

1
voti

[17] Re: Programma 16f84a

Messaggioda Foto Utentefloppinoo » 8 mar 2015, 22:53

Si ma io ti ho dato un codice del tutto diverso ... inoltre se prvi tu stesso a mettere il codice in mplab
mi da un sacco di errori ...e nel codice continui a usare le procedura eeprom in maniera rozza nel main cosa
che non solo non è pulita e poco legibile ma rischi ... ad ogni riavvio del PIC di rimemorizare ogni volta sulla eproom e magari trovare dei dati non congrui ... nelle elaborazioni successive.
Bada che se ad esempio va via la corrente oppure il PIC per qualche strano motivo si riavvia ..
mettere la memorizazione al'interno del main ti fa cnacellare i vecchi dati, è una cosa da evitare in informatica interfacciarsi con alcuni elementi hardwar direttamente all'interno del main o delle procedure
di logica del programma perche se un giorno cambierai il PIC ... rimodificare pagine e pagine di assembly ci metti
giorni interi.

comunque ora te lo riscrivo io il codice almeno senza errori
mettendo le procedure che ti ho dato .. il codice non lo provo sul PIC
perche dovrei andare giu nel garage a prendere il programmatore (questo posso farlo magari domani
appena torno da lavoro senza nessun problema tranqui .)
ora ti scrivo la procedura all interno del tuo codice eliminado gli errori che ora mi da gia in copilazione

Mi chiedo se hai scritto il programma in mplab e mi chiedo a te non ti da gli stessi errori in fondo
le mie procedure non significano nulla in quel codice scritto da te ...
Spero almeno che tu sai come compilare un programma assembly ...
come fa a funzionarti se gia prendentdo il tuo codice mi da 10 e passa errori di sintassi o.o
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

0
voti

[18] Re: Programma 16f84a

Messaggioda Foto Utentecarlomusumeci » 8 mar 2015, 23:01

ciao floppinoo,si il codice lo scritto io di sana pianta su MPLAB e lo testo con emulatori di PIC... il programma senza laggiunta della memoria eeprom funziona perfettamente...da quando ho aggiunto questi codici non me lo fa nemmeno assemblare in HEX...
:( :( non riesco a capire questa eeprom...
non mi è mai capitato di doverla usare prima,quindi non ho mai imparato...
Comunque ha dalle 11 di stamani che faccio svariate prove e non ne vengo a capo...
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

[19] Re: Programma 16f84a

Messaggioda Foto Utentecarlomusumeci » 8 mar 2015, 23:05

...GRAZIE PER LA TUA DISPONIBILITA' :D ....
Questo è il codice funzionante che ho appena provato...ma ancora qui non avevo inserito istruzioni per la EEPROM

Codice: Seleziona tutto
;**************************************************
;CENTRALINA LUCI CARLO MUSUMECI
;**************************************************

        PROCESSOR       16F84A
        RADIX           DEC
        INCLUDE         "P16F84A.INC"
        ERRORLEVEL      -302

        ;Setup of PIC configuration flags

        ;XT oscillator
        ;Disable watch dog timer
        ;Enable power up timer
        ;Disable code protect

        __CONFIG        3FF1H

LED     EQU     0
NEXT   EQU      4
MEMORIZZA   EQU      7
        ORG     0CH

Count   RES     2



        ;Reset Vector
        ;Start point at CPU reset

        ORG     00H
      
        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


      

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


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,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

Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

[20] Re: Programma 16f84a

Messaggioda Foto Utentefloppinoo » 8 mar 2015, 23:19

Dammi 1 oretta che mentre mi vedo un film scrivo il codice :D
è da tanto che non uso mplab spero di postarti qualcosa per mezzanote almeno con codice che
compila se il codice compila vedrai che al 90 % le mie macro dovrbbero andare
dico 90 perche sono sempre come san Tommaso se non provo sul PIC
non credo nemmeno a me stesso :ok:
ma dovrebbe andare dammi sol un po di tempo e te lo posto
se dovesse vincere qul dieci % devi aspettare domani sera che provi il anche io sul PIC
ma penso che non ce ne sarà bisogno

Lo so ho visto subito gia prima di metterlo su mplab che ci sono un po di errori
è logico che il programma non va ... il PIC sicuramente si blichera pure allinfinito senza fare nulla di utile.

a dopo mi guardo un film fra 1 ora e mezza te lo posto O_/
naturalment enon ti aggiusto la logica del tuo giochino
perche non so cosa faccia e penso che meglio che ti diverti tu
almeno ti eserciti un po
io arrivo solo a farti memorizzare eprom
e a fartela leggere poi al resto della logica dovresti pensarci su


Ti consiglio inoltre prima di scrivere un codice in assembly di farti un diagramma degli stati
i flo chart che si usa per i linguaggi ad alto livello generlamnete sono
poco utili per assembly, per assembly usa il diagramma degli automi
analizzando ogni possibile stato che si puo trovare il PIC e i registri ad ogni passo
Ultima modifica di Foto Utentefloppinoo il 8 mar 2015, 23:25, modificato 1 volta in totale.
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 21 ospiti