Ein 16 bit Timer benutzen und den passenden Prescaler verwenden. Sobald der Timer übergelaufen ist verzweigt dein µC in die ISR des Timers und dort kannst du dir dann eine SMS schicken lassen
Hallo!
Ich möchte einen Programmteil nur alle 5 Minuten aufrufen oder auch nur max. einmal pro Tag.
Hintergrund: Mein AVR soll mir eine SMS schicken. Das soll natürlich nicht dauernd erfolgen, sondern nur nach einer fest angegeben Zeit.
Ich hab schon was gemacht, aber das ist mit einer WAIT xxx Sekunden, was natürlich Käse ist, denn solange er in dieser Schleife ist macht er nix anderes.
Das ganze ist in Bascom und mit einem ATMEGA8.
Wie macht man sowas? Kann mir da jemand helfen?
Hans
Ein 16 bit Timer benutzen und den passenden Prescaler verwenden. Sobald der Timer übergelaufen ist verzweigt dein µC in die ISR des Timers und dort kannst du dir dann eine SMS schicken lassen
Gruß
Es gibt zusätzlich die Möglichkeit, die Softclock von Bascom zu aktivieren (Config Clock = Soft).Ich möchte einen Programmteil nur alle 5 Minuten aufrufen oder auch nur max. einmal pro Tag.
Was du dazu noch brauchst: Einen Uhrenquarz 32768 Hz (sind nur ein paar Cent).
Gruß Dirk
Danke für die schnelle Antwort!
Ich werde das mit dem Timer versuchen. Das 32Khz Quarz und die Softclock ist etwas lahm. Oder könnte man die SoftClock auch mit einem 14, xxx Mhz Quarz nutzen? Auf ein paar Sekunden Ungenauigkeit käme es mir nicht an.
Weiß jemand, wie klein die AREF- beim AVR sein sein darf? Ich habe das Datenblatt schon mehrmals durchsucht und finde nix drüber. Da muss es doch eine Mindestspannung für AREF geben, oder?
Danke im voraus!
Gruß
Hans
Hallo Hans!Zitat von Hans55
Das ist so gedacht: Man nimmt den internen RC-Oscillator und fährt damit mit 8 Mhz. Den 32768 Hz Quarz schließt man an und taktet damit nur die Zeitfunktionen. Damit hat man ohne großen Aufwand eine ziemlich genaue Zeit.
Aber wenn du wirklich nur 5 Minuten warten möchtest und dir egal ist, wenn sich das auf den Tag hinaus mehrere Minuten verschieben kann, dann brauchst du das nicht.
mfg
Gerold
:-)
Ach so ist das gemeint!
Danke Gerold.
Gruß
Hans
Hallo nochmal!
Also irgendwie krieg ich das nicht hin.
Ich will eine LED am Port D.2 im Sec Takt Toggeln.
Ich hab auf internen 8Mhz Takt umgeschaltet damit ich das Beispiel unter "Timer im ROBONETZ" verwenden kann.
Warum taktet aber nix? Ist da was falsch?
So hab ichs gemacht:
Code:$regfile = "m8def.dat" $crystal = 8000000 'Interner Takt $baud = 9600 ' Ausgang Config Pinb.2 = Output ' Pin B.2 als OUTPUT => LED Config Timer1 = Timer , Prescale = 256 'Konfig Timer1 Enable Timer1 'schaltet den Timer1 ein On Timer1 Timer1_isr 'Spr. bei T1 Überlauf zu "TIMER1_ISR" Enable Interrupts Timer1 = 34285 'T1 soll schon von 34285 wegzählen '/// HAUPTPROGRAMM ///////// Main: Do Loop Goto Main '//// ISR TIMER1 //////// Timer1_isr: 'ISR von Timer1 Timer1 = 34285 'Timer1 soll wieder von 34285 wegzählen Toggle Pinb.2 'schaltet PortB.2 im Sec Takt return End
dieser 32.xxkHz Quarz ergibt genau ne Sekunde, wenn man ihn mit irgendwas teilt.. zumindest sher gut angenähert.
Einige Minuten Verschiebung hat man damit im Monat, aber dann kommt die SMS halt später![]()
Main:
und goto Main ist überflüssig.
ich würde in die leere
Do
loop
noch ein nop setzen und danach ein end
Code:$regfile = "m8def.dat" $crystal = 8000000 'Interner Takt $baud = 9600 ' Ausgang Config Pinb.2 = Output ' Pin B.2 als OUTPUT => LED Config Timer1 = Timer , Prescale = 256 'Konfig Timer1 On Timer1 Timer1_isr 'Spr. bei T1 Überlauf zu "TIMER1_ISR" Enable Timer1 'schaltet den Timer1 ein Enable Interrupts Timer1 = 34285 'T1 soll schon von 34285 wegzählen '/// HAUPTPROGRAMM ///////// Do nop Loop end '//// ISR TIMER1 //////// Timer1_isr: 'ISR von Timer1 Timer1 = 34285 'Timer1 soll wieder von 34285 wegzählen Toggle Pinb.2 'schaltet PortB.2 im Sec Takt return
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Hallo nochmal!
Jetzt funzt es!!!
Super. Ich hatte bei Toggle statt PortB.2 => PinB.2
das mag er scheinbar nicht.
so schauts jetzt aus:
Jetzt hab ich allerdings noch das Problem der extremenCode:'///////////////////////////////////////////////////////////////////////////// 'Stand: 19.01.2008 'Name: "" ' ATMEGA8- SelbstBauModul '///////////////////////////////////////////////////////////////////////////// $regfile = "m8def.dat" $crystal = 14745600 'ext. Quarz '/// DEFINITIONEN /////////////////////////////////////////////////////// ' Ausgänge Config Pinb.2 = Output ' Pin B.2 als OUTPUT => Relais+LED '/// TIMER ///////////////////////////////////////////////////////////////////// Config Timer1 = Timer , Prescale = 256 'Takt: Quarz/256 ' Bei 14Mhz Quarz => T = 2 hoch 16 x 256/ 14Mhz = 1,13 sec Periode ' 1/ 1,3 = 0,879 sec On Timer1 Ontimer1 'Interrupt-Routine für Timer1-Overflow Enable Timer1 'Timer1-Overflow-Interrupt einschalten Enable Interrupts 'Interrupts global zulassen '--------------------------------------------------------- Do nop Loop End '--------------------------------------------------------- Ontimer1: 'Interrupt-Routine Toggle Portb.2 ' Ein=> Aus Return
Ungenauigkeit.
Gruß
Hans
Lesezeichen