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
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).
