AVR - millis?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.

AVR - millis?

Beitragvon pluto » 29. Aug 2018, 20:54 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?
MFG
Michael Springwald
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6670
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon Mathias » 29. Aug 2018, 21:30 Re: AVR - millis?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon pluto » 29. Aug 2018, 21:32 Re: AVR - millis?

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6670
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon siro » 29. Aug 2018, 21:38 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
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
siro
 
Beiträge: 305
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 29. Aug 2018, 21:54 Re: AVR - millis?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon pluto » 29. Aug 2018, 22:05 Re: AVR - millis?

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6670
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon siro » 29. Aug 2018, 22:07 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
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
siro
 
Beiträge: 305
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 29. Aug 2018, 22:12 Re: AVR - millis?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon pluto » 29. Aug 2018, 22:18 Re: AVR - millis?

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6670
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon siro » 29. Aug 2018, 22:21 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 29. Aug 2018, 22:24, insgesamt 1-mal geändert.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
siro
 
Beiträge: 305
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 29. Aug 2018, 22:24 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).

Ich denke du verwechselst die XTAL mit T0 und T1.
https://sites.google.com/site/qeewiki/b ... -atmega328
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon pluto » 29. Aug 2018, 22:28 Re: AVR - millis?

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6670
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon Mathias » 29. Aug 2018, 22:30 Re: AVR - millis?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon pluto » 29. Aug 2018, 22:35 Re: AVR - millis?

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6670
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

• Themenende •

Zurück zu Sonstiges



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried