PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einen Programmteil nur alle 5 min. oder 1/Tag aufrufen. Wie?



Hans55
19.01.2008, 18:39
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

TheHawk
19.01.2008, 18:50
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

Dirk
19.01.2008, 18:54
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

Hans55
19.01.2008, 20:09
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, 20: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
:-)

Hans55
19.01.2008, 20:37
Ach so ist das gemeint!
Danke Gerold.

Gruß
Hans

Hans55
19.01.2008, 22:29
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, 22: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
19.01.2008, 23: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

Hans55
20.01.2008, 08:16
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, 12: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.

Dirk
20.01.2008, 12:13
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, 12: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?

Dirk
20.01.2008, 12:37
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

Hans55
20.01.2008, 20:24
Hallo!
Das vom Dirk funzt irgendwie besser! Danke, ich hab's gerade probiert.
Wie bist du jetzt auf diesen Wert gekommen?

Gruß
Hans

Dirk
20.01.2008, 21:02
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

Hans55
20.01.2008, 21:16
Danke, das hilft!
Gruß
Hans