Archiv verlassen und diese Seite im Standarddesign anzeigen : Einen Programmteil nur alle 5 min. oder 1/Tag aufrufen. Wie?
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
Ich möchte einen Programmteil nur alle 5 Minuten aufrufen oder auch nur max. einmal pro Tag.
Es gibt zusätzlich die Möglichkeit, die Softclock von Bascom zu aktivieren (Config Clock = Soft).
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
python_rocks
19.01.2008, 21:27
Das 32Khz Quarz und die Softclock ist etwas lahm. Oder könnte man die SoftClock auch mit einem 14, xxx Mhz Quarz nutzen?
Hallo Hans!
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:
$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
stefan_Z
19.01.2008, 23:31
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 ;-)
peterfido
20.01.2008, 00:26
Main:
und goto Main ist überflüssig.
ich würde in die leere
Do
loop
noch ein nop setzen und danach ein end
$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
Hallo nochmal!
Jetzt funzt es!!!
Super. Ich hatte bei Toggle statt PortB.2 => PinB.2
das mag er scheinbar nicht.
so schauts jetzt aus:
'/////////////////////////////////////////////////////////////////////////////
'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
Jetzt hab ich allerdings noch das Problem der extremen
Ungenauigkeit.
Gruß
Hans
peterfido
20.01.2008, 13:06
Hm, war mir gar nicht aufgefallen... #-o
Du kannst das Timing etwas abgleichen, indem du den $Crystal etwas änderst. Eine Zeitlang laufen lassen, die Abweichung feststellen, Dreisatz > Wert korrigieren.
Jetzt hab ich allerdings noch das Problem der extremen
Ungenauigkeit.
Probier's mal so:
'/////////////////////////////////////////////////////////////////////////////
'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
Const Startwert = 7936
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
Timer1 = Startwert
Toggle Portb.2 ' Ein=> Aus
Return
Gruß Dirk
P.S.: $crystal NICHT ändern, weil sich auch andere Timings damit verschieben (z.B. RS232)!
peterfido
20.01.2008, 13:25
P.S.: $crystal NICHT ändern, weil sich auch andere Timings damit verschieben (z.B. RS232)!
Diese sollten doch ebenfalls von der Abweichung betroffen sein und danach genauer werden, oder habe ich da bisher falsch gedacht?
Diese sollten doch ebenfalls von der Abweichung betroffen sein und danach genauer werden, oder habe ich da bisher falsch gedacht?
Die Abweichung, die Hans beim Toggeln eines Ports festgestellt hat, liegt nicht am Quarz! Wenn der so ungenau wäre, müßte man den Hersteller verklagen.
Das Problem war hier die Timer-Konfiguration.
Gruß Dirk
Hallo!
Das vom Dirk funzt irgendwie besser! Danke, ich hab's gerade probiert.
Wie bist du jetzt auf diesen Wert gekommen?
Gruß
Hans
Hallo Hans,
vielleicht hilft das:
https://www.roboternetz.de/wissen/index.php/Bascom_und_Timer
Für die Berechnung von Timer-Startwerten gibt es Tools. Falls du da was brauchst: E-Mail.
Gruß Dirk
Danke, das hilft!
Gruß
Hans
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.