operazione su rtc con pic 16F88

salve! ogni tanto me ne esco con domande assurde.... allora, chiedo scusa per l'eventuale inappropriatezza della domanda, ma siete gli unici che penso mi saprete rispondere.

ho realizzato una banale sveglia con un rtc della dallas (ds1307) e un pic (16f88 della microchip). anche se uno solo di voi lo richieder=E0, entrer=F2 nel dettaglio. per ora mi limito ad esporre il problema che ho:

questo circuito non ha tasti o display.neanche led. solo un rel=E8. questo rel=E8 si deve aprire allo scoccare di una data prefissata.

dato che il circuito pu=F2 rimanere senza alimentazione per lunghi periodi, ho previsto un rtc con un'autonomia di circa 10 anni (una vita, per quello che mi serve!).

programmo con l'attuale data e ora l'rtc e lo faccio partire, tutto ok. il pic all'accensione richiede la data, la mette nella ram. prende la data da confrontare della sua eerom e la mette nella ram. poi deve controllare che la data impostata non sia inferiore a quella attuale dell'rtc. quindi partendo dall'anno, mese, giorno, ora , minuto effettuo la seguente routine: prendo la data attuale a cui sottraggo quella in memoria. se il risultato =E8 diverso da zero e positivo, significa che il rel=E8 si deve aprire dato che =E8 "passata" la data che avevo impostato.

il mio problema =E8 che mi apre il rel=E8 sempre. non riesco a capire su che istruzione cade l'asino (non sono un professionista, magari!)

c'=E8 qualche anima pia che ha intenzione di darmi una mano? poster=F2 il codice se richiesto.

grazie mille!!

Reply to
Linux
Loading thread data ...

On 24 Set, 21:32, Linux wrote: [...]

[...]

Hai provato a fare un debug? se non hai l'ICD puoi farlo tramite porta seriale e stamparti su terminale i valori delle variabili che ti interessano controllare. In poco tempo e potresti capire dove sta il problema e risolverlo.

Ciao, Enrico

Reply to
Hexfet13

Conscio delle conseguenze, Linux un bel dì scrisse:

Cioè fai (Anno+Mese+Giorno+Ora+Minuti) - (Anno+Mese+Giorno+Ora+Minuti) ??? In questo caso il calcolo verrà sicuramente sbagliato...

--
IBM: Industry Bowel Movement
News 2002 [v 2.4] - [ StopDialers/PopDuster/SMTP Proxy -
http://www.socket2000.com ]
Reply to
Due di Picche

Scusa se lo dico, ma... in genere tutti o quasi i rtc che ho visto hanno una funzione di sveglia... non potresti semplicemente collegarla a un interrupt del pic e risolvere la cosa molto più banalmente?

Reply to
stinf

Linux wrote: Occhio che data e ora sono in BCD, quindi devi lavorare con un nibble alla volta, purtroppo non si può sottrarre (confrontare) due byte, non funziona. Quindi partendo dalle decine di anni, anni, decine di mesi e così via. Per fare il confronto io farei così: (1) Per entrambi gli operandi (data impostata e data attuale)

-nel caso di nibble meno significativo maschererei con 0x0F

-nel caso di nibble più significativo swapperei i due nibble (non mi ricordo se questa istruzione è disponibile per il PIC) e maschererei con 0x0F. In alternativa puoi mascherare per 0xF0 e ruotare a dx di almeno un bit.

(2) Confronterei sottraendo un operando all'altro. Se il bit più significativo è 1 significa che il secondo operando è più grande del primo.

Tu come hai fatto?

Ciao

Pasu

Reply to
Pasu

una

pt

purtroppo l'rtc che ho (accidenti a me) =E8 il ds1307 che non ha la funzione di sveglia.... mi sono fregato da solo.... :(

Reply to
Matteo

o

ho il pickit2 che permette il debug incircuit. funziona tutto regolarmente , gi=E0 controllato.... in questo modo ho risolto TANTISSIMI problemi, ma questo rimane..... =E8 gi=E0 da due giorni che ci picchio la testa....

Reply to
Matteo

e

allora, vedo che c'=E8 necessit=E0 di postare il codice, se non tutto, almeno quello che esegue queste operazioni. lo faccio stasera quando torno dal lavoro, qui non ce l'ho. in sostanza fa questo: anno corrente - anno in memoria il risultato =E8 zero? no--> =E8 positivo? si-->il risultato =E8 positivo? si-->dai allarme no-->continua si-->continua mese corrente - mese in memoria il risult.....etc etc.....

per controllare che tipo di risultato ho controllo il bit C e Z del registro status.

2000.com]
Reply to
Matteo

n
o

l primo.

bhe mi sa che io ho fatto una gran c....ta. stasera posto il codice, ma =E8 come dici tu allora: ho da farlo uno a uno alla volta.... per=F2 sono deficitario in questo. sono riuscito a implementare via firmware il protocollo i2c master to slave, ma a questo ancora non ci sono arrivato....

a stasera, e grazie a tutti per l'interessamento! grazie davvero.

ciao

matteo

Reply to
Matteo

Pasu ha scritto:

n=20

davvero ? anche se tutti i nibble sono correttamente ordinati msb_lsb ?

forse sbaglio, ma credo che sebbene la differenza avrebbe valore errato, tuttavia il flag >=3D ottenuto per sottrazione o compare sia esatto.

saluti

--=20 lowcost

Reply to
lowcost

ecco la parte del codice che confronta le date partendo chiaramente dall'anno e via. le variabili che contengono l'ora CORRENTE sono: anno, mese, date, ore, minuti. quelle seguite dal suffisso rom sono quelle con caricata sopra la data da sottrarre (che =E8 quella impostata da me come allarme). dovrebbe essere ben comprensibile il resto del codice. in caso di sfondoni non sparatemi per favore!! :))) il pic ricordo che =E8 il 16F88 ps: ho gi=E0 controllato dal vivo e dalla simulazione che le variabili contengano i dati a loro assegnati. funge tutto. tranne questa che =E8 l'ultima parte, naturalmente!

grazie mille ancora a tutti!

spegnitutto call offrele goto submain ; testc btfsc status, c ;se il risultato dell'op =E8 positivo, allore spegni tutto goto spegnitutto return ; pulisci banksel status bcf status, c bsf status, z banksel porta return ; confrontadata ;confronta con l'rtc la data,se il tempo =E8 scaduto,disattiva l'uscita preposta. call pulisci movf annorom, w subwf anno, 0 banksel status btfss status, z ;se il risultato =E8 zero salta una istruzione call testc

call pulisci movf meserom, w subwf mese, 0 banksel status btfss status, z call testc

call pulisci movf daterom, w subwf date, 0 banksel status btfss status, z call testc

call pulisci movf orerom, w subwf ore, 0 banksel status btfss status, z call testc

call pulisci movf minrom, w subwf minuti, 0 banksel status btfss status, z call testc

call onrele banksel porta return

perch=E8 questi continui cambi di banco direte voi? giustissimo dir=F2 io, istruzioni perditempo, codice non ottimizzato, ma altre routine che scrivevano nella eerom (che quindi lavoravano nel banco 3) non mi andavano proprio per questo. allora per non saper ne leggere ne scrivere ho iniziato a mettere banksel pure nella minestra :) mi occuper=F2 poi di snellire dove serve. tanto con 20 mhz di quarzo non mi fa differenza una istruzione in pi=F9 o in meno.

matteo

Reply to
Matteo

Uhm... Mi sa che hai ragione. Strano, di solito sono io quello ottimista... Starò invecchiando.

Ciao

Pasu

Reply to
Pasu

Conscio delle conseguenze, Matteo un bel dì scrisse:

Non è chiaro per nulla... Mah...

L'algoritmo dovrebbe essere:

annocorrente-annomemoria>0 si->allarme esci dal ciclo di controllo data =0 ->controlla il mese

mesecorrente-mesememoria>0 si->allarme esci dal ciclo di controllo data =0 ->controlla il giorno

giornocorrente-giornomemoria>0 si->allarme esci dal ciclo di controllo data =0 ->controlla i minuti

etc...

--
Modem:  How a Southerner asks for seconds...
News 2002 [v 2.4] - [ StopDialers/PopDuster/SMTP Proxy -
http://www.socket2000.com ]
Reply to
Due di Picche

to,

positivo?

certo che non =E8 chiaro! ha cambiato delle lettere dove ne avevo scritte altre. vabb=E8

comunque ho postato quel pezzo di codice.

e faccio in sostanza come hai detto te, spero....penso.... ma non va!!!! accidenta ai picche! (detto alla toscana)

2000.com]
Reply to
Matteo

on

b ?

,

e se invece tu avessi proprio ragione? tutto sommato pi=F9 ci penso pi=F9 mi sembra logico che le decine (i primi 4 bit) e le unit=E0 (ultimi 4 bit, i meno significativi) vadano sottratti in modo indipendente.....mmmmm...... sono cos=EC pirla?

Reply to
Matteo

Conscio delle conseguenze, Matteo un bel dì scrisse:

..scusa... Mah... Testi se è zero, se lo è chiami "pulisci" e poi testi il mese, altrimenti chiami "testc" ma poi torni comunque a testare il mese (ovvero continui la trafila)... Anzi, fai ben peggio... Chiami "Testc" che al suo interno contiene una goto a spegnitutto che a sua volta salta alla main!!! E quando lo pulisci più lo stack??

--
"You can't have everything ... where would you put it?" -- Stephen Wright 
News 2002 [v 2.4] - [ StopDialers/PopDuster/SMTP Proxy -
http://www.socket2000.com ]
Reply to
Due di Picche

a una istruzione

una volta che spegne tutto, non deve pi=F9 testare nulla e una delle routine di spegnitutto =E8 di mandare poi il pic in sleep. mi ci =E8 rimasto un goto al main, ma non viene mai eseguito per la natura di spegnitutto, che prima spegne l'uscita, poi manda in sleep il pic, che =E8 programmato per non riaccendersi pi=F9 in nessun caso. quindi lo stack non lo devo svuotare.

l'unica cosa di cui sono sicuro =E8 questa :)

2000.com]
Reply to
Matteo

on

b ?

,

novit=E0: ho lavorato don un nibble alla volta ma continua a non andare. sceglie sempre di dare l'allarme (cio=E8 di spegnere il rele). ho scritto il prog in due modi: uno che usa il bit c e z, e uno che testa il msd nell'operazione di ogni nibble. in ogni caso lo stacca sempre. ma perch=E8?!?!?!?!!?aaaaaagh!!!!

Reply to
Matteo

Conscio delle conseguenze, Matteo un bel dì scrisse:

Però il test è errato, come ipotizzavo nel messaggio

Durante il testc tu RITORNI al controllo dell'elemento successivo (il mese se hai testato l'anno, il giorno se hai testato il mese, etc...) se il carry non è settato ma questo ti porta all'errore. Infatti se il carry è ON allora devi far scattare l'allarme perchè la data è inferiore ma se il carry non è settato significa che la data E' SUPERIORE quindi NON DEVI PIU' ESEGUIRE alcun test sui dati successivi pena l'errore. Per esempio se hai un allarme settato per il 25-9-2010 e la data corrente è 26-9-2009 succede che testi l'anno ed invece di smettere subito i seguenti test (2009 è minore di 2010) ritorni a controllare il mese. Lo trovi uguale sicchè controlli il giorno e a questo punto scatta l'allarme perchè il giorno è SUPERIORE al giorno della data odierna... Ma tu dovevi GIA' EVITARLO questo controllo perchè l'anno era ormai fuori range...

--
My sister opened a computer store in Hawaii. She sells C shells by the seashore.
News 2002 [v 2.4] - [ StopDialers/PopDuster/SMTP Proxy -
http://www.socket2000.com ]
Reply to
Due di Picche

Matteo ha scritto:

immagino che se hai messo "spegnitutto" fuori da "testc" avrai i tuoi buoni motivi.

questa "testc" non deve necessariamente essere una sub: puo' essere eseguita una sola volta dopo il ritorno da "confrontadata"

questo "pulisci" non serve a niente: i flag C e Z sono aggiornati dalle istruzioni, non serve presettarli. anche il banksel non serve a niente: questi flag sono nello status register; questo registro ed altri (i piu' importanti) sono sempre disponibili in qualsiasi banco; nessun uC (neppure il PIC) puo' essere cosi' stupido da bancare un dato cosi' importante. inoltre, essemdo "status" in tutti i banchi, mi chiedo quale diavolo di banco sia settato da "banksel status" (uno a caso ?).

tutti questi banksel status sono inutili e forse dannosi. spero che i registri di lavoro (anche temporanei) siano sempre accessibili (0x70_0x7F). spero che i dati del RTC siano nel formato corretto (am_pm) e siano stati scremati eventuali bit estranei.

dici che hai fatto funzionare l' I2C : credo che tu sia molto fortunato.

saluti

--=20 lowcost

Reply to
lowcost

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.