timer 24 ore con PIC!

salve, la necessit=E0 =E8 questa: ho da realizzare in pochissimo tempo (24\48 ore massimo) un semplice circuito con pic. =E8 tutto pronto tranne il programma in assembler. non essendo una cima in assembler chiedo help.

il pic (un 16F84A della microchip) deve, all'accensione, interrogare un mini dip switch che, tramite combinazione binaria (il dip in questo caso basta a 2 pin, per un totale di 4 impostazioni selezionabili), selezioner=E0 un tempo di 24, 48, 72, 96 ore. dopo aver letto l'ingresso il pic mette un pin in uscita a livello alto e ce lo tiene finch=E8 non scade il tempo in ore letto all'avvio. dopo si ferma e aspetta o un reset o lo spegnimento e la riaccensione. semplice, niente display o led. niente di niente. nudo e crudo come l'ho descritto.

se c'=E8 qualcuno pratico e ha qualche minuto da perderci, pu=F2 aiutarmi? riguardo alla velocit=E0 di esecuzione istruzioni ho disponibili vari quarzi, fino a 20 mhz.

grazie mille.

Reply to
Linux
Loading thread data ...

"Linux" ha scritto nel messaggio:

Deve essere forzatamete assembler?

Dovresti dare informazioni maggiori sull' hardware che stai usando, ad esempio su quali porte sono i dipswitch, hanno resistenze di pull-up?, meglio secondo me se posti lo schema.

se mi dai queste informazioni lo scrivo prima in basic e poi cerchero' di fare la stessa cosa con il C in modo da vedere anche l'efficienza dei due compilatori, sai sto studiando :-) il C.

il programma che segue non fa quello che chiedi ma e' un ottimo punto dipartenza per quello che chiedi.

define osc 4

TRISIO = %11111101 ' Configurazione porte gpio1 uscita option_reg.6 = 0 ' gp0 gp1 gp3 con pull-up

Symbol LED0 = GPIO.1 symbol ing0 = GPIO.0 symbol timer = gpio.2

tempo var byte v1 var byte

Main: led0 = 0 if ing0 = 0 then gosub controlla_tempo gosub antirimbalzo endif goto Main

controlla_tempo: if timer = 0 then tempo = 10 else tempo = 20 endif return

antirimbalzo: pause 200 if ing0 = 0 then led0 = 1 for v1 = 1 to tempo pause 500 next v1 endif gosub rilascio return

rilascio: if ing0 = 0 then led0 = 0 goto rilascio endif return

Reply to
diego

le porte usatele a piacere voi, poi basta dirle. magari 3 pin solo della porta a o della porta b. riguardo allo schema =E8 inutile postarlo: =E8 il pic in configurazione minima con collegato il suo quarzo da X mhz (dipende da quanto lo vorr=E0 la buonanima che mi aiuta a fare il ciclo di ritardo, tenete conto che il pic in questione arriva al massimo a 20 mhz e una istruzione la fa in 1\4 clock, mentre un salto di memoria lo fa in 1\8 clock.)

scita

si =E8 per un antirimbalzo. penso che trasportandolo in assembler e modificando i cicli di ritardo, mettendo la lettura sui dip, e cicli pi=F9 lunghi e complessi, si ottenga quello che mi serve!!! :)

si sono presenti due res di pullup sul dip. le porte disponibili sono

13...usate quelle che volete (ne servono 3 in tutto...) ti ringrazio per il programma, ma purtroppo si, mi serve in assembler. anche perch=E8 per fare un ciclo di ritardo =E8 meglio usare un basso livello di programmazione. un compilatore da alto livello (come il c o il c++) con cui poi fai il build a un basso, crea una marea di istruzioni (anche inutili) che fanno perdere cicli e cicli, che magari su un cicli di ritardo di un'ora mi equivalgono a minuti in pi=F9. purtroppo quello che mi manca =E8 il tempo e qualche nozione pi=F9 precisa. ma sopratutto il tempo... stasera vedo se riesco a rimettermici...spero!

grazie comunque e vedr=F2 di riuscire ad utilizzare le stringhe che mi hai passato in qualche modo.

Reply to
Matteo

...

...

Ma il programma serve a te o a noi ? Ti piace avere la pappa pronta ;-) ? Sembra quasi che ti dobbiamo svolgere un compito di scuola...

Nessuna applicazione anche minimamente 'seria' effettua il conteggio di tempi così lunghi affidandosi a routines di ritardo software. Occorre utilizzare i timers interni al microcontrollore e così tutto diventa facile. E' sufficiente impostare che il timer ogni (esempio) 10msec vada in interrupt. Nella raotine di interrupt non fai altro che incrementare il contatore di decine di ms. Quando hai un secondo completo, incrementi i secondi. Quando hai un minuto completo incrementi i minuti. Quando hai un'ora completa incrementi le ore. Mi sembra poco più che banale.

Due osservazioni:

- non è necessario spingersi a frequenze altissime, gli orologi hanno un oscillatore a 32kHz.

- cambia micro (se puoi), il 16f84a è osboleto da anni. se vuoi imparare fallo con qualcosa più al passo con i tempi (anche un 10F a 6 pin con oscilaltore interno, sarebbe un bell'esercizietto...)

Roberto

Reply to
Roberto P.

"Linux" ha scritto nel messaggio news: snipped-for-privacy@s19g2000vbp.googlegroups.com... salve, la necessità è questa: ho da realizzare in pochissimo tempo (24\48 ore massimo) un semplice circuito con pic. è tutto pronto tranne il programma in assembler. non essendo una cima in assembler chiedo help.

Ma serve precisione o è una cosa "all'incirca quasi"?? Senza un RTC esterno su tempi lunghi di solito un micro non fa miracoli come precisione! ciao Rusty

Reply to
Rusty

"Rusty" ha scritto nel messaggio:

Non e' assolutamente vero quello che dici, basta usare timer ed interrupt, calcolando prima un valore del quarzo che produca un valore intero dal prescaler del micro, se a questo vuoi la precisione assoluta si mette un compensatore 15-60Pf in serie al quarzo e si fa una regoalzione fine con un frequenzimetro, in tal caso la precisone puo' arrivare anche a meno di 1 secondo dopo molti mesi.

Reply to
diego

.

venta

bhe si, =E8 veramente banale. per lavoro per=F2 non ho necessit=E0 di utilizzare sempre i pic e quindi ho spinto (proprio da anni) nel dimenticatoio tutto. e ho ripescato il tutto ora perch=E8 per necessit=E0 mi serve. ok, quindi user=F2 il timer interno. grazie mille.

n

ok, user=F2 un quarzo da poco.

e

far=F2 cos=EC: vista l'urgenza far=F2 con il 16f84a (che =E8 quello a cui s= ono rimasto e di cui ho un programmatore autocostruito gi=E0 pronto). poi mi metter=F2 nuovamente a studiare su quello che dici tu per iniziare e poi salir=F2 pian piano, visto che mi interessa approfondire (e non voglio trovarmi pi=F9 in queste difficolt=E0 che riconosco banali).

grazie mille

saluti

Reply to
Matteo

snipped-for-privacy@s19g2000vbp.googlegroups.com...

ome

serve che l'errore massimo non superi di 10 minuti la durata impostata. non sono ammessi invece tempi pi=F9 corti.

Reply to
Matteo

Rusty:

Mica vero: il mio timer per la pasta, che ho realizzato con 8 componenti inclusi i 4 display e l'encoder per stabilire il tempo, a tempo perso mi fa anche da orologio e, con un risuonatore ceramico da 4 MHz, mi perde meno di un minuto al giorno.

Reply to
F. Bertolazzi

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.