Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Programmazione PIC 16F84A

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Programmazione PIC 16F84A

Messaggioda Foto UtenteFranklan » 1 apr 2014, 15:44

Salve a tutti, volevo chiedervi un aiuto riguardo la programmazione del PIC 16F84A.
In pratica devo poter comandare 4 LED in uscita attraverso due pulsanti in ingresso. I due pulsanti servono a far spostare l'accensione dei LED a sinistra e a destra. Per esempio nel caso in cui voglio spostarmi con i LED a sinistra, premerò ripetutamente il pulsante di sinistra fino a quando non arriverò al quarto LED. Una volta arrivato al quarto LED devo fare in modo che rimanga acceso nella sua posizione, anche premendo il pulsante. Per spostarmi, dovrò premere il pulsante di destra (per farlo tornare indietro). Dovrò fare lo stesso anche con il primo LED. Devo programmare tutto in Assembler e purtroppo non sono molto bravo :roll:
Comunque questo è quello che sono riuscito a tirare fuori :
Codice: Seleziona tutto

list p=16f84a
include   "p16f84a.inc"
__CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC


COUNT_1  EQU  0C    ;Contatore1
COUNT_2  EQU  0D    ;COntatore2
USCITA   EQU  0E    ;uscita al led usato anche per la rotazione
CARRY    EQU  00    ;Bit di riporto C del registro Status



;inizializzazione
INIT ORG    0000H
    MOVLW   00            ; muovi 0 in W
    TRIS    PORTB         ; configura PORT B come uscita
    MOVLW   00101         ; muovi 00101 in W
    TRIS    PORTA         ; configura RA0 ed RA2 come ingressi
    MOVLW   01            ; muovi 1 in W
    MOVWF   USCITA        ; muovi 1 in USCITA


;programma principale

LEFT:   BCF  STATUS, CARRY      ; azzero il bit di carry
        BTFSC  PORTA,0          ; testiamo RA0, per vedere se il pulsante di rotazione a sinistra è premuto, se è a 1 svolgo l'istruzione sucessiva,se è a 0 salto
        GOTO   SUB LEFT         ; vai alla subroutine di rotazione a sinistra
        GOTO   RIGHT            ; nel caso in cui RA0 è uguale a 0, vado a testare RA2 per vedere se il pulsante di rotazione a destra è premuto
RIGHT:  BTFSC  PORTA,2          ; testo RA2, se è a 1 svolgo l'istruzione successiva, se è a 0 salto
        GOTO   SUB RIGHT        ; vai alla subroutine di rotazione a destra
        GOTO   LEFT             ; altrimenti torna a testare il pulsante di sinistra

;Subroutine di rotazione a snistra

SUB LEFT:  RLF  USCITA             ; ruota l'uscita a sinistra
            BTFSS  STATUS, CARRY    ; testa il bit di riporto, se è a 0 svolgi l'istruzione successiva, se è a 1 salta
            GOTO  LEFT              ; vai al programma principale, sezione LEFT
            MOVLW  01               ; muovi 1 in W
            MOVWF  USCITA           ; muovi 1 in USCITA
            GOTO  SUB LEFT          ; torna all'inizio della subroutine di rotazione sinistra
 
;Subroutine di rotazione a destra

SUB RIGHT: RRF  USCITA             ; ruota l'uscita a destra
            BTFSS  STATUS, CARRY    ; testa il bit di riporto, se è a 0 svolgi l'istruzione successiva, se è a 1 salta
            GOTO  RIGHT             ; vai al programma principale, sezione RIGHT
            MOVLW 01                ; muovi 1 in W
            MOVWF USCITA            ; muovi 1 in USCITA
            GOTO  SUB RIGHT         ; torna all'inizio della subroutine di rotazione a destra


Fatemi sapere se è tutto sbagliato oppure se qualcosa si può salvare :-)
Avatar utente
Foto UtenteFranklan
3 2
 
Messaggi: 10
Iscritto il: 12 nov 2012, 16:28

0
voti

[2] Re: Aiuto programmazione PIC 16F84A

Messaggioda Foto Utentesimo85 » 1 apr 2014, 23:43

Uhi che bello MPASM! :D

Non ho analizzato il codice perché non ne ho il tempo :( però mi fa strano leggere la notazione binaria in quel modo, per esempio:

Codice: Seleziona tutto
    movlw  00101         ; muovi 00101 in W


Non dovrebbe essere:

Codice: Seleziona tutto
    movlw  0b0000101         ; muovi 00101 in W


? È una domanda perché è parecchio che non programmo un PIC 8 bit in Assembly.
È anche vero che io scrivo tutto in esadecimale perché mi trovo meglio lavorando bit a bit.

Comunque, hai provato il codice? :D
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: Aiuto programmazione PIC 16F84A

Messaggioda Foto UtenteFranklan » 2 apr 2014, 14:36

Ciao simo :D Ho scritto in quel modo quella riga perché il prof mi disse che i bit del PORT A erano organizzati in questo modo:
Codice: Seleziona tutto
   RA4  RA3  RA2  RA1  RA0
    0      0      0      0      0


e quindi mettendo un 1 al posto dello zero impostavo il terminale come ingresso. Infatti volevo solamente impostare RA0 ed RA2 come ingresso per i pulsanti. In effetti credo di aver dimenticato di mettere 0b per indicare la notazione binaria. #-o Comunque facendo il build per il file HEX MPLAB mi da questi errori:
Codice: Seleziona tutto
Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\Users\LOLman\Desktop\led pulsanti\led pulsanti.mcs".
Clean: Done.
Executing: "C:\Program Files (x86)\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F84A "led pulsanti.asm" /l"led pulsanti.lst" /e"led pulsanti.err"
Warning[205] C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 1 : Found directive in column 1. (list)
Warning[205] C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 2 : Found directive in column 1. (include)
Warning[205] C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 3 : Found directive in column 1. (__CONFIG)
Warning[224] C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 16 : Use of this instruction is not recommended.
Warning[202] C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 17 : Argument out of range.  Least significant bits used.
Warning[224] C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 18 : Use of this instruction is not recommended.
Error[113]   C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 27 : Symbol not previously defined (SUB)
Error[112]   C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 27 : Missing operator
Error[113]   C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 30 : Symbol not previously defined (SUB)
Error[112]   C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 30 : Missing operator
Warning[207] C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 35 : Found label after column 1. (SUB)
Error[122]   C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 35 : Illegal opcode (LEFT)
Error[113]   C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 40 : Symbol not previously defined (SUB)
Error[112]   C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 40 : Missing operator
Warning[207] C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 44 : Found label after column 1. (SUB)
Error[122]   C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 44 : Illegal opcode (RIGHT)
Error[113]   C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 49 : Symbol not previously defined (SUB)
Error[112]   C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 49 : Missing operator
Error[129]   C:\USERS\LOLMAN\DESKTOP\LED PULSANTI\LED PULSANTI.ASM 50 : Expected (END)
Halting build on first failure as requested.


Non riesco a capire cosa non va :?
Avatar utente
Foto UtenteFranklan
3 2
 
Messaggi: 10
Iscritto il: 12 nov 2012, 16:28

0
voti

[4] Re: Aiuto programmazione PIC 16F84A

Messaggioda Foto Utentesimo85 » 2 apr 2014, 15:42

Come prima cosa manca la direttiva

Codice: Seleziona tutto
end


a fine codice.

Se riesci a riformattare il codice in forma ordinata ed in maniera tale che i commenti non facciano un ritorno di linea, meglio. :D

Appena posso, quando avró tempo, lo compilo con MPLABX vediamo se risolviamo gli errori di sintassi almeno. :-)
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[5] Re: Programmazione PIC 16F84A

Messaggioda Foto UtenteFranklan » 2 apr 2014, 17:21

Questo è il codice corretto con i tuoi suggerimenti:

Codice: Seleziona tutto
list p=16f84a
include   "p16f84a.inc"
__CONFIG _CP_OFF & _PWRTE_OFF  &  _WDT_OFF & _XT_OSC

     
USCITA   EQU  0E    ;uscita al led usato anche per la rotazione
CARRY    EQU  00    ;Bit di riporto C del registro Status



;inizializzazione
INIT ORG    0000H
    MOVLW   00                              ; muovi 0 in W
    TRIS    PORTB                           ; configura PORT B come uscita
    MOVLW   0b00000101                ; byte di configurazione come ingressi di RA0 ed RA2
    TRIS    PORTA                           ; configura RA0 ed RA2 come ingressi
    MOVLW   01                              ; muovi 1 in W
    MOVWF   USCITA                       ; muovi 1 in USCITA


;programma principale

LEFT:   BCF  STATUS, CARRY       ; azzero il bit di carry
        BTFSC  PORTA,0                 ; testiamo RA0, per vedere se il pulsante di rotazione a sinistra è premuto
        GOTO   SUB LEFT                ; vai alla subroutine di rotazione a sinistra
        GOTO   RIGHT                    ; se RA0 è uguale a 0, testo RA2 per vedere se il pulsante di destra è  premuto
RIGHT:  BTFSC  PORTA,2            ; testo RA2, se è a 1 svolgo l'istruzione successiva, se è a 0 salto
        GOTO   SUB RIGHT             ; vai alla subroutine di rotazione a destra
        GOTO   LEFT                      ; altrimenti torna a testare il pulsante di sinistra

;Subroutine di rotazione a snistra

SUB LEFT:  RLF  USCITA                ; ruota l'uscita a sinistra
            BTFSS  STATUS, CARRY      ; testa il bit di riporto, se è a 0 svolgi l'istruzione successiva, se è a 1 salta
            GOTO  LEFT                      ; vai al programma principale, sezione LEFT
            MOVLW  01                       ; muovi 1 in W
            MOVWF  USCITA                ; muovi 1 in USCITA
            GOTO  SUB LEFT               ; torna all'inizio della subroutine di rotazione sinistra
 
;Subroutine di rotazione a destra

SUB RIGHT: RRF  USCITA                ; ruota l'uscita a destra
            BTFSS  STATUS, CARRY       ; testa il bit di riporto, se è a 0 svolgi l'istruzione successiva, se è a 1 salta
            GOTO  RIGHT                     ; vai al programma principale, sezione RIGHT
            MOVLW 01                          ; muovi 1 in W
            MOVWF USCITA                   ; muovi 1 in USCITA
            GOTO  SUB RIGHT               ; torna all'inizio della subroutine di rotazione a destra
END


Così dovrebbe andare meglio anche se non so perché mi toglie gli spazi tra l'istruzione ed il commento, mettendoli molto vicini. Comunque grazie mille per l'aiuto Simo iOi
Avatar utente
Foto UtenteFranklan
3 2
 
Messaggi: 10
Iscritto il: 12 nov 2012, 16:28

1
voti

[6] Re: Programmazione PIC 16F84A

Messaggioda Foto Utentesimo85 » 2 apr 2014, 20:32

Dato che odio profondamente nella maniera più perversa i codici non commentati e mal indentati :D
mi sono permesso di formattare meglio il tuo codice.

PS: il codie si copia racchiuso dentro i tag code, e non dopo. ;-)
I primi due messaggi te li ho aggiustati io.

Per capire clicca su cita, ma non rispondere citando. :mrgreen:

Codice: Seleziona tutto
list p=16f84a
include   "p16f84a.inc"
__CONFIG _CP_OFF & _PWRTE_OFF  &  _WDT_OFF & _XT_OSC

     
USCITA   EQU  0E              ; uscita al led usato
                              ; anche per la rotazione
CARRY    EQU  00              ; Bit di riporto C
                              ; del registro Status

;inizializzazione
INIT ORG    0000H
         MOVLW   00           ; muovi 0 in W
         TRIS    PORTB        ; configura PORT B come uscita
         MOVLW   0b00000101   ; byte di configurazione come
                              ; ingressi di RA0 ed RA2
                         
         TRIS    PORTA        ; configura RA0 ed RA2 come ingressi
         MOVLW   01           ; muovi 1 in W
         MOVWF   USCITA       ; muovi 1 in USCITA


;programma principale

LEFT:   
       
        BCF  STATUS, CARRY    ; azzero il bit di carry
        BTFSC  PORTA,0        ; testiamo RA0, per vedere
                              ; se il pulsante di rotazione
                              ; a sinistra è premuto
        GOTO   SUB LEFT       ; vai alla subroutine di
                              ; rotazione a sinistra
        GOTO   RIGHT          ; se RA0 è uguale a 0, testo RA2
                              ; per vedere se il pulsante
                              ; di destra è  premuto
                           
RIGHT:  BTFSC  PORTA,2        ; testo RA2, se è a 1 svolgo
                              ; l'istruzione successiva, se è a 0 salto
        GOTO   SUB RIGHT      ; vai alla subroutine di rotazione a destra
        GOTO   LEFT           ; altrimenti torna a testare
                              ;il pulsante di sinistra

;Subroutine di rotazione a snistra

SUB LEFT:

        RLF  USCITA           ; ruota l'uscita a sinistra
        BTFSS  STATUS, CARRY  ; testa il bit di riporto,
                              ; se è a 0 svolgi l'istruzione
                              ; successiva, se è a 1 salta
        GOTO  LEFT            ; vai al programma principale, sezione LEFT
       
        MOVLW  01             ; muovi 1 in W
        MOVWF  USCITA         ; muovi 1 in USCITA
        GOTO  SUB LEFT        ; torna all'inizio della subroutine
                              ; di rotazione sinistra
 
;Subroutine di rotazione a destra

SUB RIGHT:

        RRF  USCITA           ; ruota l'uscita a destra
        BTFSS  STATUS, CARRY  ; testa il bit di riporto, se è a 0
                              ; svolgi l'istruzione successiva, se è a 1 salta
        GOTO  RIGHT           ; vai al programma principale, sezione RIGHT

        MOVLW 01              ; muovi 1 in W
        MOVWF USCITA          ; muovi 1 in USCITA
        GOTO  SUB RIGHT       ; torna all'inizio della subroutine
                              ; di rotazione a destra
END


Oltre ad aver provato il programma con un microcontrollore reale, hai consultato (oltre al datasheet immagino) la MPASM & Co. User's Guide ?
Se no, ti raccomando di farlo.. -:-

PS2: Vedo che nel tuo programma, non fai uso delle interruzioni.. Dovresti.. Anzi no, devi. ;-)
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

1
voti

[7] Re: Programmazione PIC 16F84A

Messaggioda Foto UtenteFranklan » 3 apr 2014, 19:16

Ah ecco ora ho capito come funziona #-o Comunque, grazie alla guida di MPASM sono riuscito a capire dove era l'errore :D effettivamente non mi riconosceva le label SUB LEFT e SUB RIGHT che io ho utilizzato per la rotazione a sinistra e a destra, cambiandole con UP e DOWN non mi ha dato più problemi, grazie mille iOi . Ho letto il data sheet che però in realtà è questo http://ww1.microchip.com/downloads/en/devicedoc/35007b.pdf e l' ho utilizzato per sapere se gli ingressi che stavo usando e le rispettive uscite erano TTL. Per il resto so già più o meno la struttura interna. Per quanto riguarda le interruzioni, non le ho utilizzate perché l'esercitazione non le prevede (anche perché non ci sono state spiegate :D ). Comunque ora che sono riuscito a creare il file HEX
devo solo programmare il PIC. Anche se effettivamente quel valore binario non ancora mi convince. Esiste un altro modo per impostare RA0 ed RA2 come ingressi senza modificare il valore dei singoli bit?
Avatar utente
Foto UtenteFranklan
3 2
 
Messaggi: 10
Iscritto il: 12 nov 2012, 16:28

0
voti

[8] Re: Programmazione PIC 16F84A

Messaggioda Foto Utentesimo85 » 3 apr 2014, 20:34

Bravo, mi fa piacere che tu abbia consultato la guida. :D

Franklan ha scritto:Per quanto riguarda le interruzioni, non le ho utilizzate perché l'esercitazione non le prevede (anche perché non ci sono state spiegate).

Perfetto. Allora cerchiamo di risolvere il problema senza interruzioni.
Se vuoi, successivamente, ti posso aiutare con le interruzioni.

Franklan ha scritto: Anche se effettivamente quel valore binario non ancora mi convince

Beh per quello basta leggere attentamente cosa dice il datasheet (l'ultimo che hai linkato) a pag. 17, dove hai un esempio in MPASM con tanto di relativa spiegazione più la spiegazione generale.. :D
Se vuoi settare RA0 ed RA2 come ingressi, il valore va bene.

Comunque non mi ricordavo dell' istruzione TRIS.. Io ho sempre fatto così:

Codice: Seleziona tutto
   movlw 0x05
   movwf TRISA


Franklan ha scritto:Esiste un altro modo per impostare RA0 ed RA2 come ingressi senza modificare il valore dei singoli bit?

Mmm ... se vuoi settare i bit di una o più uscite (ma non tutte), puoi usare le istruzioni bsf (pag. 37), o quella che hai già usato.. Ambi i metodi usano due istruzioni (nel tuo caso).
Se devi settare due o più bit, tanto vale caricare prima il valore nell' accumulatore in una volta sola e successivamente copiarlo nel registro di destinazione.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[9] Re: Programmazione PIC 16F84A

Messaggioda Foto Utentebladeblaze » 3 apr 2014, 20:57

Non sono affatto un esperto in programmazione, però credo che nella realtà avrai qualche problema con quel listato:
credo che appena premerai uno dei pulsanti ti si accenderanno solo il primo e/o l'ultimo led.
Poi così mi sembra che manchi qualche direttiva, ma devo dire che i 16f non li ho mai programmati, ho programmato solo il 18f..programmato è una parola un po' grossa..
Hai modo di postare uno schema semplficato in fidocad?

Edit:secondo me non funzionerà, a me sembra manchi qualcosa, a meno che mpasm non riesca ad interpretare alcune volontà del programmatore. In ogni caso il codice mi sembra un po' macchinoso, incompleto e forse inelegante se mi si passa il termine. In ogni caso provo a buttare giù 2 righe. Voglio comunque sottolineare ancora una volta che posso sbagliare.
Avatar utente
Foto Utentebladeblaze
503 5 11
Frequentatore
Frequentatore
 
Messaggi: 248
Iscritto il: 1 dic 2011, 0:42
Località: Trento

0
voti

[10] Re: Programmazione PIC 16F84A

Messaggioda Foto Utentebladeblaze » 4 apr 2014, 0:51

Ordunque. Le porte non sono affatto inizializzate come si deve. Programmare un PIC in assembler significa scrivere ogni singola istruzione passo per passo.
Se dici ad una persona esci dalla porta questa persona va, controlla se la porta è aperta, in caso la apre, esce e forse la chiude.
Per far fare la stessa cosa ad un PIC devi dargli tutte le singole istruzioni (in assembly):
-vai alla porta
-controlla se la porta è aperta
FALSO-vai alla routine apri_porta
VERO-vai alla ruoutine esci_dalla_porta
Ok, sembra stupido, è stupido, ma funziona così.

Quindi per inizializzare una porta secondo perfetto stile di programmazione devi:
Codice: Seleziona tutto
MOVLW 0bx00000000 ;setto al valore desiderato l'accumulatore
MOVWF TRISB  ;sposto il valore desiderato al registro di mio interesse

MOVLW 0bx00000101 ;setto al valore desiderato l'accumulatore
MOVWF TRISA ;sposto il valore desiderato al registro di mio interesse


Per una migliore lettura e rilettura del codice da parte tua e degli altri ti consiglio alcune cose cose, la prima è quella di utilizzare lo stesso tipo di numerazione (binaria, esadecimale, decimale, ottale etc..) per le stesse funzioni che esegue il PIC; ad esmpio personalmente anche io uso sempre i valori binari per settare le porte, perché mi risulta più immediato capire cosa fa quella porta rispetto ad altre numerazioni, se anche tu fai così però devi farlo sempre, e non cambiare come ti fa più comodo, il codice sopra lo avrei potuto scrivere anche così:
Codice: Seleziona tutto
MOVLW 0 ;setto al valore desiderato l'accumulatore
MOVWF TRISB  ;sposto il valore desiderato al registro di mio interesse

MOVLW 0bx00000101 ;setto al valore desiderato l'accumulatore
MOVWF TRISA ;sposto il valore desiderato al registro di mio interesse


però non sta così bene come il primo esempio di codice ed inoltre può risultare più difficile da capire...ricapitolando, usa una convenzione e poi rispettala sempre.

Non ho mai programmato i 16f, ma sapevo che bisogna sempre indicare il banco ram sul quale si lavora (banco 0 e banco 1) ma qui non lo vedo fatto, se non sbaglio è un bit del registro STATUS,che deve essere settato od azzerato.

perché chiami Count_1 e Count_2 ma poi non li utilizzi?

Il modo in cui gestisci i tasti di imput è totalmente sbagliato; devi capire che sebbene il PIC esegua una sola istruzione alla volta, lo fa molto velocemente, quindi (se il tuo listato funzionasse) otterresti questo effetto:
Controllo se il pulsante è schiacciato (livello alto basso in base ai casi);
Vado alla routine di programma;
Eseguo vari controlli ed istruzione del programma;
Ritorno al controllo tasti.
A questo punto vista la velocità del PIC e la lentezza del dito il PIC ritroverà ancora il tasto schiacciato e ripeterà l'istruzione e così via fino a che non lascerai il pulsante, ma per quel tempo il PIC avrà già eseguito parecchie volte la tua routine.

Per evitare tutto questo dovresti implementare delle pause, le più semplici si eseguono facendo eseguire conteggi al PIC, dopo di che quando sono sicuro che il pulsante è stato davvero premuto e che non sia ne una qualche interferenza sul circuito od una pressione non voluta è meglio controllare che il pulsante sia stato rilasciato prima di far eseguire l'istruzione desiderata (sempre che tu non voglia che in caso di pressione prolungate il led si continui a spostare,ma anche in questo cosa servirà introdurre dei tempi di conteggio adeguati).
Spostamento singolo con controllo del numero delle pressioni sul tasto:
Opzione A:
Codice: Seleziona tutto
Controllo pressione tasto;
Il tasto è premuto;
Aspetto x tempo (0.150-0.300 secondi dovrebbero essere adeguati)
Controllo che il tasto sia ancora premuto;
  FALSO:Tasto premuto erroneamente, torno a controllare la pressione tasti.
  VERO:Il tasto è premuto volontariamente
Eseguo il programma.
Controllo continuamente il tasto fino a che non torna a riposo.
Torno all'inizio.


Opzione B:
Codice: Seleziona tutto
Controllo pressione tasto;
Il tasto è premuto;
Aspetto x tempo (0.150-0.300 secondi dovrebbero essere adeguati)
Controllo che il tasto sia ancora premuto;
  FALSO:Tasto premuto erroneamente, torno a controllare la pressione tasti.
  VERO:Il tasto è premuto volontariamente
Controllo continuamente il tasto fino a che non torna a riposo.
quando il tasto torna a riposo eseguo il programma;
Torno all'inizio.


Sono 2 tipi di programmazioni diverse, il risultato in sintesi è lo stesso, ma le tempistiche sono leggermente diverse ed i momenti di esecuzione sono leggermente diversi, cn un po' di immaginazione penso che tu riesca a capire i diversi effetti che avremo, in ogni caso il risultato finale sarà che il led acceso si sposta di uno ad ogni singola pressione del tasto.

Qualora lo volessi possiamo fare in modo che il led si sposti ancora se il tasto è premuto a lungo:
Codice: Seleziona tutto
Controllo pressione tasto;
Il tasto è premuto;
Aspetto x tempo (0.150-0.300 secondi dovrebbero essere adeguati)
Controllo che il tasto sia ancora premuto;
  FALSO:Tasto premuto erroneamente, torno a controllare la pressione tasti.
  VERO:Il tasto è premuto volontariamente
Eseguo il programma.
Controllo se il tasto è ancora premuto; (questo lo chiamiamo punto Z, vedi sotto)
Aspetto x tempo (in questo caso direi 0,5 0,6 secondi)
Controllo che il tasto sia ancora premuto;
  FALSO:Torno all'inizio
  VERO: esguo nuovamente il programma
torno al punto Z.


Volendo potremmo settare una modalità di default e definire via software degli eventi che determino poi in seguito diverse modalità di comportamento, così da poter avere tutte le modalità sopra elencate o anche altre.

Ultimo punto della paternale :mrgreen:
Personalmente per controllare quando il primo o l'ultimo led è acceso e quindi alla pressione del tasto LEFT o RIGHT il programma non deve fare nulla utilizzerei una delle due seguenti modalità;
Modalità A, utilizzo un registro dedicato che incremento o decremento in base al move left move right:
Codice: Seleziona tutto
Controllo valore registro che non sia al limite (0 o 3; oppure 1 o 4)
Se il registro è ok eseguo il programma;
Incremento o decremento il registro;
Esco alla routine tasti;


Ovviamente se il registro ha raggiunto uno dei limiti non faccio nulla e torno direttamente al controllo tasti; questo modo è un po' più complesso, potrebbe essere utile come esercitazione.

Questa modalità è più semplice:
Modalità B, controllo quale dei led è acceso ed in caso eseguo il programma:
Codice: Seleziona tutto
Controllo lo status del bit LED1 o LED4 tramite il BTFSS o BTFSC, dipende dallo schema elettrico.
Se il led può essere acceso eseguo il programma.
Esco alla routine tasti.


Come vedi questa modalità è più semplice, ma se non vado errato nella famiglia dei pic16f va fatta bene per via di alcune caratteristiche costruttive specifiche che sono state (a mio parere) migliorate nei pic18f.

Spero di non averti annoiato, se hai problemi scrivi che noi siamo qui.
In ogni caso se ti è possibile metti su tramite fidocadj lo schemino del circuito, potrebbe essere utile. (Trovi le istruzioni nella sezione Help).
O_/ O_/ O_/ O_/ O_/ O_/ O_/
Avatar utente
Foto Utentebladeblaze
503 5 11
Frequentatore
Frequentatore
 
Messaggi: 248
Iscritto il: 1 dic 2011, 0:42
Località: Trento


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti