salve a tutti , ho fatto una centralina per pilotare dei rele , e houn problema , i 5 giochi sono troppo veloci , per evitare di riscrivere e riprogramare il pic ormai montato in 2 giorni devo risolvere il problema di rallentare il ciclo macchina , ho pensato se al posto di un quarzo da 4mhz si mette uno da 3 mhz si riesce a rallentare il gioco di luci ??
ecco il listato , " santo aiutami tu hihihi " :grin: abbraccino abbraccino :up: :up: :up:
PROCESSOR PIC16F84
INCLUDE "P16F84.INC"
ORG 0
CONT1 EQU 0CH
CONT2 EQU 0DH
CONT3 EQU 0EH
CONT4 EQU 0FH
CONT5 EQU 10H
CONT6 EQU 11H
MOVLW 0FFH
TRIS 05H
MOVLW 00H
TRIS 06H
MOVLW 00H
MOVWF 06H
inizio:
clrf PORTB
btfsc PORTA, 4
goto SCHEMA1
btfsc PORTA, 3
goto SCHEMA1
btfsc PORTA, 2
goto SCHEMA1
btfsc PORTA, 1
goto SCHEMA1
btfsc PORTA, 0
goto SCHEMA1
goto inizio
SCHEMA1: BTFSS 05H,0
GOTO SCHEMA2
MOVLW 00H
MOVWF PORTB
GOTO PRO1
SCHEMA2: BTFSS 05H,1
GOTO SCHEMA3
MOVLW 00H
MOVWF 06H
GOTO PRO2
SCHEMA3: BTFSS 05H,2
GOTO SCHEMA4
MOVLW 00H
MOVWF 06H
GOTO PRO3
SCHEMA4: BTFSS 05H,3
GOTO SCHEMA5
MOVLW 00H
MOVWF 06H
GOTO PRO4
SCHEMA5: BTFSS 05H,4
GOTO SCHEMA1
MOVLW 00H
MOVWF 06H
GOTO PRO5
PRO1: MOVLW 00H
MOVWF 06H
CALL RIT
MOVLW 81H
MOVWF 06H
CALL RIT
MOVLW 0C3H
MOVWF 06H
CALL RIT
MOVLW 0E7H
MOVWF 06H
CALL RIT
MOVLW 0FFH
MOVWF 06H
CALL RIT
MOVLW 0E7H
MOVWF 06H
CALL RIT
MOVLW 0C3H
MOVWF 06H
CALL RIT
MOVLW 81H
MOVWF 06H
CALL RIT
MOVLW 00H
MOVWF 06H
CALL RIT
btfss PORTA, 0
goto inizio
GOTO PRO1
PRO2: MOVLW 01H
MOVWF 06H
CALL RIT
MOVLW 02H
MOVWF 06H
CALL RIT
MOVLW 04H
MOVWF 06H
CALL RIT
MOVLW 08H
MOVWF 06H
CALL RIT
MOVLW 10H
MOVWF 06H
CALL RIT
MOVLW 20H
MOVWF 06H
CALL RIT
MOVLW 40H
MOVWF 06H
CALL RIT
MOVLW 80H
MOVWF 06H
CALL RIT
MOVLW 40H
MOVWF 06H
CALL RIT
MOVLW 20H
MOVWF 06H
CALL RIT
MOVLW 10H
MOVWF 06H
CALL RIT
MOVLW 08H
MOVWF 06H
CALL RIT
MOVLW 04H
MOVWF 06H
CALL RIT
MOVLW 02H
MOVWF 06H
CALL RIT
MOVLW 01H
MOVWF 06H
CALL RIT
MOVLW 02H
MOVWF 06H
CALL RIT
MOVLW 04H
MOVWF 06H
CALL RIT
MOVLW 08H
MOVWF 06H
CALL RIT
MOVLW 10H
MOVWF 06H
CALL RIT
MOVLW 20H
MOVWF 06H
CALL RIT
MOVLW 40H
MOVWF 06H
CALL RIT
MOVLW 80H
MOVWF 06H
CALL RIT
MOVLW 40H
MOVWF 06H
CALL RIT
MOVLW 20H
MOVWF 06H
CALL RIT
MOVLW 10H
MOVWF 06H
CALL RIT
MOVLW 08H
MOVWF 06H
CALL RIT
MOVLW 04H
MOVWF 06H
CALL RIT
MOVLW 02H
MOVWF 06H
CALL RIT
MOVLW 01H
MOVWF 06H
CALL RIT
MOVLW 02H
MOVWF 06H
CALL RIT
MOVLW 04H
MOVWF 06H
CALL RIT
MOVLW 08H
MOVWF 06H
CALL RIT
MOVLW 10H
MOVWF 06H
CALL RIT
MOVLW 20H
MOVWF 06H
CALL RIT
MOVLW 40H
MOVWF 06H
CALL RIT
MOVLW 80H
MOVWF 06H
CALL RIT
MOVLW 40H
MOVWF 06H
CALL RIT
MOVLW 20H
MOVWF 06H
CALL RIT
MOVLW 10H
MOVWF 06H
CALL RIT
MOVLW 08H
MOVWF 06H
CALL RIT
MOVLW 04H
MOVWF 06H
CALL RIT
MOVLW 02H
MOVWF 06H
CALL RIT
MOVLW 01H
MOVWF 06H
CALL RIT
MOVLW 02H
MOVWF 06H
CALL RIT
MOVLW 04H
MOVWF 06H
CALL RIT
MOVLW 08H
MOVWF 06H
CALL RIT
MOVLW 10H
MOVWF 06H
CALL RIT
MOVLW 20H
MOVWF 06H
CALL RIT
MOVLW 40H
MOVWF 06H
CALL RIT
MOVLW 80H
MOVWF 06H
CALL RIT
MOVLW 40H
MOVWF 06H
CALL RIT
MOVLW 20H
MOVWF 06H
CALL RIT
MOVLW 10H
MOVWF 06H
CALL RIT
MOVLW 08H
MOVWF 06H
CALL RIT
MOVLW 04H
MOVWF 06H
CALL RIT
MOVLW 02H
MOVWF 06H
CALL RIT
MOVLW 01H
MOVWF 06H
btfss PORTA, 1
goto inizio
GOTO PRO2
PRO3: MOVLW 01H
MOVWF 06H
CALL RIT
MOVLW 03H
MOVWF 06H
CALL RIT
MOVLW 07H
MOVWF 06H
CALL RIT
MOVLW 0FH
MOVWF 06H
CALL RIT
MOVLW 1FH
MOVWF 06H
CALL RIT
MOVLW 3FH
MOVWF 06H
CALL RIT
MOVLW 7FH
MOVWF 06H
CALL RIT
MOVLW 0FFH
MOVWF 06H
CALL RIT
MOVLW 0FEH
MOVWF 06H
CALL RIT
MOVLW 0FCH
MOVWF 06H
CALL RIT
MOVLW 0F8H
MOVWF 06H
CALL RIT
MOVLW 0F0H
MOVWF 06H
CALL RIT
MOVLW 0E0H
MOVWF 06H
CALL RIT
MOVLW 0C0H
MOVWF 06H
CALL RIT
MOVLW 80H
MOVWF 06H
CALL RIT
MOVLW 0C0H
MOVWF 06H
CALL RIT
MOVLW 0E0H
MOVWF 06H
CALL RIT
MOVLW 0F0H
MOVWF 06H
CALL RIT
MOVLW 0F8H
MOVWF 06H
CALL RIT
MOVLW 0FCH
MOVWF 06H
CALL RIT
MOVLW 0FEH
MOVWF 06H
CALL RIT
MOVLW 0FFH
MOVWF 06H
CALL RIT
MOVLW 7FH
MOVWF 06H
CALL RIT
MOVLW 3FH
MOVWF 06H
CALL RIT
MOVLW 1FH
MOVWF 06H
CALL RIT
MOVLW 0FH
MOVWF 06H
CALL RIT2
MOVLW 07H
MOVWF 06H
CALL RIT2
MOVLW 03H
MOVWF 06H
CALL RIT2
MOVLW 01H
MOVWF 06H
CALL RIT2
btfss PORTA, 2
goto inizio
GOTO PRO3
PRO4: MOVLW 00H
MOVWF 06H
CALL RIT
CALL RIT
CALL RIT
MOVLW 01H
MOVWF 06H
CALL RIT
CALL RIT
CALL RIT
MOVLW 00H
MOVWF 06H
CALL RIT
CALL RIT
CALL RIT
MOVLW 01H
MOVWF 06H
CALL RIT
CALL RIT
CALL RIT
MOVLW 00H
MOVWF 06H
CALL RIT
CALL RIT
CALL RIT
MOVLW 01H
MOVWF 06H
CALL RIT
CALL RIT
CALL RIT
MOVLW 00H
MOVWF 06H
CALL RIT
CALL RIT
CALL RIT
MOVLW 01H
MOVWF 06H
CALL RIT
MOVLW 02H
MOVWF 06H
CALL RIT
MOVLW 04H
MOVWF 06H
CALL RIT
MOVLW 08H
MOVWF 06H
CALL RIT
MOVLW 10H
MOVWF 06H
CALL RIT
MOVLW 20H
MOVWF 06H
CALL RIT
MOVLW 40H
MOVWF 06H
CALL RIT
MOVLW 80H
MOVWF 06H
CALL RIT
MOVLW 40H
MOVWF 06H
CALL RIT
MOVLW 20H
MOVWF 06H
CALL RIT
MOVLW 10H
MOVWF 06H
CALL RIT
MOVLW 08H
MOVWF 06H
CALL RIT
MOVLW 04H
MOVWF 06H
CALL RIT
MOVLW 02H
MOVWF 06H
CALL RIT
MOVLW 01H
MOVWF 06H
CALL RIT
btfss PORTA, 3
goto inizio
GOTO PRO4
PRO5: MOVLW 00H
MOVWF 06H
CALL RIT3
CALL RIT3
MOVLW 18H
MOVWF 06H
CALL RIT3
CALL RIT3
MOVLW 00H
MOVWF 06H
CALL RIT3
CALL RIT3
MOVLW 18H
MOVWF 06H
CALL RIT3
CALL RIT3
MOVLW 00H
MOVWF 06H
CALL RIT3
CALL RIT3
MOVLW 18H
MOVWF 06H
CALL RIT3
CALL RIT3
MOVLW 00H
MOVWF 06H
CALL RIT3
CALL RIT3
MOVLW 24H
MOVWF 06H
CALL RIT3
MOVLW 42H
MOVWF 06H
CALL RIT3
MOVLW 81H
MOVWF 06H
CALL RIT3
MOVLW 42H
MOVWF 06H
CALL RIT3
MOVLW 24H
MOVWF 06H
CALL RIT3
MOVLW 00H
MOVWF 06H
CALL RIT3
btfss PORTA, 4
goto inizio
GOTO PRO5
RIT: MOVLW 78H
MOVWF CONT1
LOOP2: MOVLW 93H
MOVWF CONT2
LOOP1: DECFSZ CONT2
GOTO LOOP1
DECFSZ CONT1
GOTO LOOP2
RETURN
RIT2: MOVLW 94H
MOVWF CONT3
LOOP4: MOVLW 93H
MOVWF CONT4
LOOP3: DECFSZ CONT4
GOTO LOOP3
DECFSZ CONT3
GOTO LOOP4
RETURN
RIT3: MOVLW 79H
MOVWF CONT5
LOOP6: MOVLW 70H
MOVWF CONT6
LOOP5: DECFSZ CONT6
GOTO LOOP5
DECFSZ CONT5
GOTO LOOP6
RETURN
END
potresti inserire, dove vuoi, delle chiamate "sleep"
http://utenti.multimania.it/americanchip/pic/sleep.htm (http://utenti.multimania.it/americanchip/pic/sleep.htm)
:birra:
Perchè invece di utilizzare il quarzo non usi un oscillatore R-C?
Di quanto vorresti rallentare le routine?
Se usi il quarzo da 3 MHz invece di quello da 4 ottieni solo un incremente di 1/4 di tempo, ti è sufficiente?
Con la rete R-C puo oscillare fino a 200 KHz; con i risonatori ceramici, quelli a tre piedini, puoi spaziare fino a 4 MHz, tutto dipende dalle tue esigenze.
Comunque sul datasheet trovi tutte le informazioni precise, anche sui valori dei condensatori da utilizzare.
Saluti, Lino
Citazione di: Lino il 14 Febbraio 2012, 13:21:14
Perchè invece di utilizzare il quarzo non usi un oscillatore R-C?
Di quanto vorresti rallentare le routine?
Se usi il quarzo da 3 MHz invece di quello da 4 ottieni solo un incremente di 1/4 di tempo, ti è sufficiente?
Con la rete R-C puo oscillare fino a 200 KHz; con i risonatori ceramici, quelli a tre piedini, puoi spaziare fino a 4 MHz, tutto dipende dalle tue esigenze.
Comunque sul datasheet trovi tutte le informazioni precise, anche sui valori dei condensatori da utilizzare.
Saluti, Lino
la scia e troppo veloce tantevvero che i rele scattano velocissimi e non si capisce con le lampade a incandescenza , bastarebbe un poco rallentare il ciclo e di conseguenza tutti i giochi memorizzati per capire meglio posto un video , la centralita pilota un carro di carnevale io sono messo all'interno della cabine dove i trasformatori portano le fasi ai contatti dei rele , su ogni contatto dei rele ci sono un massimo di 60 lampade quindi le prime file di tutti i pupazzi , leseconde ,leterze ecc ecc,
ecco un video spero che si capisca !
Se non sbaglio, tutta la tempistica fà riferimento alle 3 routine (RIT, RIT2, e RIT3); raddoppia i valori delle costanti alla prima riga di ogni routine (di più non puoi fare) e verifica come cambiano gli effetti.
C'è ancora margine per rallentare le singole routine ma dipende dal risultato che si vuole ottenere.
Saluti, Lino
Citazione di: Lino il 14 Febbraio 2012, 14:09:09
Se non sbaglio, tutta la tempistica fà riferimento alle 3 routine (RIT, RIT2, e RIT3); raddoppia i valori delle costanti alla prima riga di ogni routine (di più non puoi fare) e verifica come cambiano gli effetti.
C'è ancora margine per rallentare le singole routine ma dipende dal risultato che si vuole ottenere.
Saluti, Lino
in ogniuno di questi blocchi quale valore raddoppio ???
RIT: MOVLW 78H
MOVWF CONT1
LOOP2: MOVLW 93H
MOVWF CONT2
LOOP1: DECFSZ CONT2
GOTO LOOP1
DECFSZ CONT1
GOTO LOOP2
RETURN
Quello della prima riga
RIT: MOVLW 78H
MOVWF CONT1
LOOP2: MOVLW 93H
MOVWF CONT2
LOOP1: DECFSZ CONT2
GOTO LOOP1
DECFSZ CONT1
GOTO LOOP2
RETURN
Citazione di: Lino il 14 Febbraio 2012, 19:21:07
Quello della prima riga
RIT: MOVLW 78H
MOVWF CONT1
LOOP2: MOVLW 93H
MOVWF CONT2
LOOP1: DECFSZ CONT2
GOTO LOOP1
DECFSZ CONT1
GOTO LOOP2
RETURN
grazie lino provo subito anche perche mi resta poco tempo vediamo se riesco ! e speriamo che nella compilazione non mi dia nessun problema !!
vi faccio sapere :up: :up:
Citazione di: scienziato il 14 Febbraio 2012, 19:23:16
Citazione di: Lino il 14 Febbraio 2012, 19:21:07
Quello della prima riga
RIT: MOVLW 78H
MOVWF CONT1
LOOP2: MOVLW 93H
MOVWF CONT2
LOOP1: DECFSZ CONT2
GOTO LOOP1
DECFSZ CONT1
GOTO LOOP2
RETURN
grazie lino provo subito anche perche mi resta poco tempo vediamo se riesco ! e speriamo che nella compilazione non mi dia nessun problema !!
vi faccio sapere :up: :up:
ho cambiato i valori segnati da te lino ma nulla non cambia nulla tutti i giochi sono sempre veloci , ho notato pero che se tocco il quarzo con il dito e lo sfioro senza premerlo troppo il gioco rallenta !!!
Citazione di: scienziato il 14 Febbraio 2012, 20:05:02
Citazione di: scienziato il 14 Febbraio 2012, 19:23:16
Citazione di: Lino il 14 Febbraio 2012, 19:21:07
Quello della prima riga
RIT: MOVLW 78H
MOVWF CONT1
LOOP2: MOVLW 93H
MOVWF CONT2
LOOP1: DECFSZ CONT2
GOTO LOOP1
DECFSZ CONT1
GOTO LOOP2
RETURN
grazie lino provo subito anche perche mi resta poco tempo vediamo se riesco ! e speriamo che nella compilazione non mi dia nessun problema !!
vi faccio sapere :up: :up:
ho cambiato i valori segnati da te lino ma nulla non cambia nulla tutti i giochi sono sempre veloci , ho notato pero che se tocco il quarzo con il dito e lo sfioro senza premerlo troppo il gioco rallenta !!!
ho provato a metterci 30h e come non detto adesso sono velocissimi , quindi non bastava raddoppiarli , provo a metterci un 300 vediamo che succede!!
Scusa, ma 78H equivale a 120 decimale; il doppio è 240 che equivale a F0H.
Mi sfugge qualcosa?
Saluti, Lino
Citazione di: Lino il 14 Febbraio 2012, 21:47:20
Scusa, ma 78H equivale a 120 decimale; il doppio è 240 che equivale a F0H.
Mi sfugge qualcosa?
Saluti, Lino
no no hai perfettamente ragione lino non avevo scritto giusto il valore in esadecimale adesso funziona :) :up: :up: :up: :up:
volendo potevi fare una routine dove tramite un pulsante ti incrementava un registro che veniva caricato come numero per il ritardo...
io ti avevo detto che se mi facevi sapere la sequenza delle uscite ti potevo aiutare a compilare il prog.
ma da come vedo già tutto risolto :up: :birra:
Citazione di: Santo il 15 Febbraio 2012, 06:43:45
volendo potevi fare una routine dove tramite un pulsante ti incrementava un registro che veniva caricato come numero per il ritardo...
io ti avevo detto che se mi facevi sapere la sequenza delle uscite ti potevo aiutare a compilare il prog.
ma da come vedo già tutto risolto :up: :birra:
vorrei invece sapere adesso santo guardando uno dei programmi che fa l'effetto luce , " in tutto sono 5 "
le uscite del pic e i corrispondenti valori che lui mette, in modo che posso poi fare altre combinazioni per fare altri giochi , cosi magari esempio 06h oc3h ecc a che pin di uscita corrispondono ?? :up: :up:
Non conosco in dettaglio il linguaggio che stai usando, però ti suggerisco di vedere se è prevista un'istruzione di waiting, come per il C o il linguaggio dei microcontrollori ST6.
A quanto ho capito il tuo non è un problema hardware ma software e quindi bisognerebbe trovare via software la soluzione.
Tra l'altro la teoria degli algoritmi ci insegna che un computer lo rendi più veloce non mettendoci un processore a decine di GHZ, ma scrivendo algoritmi efficienti (ecco perché Linux computa più velocemente di Windows il risultato per lo stesso problema di calcolo). Ribaltando il criterio allora dovresti scrivere un algoritmo più lento e non mettere un clock più basso.
Questo almeno è il criterio che seguirei per quel poco che ne so di microcontrollori.
Citazione di: berners27 il 15 Febbraio 2012, 13:08:48
Non conosco in dettaglio il linguaggio che stai usando, però ti suggerisco di vedere se è prevista un'istruzione di waiting, come per il C o il linguaggio dei microcontrollori ST6.
A quanto ho capito il tuo non è un problema hardware ma software e quindi bisognerebbe trovare via software la soluzione.
Tra l'altro la teoria degli algoritmi ci insegna che un computer lo rendi più veloce non mettendoci un processore a decine di GHZ, ma scrivendo algoritmi efficienti (ecco perché Linux computa più velocemente di Windows il risultato per lo stesso problema di calcolo). Ribaltando il criterio allora dovresti scrivere un algoritmo più lento e non mettere un clock più basso.
Questo almeno è il criterio che seguirei per quel poco che ne so di microcontrollori.
ho gia risolto il problema velocità cambiando il valore sulla runtine rit aumentandolo !! adesso va bene :up: :up:
Citazione di: berners27 il 15 Febbraio 2012, 13:08:48
Non conosco in dettaglio il linguaggio che stai usando, però ti suggerisco di vedere se è prevista un'istruzione di waiting, come per il C o il linguaggio dei microcontrollori ST6.
A quanto ho capito il tuo non è un problema hardware ma software e quindi bisognerebbe trovare via software la soluzione.
Tra l'altro la teoria degli algoritmi ci insegna che un computer lo rendi più veloce non mettendoci un processore a decine di GHZ, ma scrivendo algoritmi efficienti (ecco perché Linux computa più velocemente di Windows il risultato per lo stesso problema di calcolo). Ribaltando il criterio allora dovresti scrivere un algoritmo più lento e non mettere un clock più basso.
Questo almeno è il criterio che seguirei per quel poco che ne so di microcontrollori.
Buona giornata.
Mi permetto di inserirmi perchè la tua analisi mi sembra interessante. Però considera che quello utilizzato è un microcontrollore della famiglia base di Microchip di tipo RISC; è stato utilizzato l'assembler che mette a disposizione ben 35 (!) istruzioni elementari e di sicuro non sono disponibili istruzioni di attesa condizionata tranne quella asservita ad un timer interno ad 8 bit. Di conseguenza il più delle volte, se non hai necessità di timing di precisione, sei costretto a fare dei cicli di delay strutturati in base alle necessità. Anche in questo caso bisogna fare attenzione alla nidificazione dei cicli perchè questa famiglia di microcontrollori è dotata di uno stack di solo otto livelli di tipo FIFO ed è sufficiente scambiare un GOTO con un CALL per non raccapezzarsi più.
Nella mia minima esperienza, se non ci sono esigenze particolari e se il ciclo più lungo si compie al massimo nell'arco dei 40-50 millisecondi, preferisco adottare il clock a bassa velocità che ti garantisce un risparmio sia sulle righe del listato che sui componenti.
Scusa se l'ho fatta lunga, saluti, Lino.
Citazione di: Lino il 15 Febbraio 2012, 13:31:57
[..]
Scusa se l'ho fatta lunga, saluti, Lino.
Nono figurati :-D
Piacerebbe anche a me avere un framework hardware di sviluppo per qualche tipo di micro-controller, ma tra st-6, arduino e altre centinaia di alternative, mi manca una visione di insieme per poter decidere cosa adottare e in base cosa si fanno le scelte.
A me piacerebbe imparare ad usare e programmare le stesse soluzioni che vengono realmente-praticamente-operativamente adottate a livello professionale nell'automazione industriale, che tra le centinaia in commercio forse saranno 3-4 al massimo.
Detto questo, mi pare di aver capito che nella tua risposta hai istanziato al caso particolare del mic in oggetto il criterio generale che ho esposto.
Citazione di: scienziato il 15 Febbraio 2012, 12:21:57
Citazione di: Santo il 15 Febbraio 2012, 06:43:45
volendo potevi fare una routine dove tramite un pulsante ti incrementava un registro che veniva caricato come numero per il ritardo...
io ti avevo detto che se mi facevi sapere la sequenza delle uscite ti potevo aiutare a compilare il prog.
ma da come vedo già tutto risolto :up: :birra:
vorrei invece sapere adesso santo guardando uno dei programmi che fa l'effetto luce , " in tutto sono 5 "
le uscite del pic e i corrispondenti valori che lui mette, in modo che posso poi fare altre combinazioni per fare altri giochi , cosi magari esempio 06h oc3h ecc a che pin di uscita corrispondono ?? :up: :up:
Non conosco quel codice scrittto in assembly, conosco un pochino meglio il basic, che a mio avviso è più semplice.
Comunque da quello che ho capito quà ci sono 8 uscite, che vengono accese/spente in sequenza.
Una volta capito il meccanismo, la cosa diventa abbastanza semplice.
In pratica le 8 uscite corrispondono ad un byte, ovvero un numero binario a 8 bit.
Cioè se invio il numero binario 00000000 avrò tutte le uscite spente, se invio il numero binario 00000001 avrò la prima uscita aacesa e le rimanati 7 spente, se invio il numero binario 10000001 avrò la prima e l'ultima uscita accese e le restanti spente.
In questo il caso il numero però viene scritto in esadecimale, quindi basta convertire il byte da invaiare in un umero esadecimale.
Esempio prendiamo il programma 1:
PRO1: MOVLW 00H carica il valore esadecimale 00 che corrsiponde al valore binario 00000000 nel registro
MOVWF 06H invia questo valore nel registro 06H che corrisponde alla portaB quindi gli 8 pin rb0....rb7 assumono il valore 00000000 tutti spenti.
CALL RIT chiama la routine RIT la quale fà attendere al pic un certo tempo
MOVLW 81H carica il valore esadecimale 81 che corrsiponde al valore binario 10000001 nel registro
MOVWF 06H come prima invia il questo valore a portaB , quindi gli 8 pin assumono il valore 10000001, prima e ultima uscita accese il resto spente.
CALL RIT chiama la routine RIT la quale fà attendere al pic un certo tempo
MOVLW 0C3H carica il valore esadecimale 0C3 che corrsiponde al valore binario 11000011 nel registro
MOVWF 06H invia questo valore alla portaB, quindi ora le uscite diventano 11000011, prime 2 e ultime 2 uscite accese. il resto spente.
CALL RIT chiama la routine RIT la quale fà attendere al pic un certo tempo
MOVLW 0E7H carica il valore esadecimale 0E7 che corrsiponde al valore binario 11100111 nel registro
MOVWF 06H invia questo valore alla portaB, quindi ora le uscite diventano 11100111 le prime 3 uscite e le ultime 3 uscite sono accese, le 2 centrali spente.
CALL RIT chiama la routine RIT la quale fà attendere al pic un certo tempo
MOVLW 0FFH carica il valore esadecimale 0FF che corrsiponde al valore binario 11111111 nel registro
MOVWF 06H invia questo valore alla portaB, quindi ora le uscite diventano 11111111 tutte le uscite sono accese
CALL RIT chiama la routine RIT la quale fà attendere al pic un certo tempo
MOVLW 0E7H carica il valore esadecimale 0E7 che corrsiponde al valore binario 11100111 nel registro
MOVWF 06H invia questo valore alla portaB, quindi ora le uscite diventano 11100111 le prime 3 uscite e le ultime 3 uscite sono accese, le 2 centrali spente.
CALL RIT chiama la routine RIT la quale fà attendere al pic un certo tempo
MOVLW 0C3H carica il valore esadecimale 0C3 che corrsiponde al valore binario 11000011 nel registro
MOVWF 06H invia questo valore alla portaB, quindi ora le uscite diventano 11000011, prime 2 e ultime 2 uscite accese. il resto spente.
CALL RIT chiama la routine RIT la quale fà attendere al pic un certo tempo
MOVLW 81H carica il valore esadecimale 81 che corrsiponde al valore binario 10000001 nel registro
MOVWF 06H invia questo valore alla portaB, quindi ora le uscite diventano 10000001, prima e ultima uscita accese il resto spente.
CALL RIT chiama la routine RIT la quale fà attendere al pic un certo tempo
MOVLW 00H carica il valore esadecimale 00 che corrsiponde al valore binario 00000000 nel registro
MOVWF 06H invia questo valore alla portaB, quindi ora le uscite diventano 0000000, uscite tutte spente.
CALL RIT chiama la routine RIT la quale fà attendere al pic un certo tempo
btfss PORTA, 0 controlla l'ingresso porta A0, se è a 0 esegue l'istruzione successiva, viceversa la salta e passa a quella dopo
goto inizio istruzione che viene eseguita solo se l'ingresso A0=0, e in pratica rimanda all'inzio del firmware
GOTO PRO1 rimanda all'inzio del programma1, quindi ripete tutto il programma 1
trucco:
per semplificare le cose invece di scrivere il valore in esadecimale H, si può scrivere direttamente in binario b quindi ad esempio al posto dell'istrzuioni:
MOVLW 0C3H
MOVWF 06H
posso scrivere
MOVLW 11000011b
MOVWF 06H
in questo modo mentre scrivo, visualizzo immediatamente i pin di uscita, senza dover mettermi a fare conversioni da esadecimale a binario.
Citazione di: berners27 il 15 Febbraio 2012, 14:49:06
Citazione di: Lino il 15 Febbraio 2012, 13:31:57
[..]
Detto questo, mi pare di aver capito che nella tua risposta hai istanziato al caso particolare del mic in oggetto il criterio generale che ho esposto.
Si, corretto.
Il numero ristretto di istruzioni complica molto la vita, bisogna adeguarsi.
Per l'automazione industriale, che io sappia, vengono massicciamemte utilizzati i PLC, ma non so se parliamo della stesa cosa.
Saluti, Lino
Citazione di: Lino il 15 Febbraio 2012, 18:42:42
Citazione di: berners27 il 15 Febbraio 2012, 14:49:06
Citazione di: Lino il 15 Febbraio 2012, 13:31:57
[..]
Detto questo, mi pare di aver capito che nella tua risposta hai istanziato al caso particolare del mic in oggetto il criterio generale che ho esposto.
Si, corretto.
Il numero ristretto di istruzioni complica molto la vita, bisogna adeguarsi.
Per l'automazione industriale, che io sappia, vengono massicciamemte utilizzati i PLC, ma non so se parliamo della stesa cosa.
Saluti, Lino
GRAZIE ALINGHI !! VERAMENTE GRAZIE HO CAPITO PERFETTAMENTE POSSO CREARE TUTTE LE COMBINAZIONI CHE VOGLIO E POI RICHIAMARLE DI CONSEGUENZA CONTROLLANDO IL SET DI PORTE IN INGRESSO !! :dance: :dance: :dance: :dance:
per lino ! i plc li usa un ragazzo in un altra comitiva che fanno carri allegorici per azionare i movimenti con i motoriduttori !! quel ragazzo e ungenio , io per il momento mi diverto a creare le centraline con gli effetti luce !!
grazie ragazzi :up: :up: :grin: :grin: :grin:
Citazione di: Alinghi il 15 Febbraio 2012, 16:09:11
trucco:
per semplificare le cose invece di scrivere il valore in esadecimale H, si può scrivere direttamente in binario b quindi ad esempio al posto dell'istrzuioni:
Preferisco anch'io questa soluzione; la situazione degli I/O è diretta e si evita, per quanto possibile, di fare confusione.
Onestamente la notazione esadecimale la evito proprio perchè non ne ho alcuna dimestichezza e utilizzo, a seconda dei casi, il sistema decimale o quello binario.
Saluti, Lino
I PLC hanno già la parte hardware pronta, devi solo programmare e montare i moduli che servono, ho dato una sbirciata a "questo mondo" e la cosa è interessante, ma ci vuole una spesa iniziale per l'acquisto del modulo PLC di circa 130 Euro più i vari moduli... é da provare, appena mi ritrovo qualche euro in più!!
Stavo pensando che per velocizzare il tutto per scienziato può utilizzare una routine con il comando RLF cioè fa lo shift a sinistra del registro o RRF fa lo shift a destra del registroF, e poi questo registro viene messo sulle porte d'uscita.
esempio:
clrf outluci ; cancella il registro outluci
movlw b'00000001' ;carica 1 (in binario) nel registro W
movwf outluci ;copia W (1) in outluci
routine
;inserire il controllo per uscire da questa routine tramite pulsante.
movf outluci,0 ; copia il contenuto di outluci (1) in W
movwf PORTB ; copia W nelle uscite B
call delay ;ritardo che serve per far accendere le luci +o- veloci
RLF outluci,1 ; sposta a sinistra il valore contenuto in outluci cioè da 00000001 diventa 00000010 dopo al successivo 00000100 e così via.
goto routine vai a routine
penso che possa funzionare può anche caricare il numero 00001001 e poi fa RLF
ci sono tanti modi, non è una cosa complicata far uscire 0o1 dalle porte del pic.