Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Programma 16f84a

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

1
voti

[31] Re: Programma 16f84a

Messaggioda Foto Utentefloppinoo » 9 mar 2015, 2:28

carlomusumeci ha scritto:e certo,,,
le costanti,hanno un valore fisso che non cambia
le variabili possono variare il suo valore


bene allora la differnza dei due metodi sta propio in quello
la prima non puoi variare cio che gli passi
la seconda si tramqite cio che gli metti nel registo Index_Memoria
e nel registro Valore
Avatar utente
Foto Utentefloppinoo
205 1 3 7
Sostenitore
Sostenitore
 
Messaggi: 508
Iscritto il: 24 lug 2010, 9:26

0
voti

[32] Re: Programma 16f84a

Messaggioda Foto Utentecarlomusumeci » 9 mar 2015, 2:38

vabene domani provo...perche mi sono confuso da solo... :roll:
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

[33] Re: Programma 16f84a

Messaggioda Foto Utentecarlomusumeci » 9 mar 2015, 22:04

Ciao Floppinoo,,,Sono riuscito a far funzionare il tutto...anche se non ho usato molto di quanto mi hai mandato...(non sono riuscito a capire le macro) :(
sicuramente avrei potuto semplificare la parte che scrive un valore,ogni volta che premo il pulsante memorizza...
In ogni caso,il programma si comporta in questo modo:
Al Reset...vengono visualizzati automaticamente in seguenza i 6 giochi,una volta visti tutti e 6 i giochi,reincominciano ma si fermano al numero 1...
Da questo momento con il pulsante " CAMBIA GIOCO" si puo scegliere tra i 6 giochi luce...
Scelto il gioco,premo per qualche secondo il pulsante " MEMORIZZA" e mi memorizza quel gioco nella EEPROM
Ho verificato come mi hai detto tu,sono andato fisicamente a vedere cosa aveva scritto nel registro EEPROM tramite il programmatore,...ottimo
Una volta memorizzato il gioco,al reset riparte dal gioco memorizzato
Questo è il codice,sicuramente avrei potuto evitarmi molti passaggi...ma non sono riuscito a usare le macro...
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
LEGGI      EQU      6
LEDP      EQU      5
       
      ORG     0CH

Count               RES     2
registrogiochi      RES      1

        ORG     00H
      

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
      bcf     STATUS,RP0 ;seleziona Banco registri 0
      CALL   LEGGIEE

Main
       
      btfsc   registrogiochi,1
       call    GIOCOLUCI1
        btfsc   registrogiochi,2
       call    GIOCOLUCI2
        btfsc   registrogiochi,3
       call    GIOCOLUCI3
        btfsc   registrogiochi,4
       call    GIOCOLUCI4
        btfsc   registrogiochi,5
       call    GIOCOLUCI5
        btfsc   registrogiochi,6
       call    GIOCOLUCI6
      btfsc   registrogiochi,7
      call    settaggioiniziale
        GOTO   Main
       


settaggioiniziale
        MOVLW   00000010B
      MOVWF   registrogiochi
        return
cambiogioco                                 ;pulsante che cambia il gioco
      btfsc   PORTA,NEXT
      RLF      registrogiochi
        RETURN
      
GIOCOLUCI1
       CALL cambiogioco   ;chiama pulsante che modifica il valore di " registrogiochi"
        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
      BTFSC   PORTB,MEMORIZZA
      call SCRIVIEE1
      RETURN
GIOCOLUCI2
       CALL cambiogioco
        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
      BTFSC   PORTB,MEMORIZZA
      call SCRIVIEE2
        return
GIOCOLUCI3     
     CALL cambiogioco
      movlw   01001111B          ; DISPLAY CHE TI DICE IL NUMERO DEL GIOCO
      movwf   PORTB
      movlw   00001110B         
      movwf   PORTA
      call   Delay
      movlw   00001101B         
      movwf   PORTA   
      call   Delay
      movlw   00001011B         
      movwf   PORTA
      call   Delay
      movlw   00000111B         
      movwf   PORTA   
      call   Delay
BTFSC   PORTB,MEMORIZZA
      call SCRIVIEE3
      RETURN
GIOCOLUCI4     
        CALL    cambiogioco
      movlw   01100110B         
      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
      movlw   00000111B         
      movwf   PORTA
      call    Delay
      movlw   00000011B         
      movwf   PORTA   
      call    Delay
      movlw   00000001B         
      movwf   PORTA
      call    Delay
      movlw   00000000B         
      movwf   PORTA   
      call   Delay
      BTFSC   PORTB,MEMORIZZA
     call SCRIVIEE4
      RETURN
GIOCOLUCI5     
     CALL cambiogioco
      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
     CALL   SCRIVIEE5
      RETURN
GIOCOLUCI6
     CALL cambiogioco
      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
     CALL     SCRIVIEE6
    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
SCRIVIEE1
   bcf STATUS,5
   movlw 0x10
   movwf EEADR   ;scrivo 0x10 in EEADR
   movlw 00000010B
   movwf EEDATA ;scrivo 0x02 in EEDATA
   bsf STATUS,5
   bsf EECON1,WREN   ;imposto ad 1 bit WREN
   bcf    INTCON, GIE       ; stop interrupt
   movlw 0x55   
   movwf EECON2 ;inserisco 0x55 in EECON2
   movlw 0xAA
   movwf EECON2 ;inserisco 0xAA in EECON2
   bsf EECON1,WR ;bit WR a 1 (inizio scrittura)
   bsf    INTCON, GIE       ; riavvia interrupt
ATTESA1
   btfsc EECON1,WR   
   goto ATTESA1
   bcf STATUS,5
return
SCRIVIEE2
   bcf STATUS,5
   movlw 0x10
   movwf EEADR   ;scrivo 0x10 in EEADR
   movlw 00000100B
   movwf EEDATA ;scrivo 0x02 in EEDATA
   bsf STATUS,5
   bsf EECON1,WREN   ;imposto ad 1 bit WREN
   movlw 0x55   
   movwf EECON2 ;inserisco 0x55 in EECON2
   movlw 0xAA
   movwf EECON2 ;inserisco 0xAA in EECON2
   bsf EECON1,WR ;bit WR a 1 (inizio scrittura)
ATTESA2
   btfsc EECON1,WR   
   goto ATTESA2
   bcf STATUS,5
RETURN
SCRIVIEE3
   bcf STATUS,5
   movlw 0x10
   movwf EEADR   ;scrivo 0x10 in EEADR
   movlw 00001000B
   movwf EEDATA ;scrivo 0x02 in EEDATA
   bsf STATUS,5
   bsf EECON1,WREN   ;imposto ad 1 bit WREN
   movlw 0x55   
   movwf EECON2 ;inserisco 0x55 in EECON2
   movlw 0xAA
   movwf EECON2 ;inserisco 0xAA in EECON2
   bsf EECON1,WR ;bit WR a 1 (inizio scrittura)
ATTESA3
   btfsc EECON1,WR   
   goto ATTESA3   
   bcf STATUS,5
RETURN

SCRIVIEE4
   bcf STATUS,5
   movlw 0x10
   movwf EEADR   ;scrivo 0x10 in EEADR
   movlw 00010000B
   movwf EEDATA ;scrivo 0x02 in EEDATA
   bsf STATUS,5
   bsf EECON1,WREN   ;imposto ad 1 bit WREN
   movlw 0x55   
   movwf EECON2 ;inserisco 0x55 in EECON2
   movlw 0xAA
   movwf EECON2 ;inserisco 0xAA in EECON2
   bsf EECON1,WR ;bit WR a 1 (inizio scrittura)
ATTESA4
   btfsc EECON1,WR   
   goto ATTESA4
   bcf STATUS,5    
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SCRIVO PER IL QUINTO GIOCO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SCRIVIEE5
   bcf STATUS,5
   movlw 0x10
   movwf EEADR   ;scrivo 0x10 in EEADR
   movlw 00100000B
   movwf EEDATA ;scrivo 0x02 in EEDATA
   bsf STATUS,5
   bsf EECON1,WREN   ;imposto ad 1 bit WREN
   movlw 0x55   
   movwf EECON2 ;inserisco 0x55 in EECON2
   movlw 0xAA
   movwf EECON2 ;inserisco 0xAA in EECON2
   bsf EECON1,WR ;bit WR a 1 (inizio scrittura)
ATTESA5
   btfsc EECON1,WR   
   goto ATTESA5
   bcf STATUS,5    
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SCRIVO PER IL SESTO GIOCO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SCRIVIEE6
   bcf STATUS,5
   movlw 0x10
   movwf EEADR   ;scrivo 0x10 in EEADR
   movlw 01000000B
   movwf EEDATA ;scrivo 0x02 in EEDATA
   bsf STATUS,5
   bsf EECON1,WREN   ;imposto ad 1 bit WREN
   movlw 0x55   
   movwf EECON2 ;inserisco 0x55 in EECON2
   movlw 0xAA
   movwf EECON2 ;inserisco 0xAA in EECON2
   bsf EECON1,WR ;bit WR a 1 (inizio scrittura)
ATTESA6
   btfsc EECON1,WR   
   goto ATTESA6
   bcf STATUS,5    
return
;;;;;;;;;;;;;;;;;;;;;;;,SUBROUTINE PER LEGGERE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LEGGIEE   
   BCF   STATUS,RP0
   MOVLW 0X10
   MOVWF EEADR
   BSF STATUS,RP0
   BSF   EECON1,RD
   BCF STATUS,RP0
   MOVF EEDATA,W
   MOVWF   registrogiochi

return

     END


dimmi cosa ne pensi,e come potremmo semplificare il tutto (nelle operazioni di scrittura EEPROM)
GRAZIE PER AVERMI FATTO CAPIRE IL MECCANISMO :)
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

[34] Re: Programma 16f84a

Messaggioda Foto Utentecarlomusumeci » 9 mar 2015, 22:16

Vorrei aggiungere anche un'altra funzione...che a fine scrittura EEPROM,mi rimandi all'indirizzo 0x04....
all'inidirizzo 0x04 facevo un programmino che mi mostrava nel display 7 segmenti la parola "SAVE" prima compare
la S poi la A e così via e ritornare al programma principale con il RETFIE...
come posso abilitare questa funzione?
ho provato utilizzando il registro INTCON e settando a 1 i bit 7 (generale INT) e il 6 (che dovrebbe essere quello che rimanda all'indirizzo 0x04 a fine scrittura nella EEPROM),ma niente
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti