AVR - millis?
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
AVR - millis?
Hallo
Ich such eine Möglichkeit sowas wie millis nach zu bilden für den AVR... das fand ich immer recht Praktisch bei Arduino für "Zeitschleifen".
In dem Beispiel Projekt Blink_Pin_13 von "Mathias"
(https://github.com/sechshelme/AVR-Lazar ... n_13_Timer)
habe ich verschiedene Beispiele gefunden....
Ich verstehe noch nicht ganz die Rechnung: Nehmen wir als Beispiel "Timer0_Interrupt".
Hier steht bei cl = 16000000 div 1024 div 256; // 16'000'000Hz / Clock / TCNT / 2 = 0,5Sek das es eine halbe Sekunde ist.
Nun möchte ich aber Millisekunden haben. müsste ich einfach ein weiteren "div 256" hinzufügen?
In diesem Tutorial:
http://wiki.freepascal.org/AVR_Embedded ... Counter/de
steht das wenn der Zähler bei 16384 ist, eine Sekunde wäre, gilt das nur für den ATtiny2313?
Ich such eine Möglichkeit sowas wie millis nach zu bilden für den AVR... das fand ich immer recht Praktisch bei Arduino für "Zeitschleifen".
In dem Beispiel Projekt Blink_Pin_13 von "Mathias"
(https://github.com/sechshelme/AVR-Lazar ... n_13_Timer)
habe ich verschiedene Beispiele gefunden....
Ich verstehe noch nicht ganz die Rechnung: Nehmen wir als Beispiel "Timer0_Interrupt".
Hier steht bei cl = 16000000 div 1024 div 256; // 16'000'000Hz / Clock / TCNT / 2 = 0,5Sek das es eine halbe Sekunde ist.
Nun möchte ich aber Millisekunden haben. müsste ich einfach ein weiteren "div 256" hinzufügen?
In diesem Tutorial:
http://wiki.freepascal.org/AVR_Embedded ... Counter/de
steht das wenn der Zähler bei 16384 ist, eine Sekunde wäre, gilt das nur für den ATtiny2313?
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: AVR - millis?
Du musst eher durch 500 teilen, 0.5s sind 500ms.Nun möchte ich aber Millisekunden haben. müsste ich einfach ein weiteren "div 256" hinzufügen?
Wie genau es aber ist, kann ich nicht sagen.
Aber hast du gesehen, das dieser Timer extern getaktet wird ?In diesem Tutorial:
http://wiki.freepascal.org/AVR_Embedded ... Counter/de
steht das wenn der Zähler bei 16384 ist, eine Sekunde wäre, gilt das nur für den ATtiny2313?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: AVR - millis?
Wohl so genau wie er eben ist... Also müsste ich durch 500 Teilen und dann einfach ein Zähler hochzählen lassen, der Global ist....Du musst eher durch 500 teilen, 0.5s sind 500ms.
Wie genau es aber ist, kann ich nicht sagen.
Ja, schon, aber was macht das für ein Unterschied?Aber hast du gesehen, das dieser Timer extern getaktet wird ?
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 760
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: AVR - millis?
Ich selbst arbeite nicht mit den Arduinos, aber bei den Microchip PICs ist es vermutlich genauso:
Der Timer Interrupt muss also jede Millisekunde bzw. 1000 mal pro Sekunde aufgerufen werden.
Bei einem Takt von 4 MHz
4.000.000 / 1000 = 4000
Wir müssen also den Wert durch 4000 teilen, damit wir 1000 Interrupts pro Sekunde bekommen.
Der Teiler lässt sich aber nicht einstellen, da es nur ein 8 Bit Zählregister gibt.
Also gibt es zunächst eine Vorteiler, der mit den CS02, CS01, CS00 (Clock Select Bits) eingestellt wird.
den kann man z.B. 1024 stellen
Dann hast Du 4 Mhz / 1024 = 3906,25 Hz
nun kommt das Timer Counter Register dran
dieses zählt mit dem Takt hinter dem Vorteiler immer eins hoch bis 255
und löst dann einen Interrupt aus.
Man versucht nun den Vorteiler und das Timer Counter Register so einzustellen, das man
möglichst genau hinkommt.
Wenn wir den Vorteiler auf 1024 eingestellt haben, haben wir als einen Eingangstakt für das Zählregsiter von
3900,25 Hz Da wir 1000 Hz benötigen für 1 Millisekunde, ergibt sich 3906,25 / 1000 = 3.90625
blöder Wert mit erheblicher Abweichung
also stellen wir den Vorteiler lieber aus 8
dann haben wir 4 MHz / 8 = 500000
nun müsten wir die 500000 durch 1000 teilen, das ergibt 500
Dieser Wert passt nicht in das 8 Bit Zählregister,
also nehmen wir den Vorteiler 16
4 MHz / 16 = 250000
250000 / 1000 = 250
Der Wert 250 passt in das Zählregister.
Da der Zähler aber aufwärts zählt, müssen wir den Wert 256-250 = 6 in das Zählregister laden.
Nun sollte es theoretisch passen.
!!! den Vorteilewert 16 kann man garnicht einstellen bei den Chips, she ich grade
es gibt nur 8 64 256 und 1024
also nehmen wir den Wert 64 als Vorteiler
4 MHz / 64 = 62500
62500 / 1000 = 62,5 also nehmen wir den Wert 63
256-63 = 193
ins TCR0 kommt also der Wert 3 für den Vorteiler = CPU-Takt / 64
ins TCNT0 kommt der Wert 193
Siro
Der Timer Interrupt muss also jede Millisekunde bzw. 1000 mal pro Sekunde aufgerufen werden.
Bei einem Takt von 4 MHz
4.000.000 / 1000 = 4000
Wir müssen also den Wert durch 4000 teilen, damit wir 1000 Interrupts pro Sekunde bekommen.
Der Teiler lässt sich aber nicht einstellen, da es nur ein 8 Bit Zählregister gibt.
Also gibt es zunächst eine Vorteiler, der mit den CS02, CS01, CS00 (Clock Select Bits) eingestellt wird.
den kann man z.B. 1024 stellen
Dann hast Du 4 Mhz / 1024 = 3906,25 Hz
nun kommt das Timer Counter Register dran
dieses zählt mit dem Takt hinter dem Vorteiler immer eins hoch bis 255
und löst dann einen Interrupt aus.
Man versucht nun den Vorteiler und das Timer Counter Register so einzustellen, das man
möglichst genau hinkommt.
Wenn wir den Vorteiler auf 1024 eingestellt haben, haben wir als einen Eingangstakt für das Zählregsiter von
3900,25 Hz Da wir 1000 Hz benötigen für 1 Millisekunde, ergibt sich 3906,25 / 1000 = 3.90625
blöder Wert mit erheblicher Abweichung
also stellen wir den Vorteiler lieber aus 8
dann haben wir 4 MHz / 8 = 500000
nun müsten wir die 500000 durch 1000 teilen, das ergibt 500
Dieser Wert passt nicht in das 8 Bit Zählregister,
also nehmen wir den Vorteiler 16
4 MHz / 16 = 250000
250000 / 1000 = 250
Der Wert 250 passt in das Zählregister.
Da der Zähler aber aufwärts zählt, müssen wir den Wert 256-250 = 6 in das Zählregister laden.
Nun sollte es theoretisch passen.
!!! den Vorteilewert 16 kann man garnicht einstellen bei den Chips, she ich grade
es gibt nur 8 64 256 und 1024
also nehmen wir den Wert 64 als Vorteiler
4 MHz / 64 = 62500
62500 / 1000 = 62,5 also nehmen wir den Wert 63
256-63 = 193
ins TCR0 kommt also der Wert 3 für den Vorteiler = CPU-Takt / 64
ins TCNT0 kommt der Wert 193
Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: AVR - millis?
Hier gibt es genauere Infos über die Timer.
https://www.mikrocontroller.net/article ... er_des_AVR
https://www.mikrocontroller.net/article ... er_des_AVR
Ein grosser, da der Timer mit einem, einem externen Quarz/Oszilator mit 4.194304MHz getaktet ist. der Arduino ist mit 16MHz getaktet.Ja, schon, aber was macht das für ein Unterschied?Aber hast du gesehen, das dieser Timer extern getaktet wird ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: AVR - millis?
Den Link habe ich durchgelesen, aber als beispiel wird ein Modell genommen, was mir überhaupt nichts sagt....https://www.mikrocontroller.net/article ... er_des_AVR
Ja, der Arduino Nano sollte ein externen Taktgeber haben....Ein grosser, da der Timer mit einem, einem externen Quarz/Oszilator mit 4.194304MHz getaktet ist. der Arduino ist mit 16MHz getaktet.
Ich werde mal versuchen: Das jede Millisekunde die vergeht eine Globale Variable hochgezählt wird.
Für das eigentliche Vorhaben, könnte ich es aber auch anders lösen: Es geht um das LCD Projekt: Die Uhrzeit möchte ich jede Sekunde Aktualisieren und Temperatur und Luftfeuchtigkeit nur alle 5 Sekunden oder so...
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 760
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: AVR - millis?
Das Quarz hat man vermutlich wegen der RS232 Baudraten gewählt,
damit bekommt man nämlich exakt 9600 Baud hin
somit müste der Vorteiler TCR0 auf den Wert von 4 (für Teiler 256) gesetzt werden und der TCNT0 direkt auf 0
damit bekommt man nämlich exakt 9600 Baud hin
somit müste der Vorteiler TCR0 auf den Wert von 4 (für Teiler 256) gesetzt werden und der TCNT0 direkt auf 0
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: AVR - millis?
So wie hier geschrieben ist, ist er recht verwandt mit dem Atmega328.Den Link habe ich durchgelesen, aber als beispiel wird ein Modell genommen, was mir überhaupt nichts sagt....
So wie ich sehe verwechselst du die Quarze.Ja, der Arduino Nano sollte ein externen Taktgeber haben....
Der Quarz, welcher auf dem Arduino aufgelötet ist, ist nur für den CPU-Takt des Nanos zuständig.
Den externe Oszilator den ich meine wird an T0 oder T1 angeschlossen. Zum testen kannst auch einen NE555 oder einen Multivibrator verwenden.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: AVR - millis?
Genau den meine ich ja... wenn ich ein atMega328 direkt verbaue, löte ich in der Regel ein 16 MHz Quarz an(2 Pin).Den externe Oszilator den ich meine wird an T0 oder T1 angeschlossen. Zum testen kannst auch einen NE555 oder einen Multivibrator verwenden.
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 760
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: AVR - millis?
wenn der Timer dann eingestellt ist:
Code: Alles auswählen
var DelayCount:Word; // variable global anlegen, wird im Timer Interrupt runtergezählt
procedure Timer0_Interrupt; public Name 'TIMER0_OVF_ISR'; interrupt;
begin
if DelayCount > 0 then dec(DelayCount);
end;
Procedure Delay(millis:Word); // Die Wartefunktion in Millisekunden
begin
DelayCount:=millis;
Repeat
// hier kann man noch so einiges tun, wenns erforderlich ist.
Until DelayCount = 0;
end;
Zuletzt geändert von siro am Mi 29. Aug 2018, 23:24, insgesamt 1-mal geändert.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: AVR - millis?
Ich denke du verwechselst die XTAL mit T0 und T1.Genau den meine ich ja... wenn ich ein atMega328 direkt verbaue, löte ich in der Regel ein 16 MHz Quarz an(2 Pin).
https://sites.google.com/site/qeewiki/b ... -atmega328
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: AVR - millis?
Ich meine die zwei Pins, die nach dem Strom(pins) kommen, ich glaube das warn P9 und P10.....Ich denke du verwechselst die XTAL mit T0 und T1.
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: AVR - millis?
Du meinst die XTAL. Gucke das Bild im oberen Link an.Ich meine die zwei Pins, die nach dem Strom(pins) kommen, ich glaube das warn P9 und P10.....
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: AVR - millis?
Richtig. XTAL1 und XTAL2Du meinst die XTAL. Gucke das Bild im oberen Link an.
Code: Alles auswählen
cl = 16000000 div 1024 div 1000
MFG
Michael Springwald
Michael Springwald