AVR - millis?

Antworten
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

AVR - millis?

Beitrag von pluto »

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?
MFG
Michael Springwald

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: AVR - millis?

Beitrag von Mathias »

Nun möchte ich aber Millisekunden haben. müsste ich einfach ein weiteren "div 256" hinzufügen?
Du musst eher durch 500 teilen, 0.5s sind 500ms.
Wie genau es aber ist, kann ich nicht sagen.

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?
Aber hast du gesehen, das dieser Timer extern getaktet wird ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: AVR - millis?

Beitrag von pluto »

Du musst eher durch 500 teilen, 0.5s sind 500ms.
Wie genau es aber ist, kann ich nicht sagen.

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....

Aber hast du gesehen, das dieser Timer extern getaktet wird ?

Ja, schon, aber was macht das für ein Unterschied?
MFG
Michael Springwald

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: AVR - millis?

Beitrag von siro »

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
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: AVR - millis?

Beitrag von Mathias »

Hier gibt es genauere Infos über die Timer.
https://www.mikrocontroller.net/article ... er_des_AVR

Aber hast du gesehen, das dieser Timer extern getaktet wird ?


Ja, schon, aber was macht das für ein Unterschied?

Ein grosser, da der Timer mit einem, einem externen Quarz/Oszilator mit 4.194304MHz getaktet ist. der Arduino ist mit 16MHz getaktet.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: AVR - millis?

Beitrag von pluto »

https://www.mikrocontroller.net/article ... er_des_AVR

Den Link habe ich durchgelesen, aber als beispiel wird ein Modell genommen, was mir überhaupt nichts sagt....

Ein grosser, da der Timer mit einem, einem externen Quarz/Oszilator mit 4.194304MHz getaktet ist. der Arduino ist mit 16MHz getaktet.

Ja, der Arduino Nano sollte ein externen Taktgeber haben....

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

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: AVR - millis?

Beitrag von siro »

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
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: AVR - millis?

Beitrag von Mathias »

Den Link habe ich durchgelesen, aber als beispiel wird ein Modell genommen, was mir überhaupt nichts sagt....
So wie hier geschrieben ist, ist er recht verwandt mit dem Atmega328.

Ja, der Arduino Nano sollte ein externen Taktgeber haben....
So wie ich sehe verwechselst du die Quarze.
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

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: AVR - millis?

Beitrag von pluto »

Den externe Oszilator den ich meine wird an T0 oder T1 angeschlossen. Zum testen kannst auch einen NE555 oder einen Multivibrator verwenden.

Genau den meine ich ja... wenn ich ein atMega328 direkt verbaue, löte ich in der Regel ein 16 MHz Quarz an(2 Pin).
MFG
Michael Springwald

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: AVR - millis?

Beitrag von siro »

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...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: AVR - millis?

Beitrag von Mathias »

Genau den meine ich ja... wenn ich ein atMega328 direkt verbaue, löte ich in der Regel ein 16 MHz Quarz an(2 Pin).

Ich denke du verwechselst die XTAL mit T0 und T1.
https://sites.google.com/site/qeewiki/b ... -atmega328
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: AVR - millis?

Beitrag von pluto »

Ich denke du verwechselst die XTAL mit T0 und T1.

Ich meine die zwei Pins, die nach dem Strom(pins) kommen, ich glaube das warn P9 und P10.....
MFG
Michael Springwald

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: AVR - millis?

Beitrag von Mathias »

Ich meine die zwei Pins, die nach dem Strom(pins) kommen, ich glaube das warn P9 und P10.....
Du meinst die XTAL. Gucke das Bild im oberen Link an.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: AVR - millis?

Beitrag von pluto »

Du meinst die XTAL. Gucke das Bild im oberen Link an.

Richtig. XTAL1 und XTAL2

Code: Alles auswählen

cl = 16000000 div 1024 div 1000

Heißt das jetzt, das er jede MS den Timer aufruft?
MFG
Michael Springwald

Antworten