ATmega328p Timer

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

Re: ATmega328p Timer

Beitragvon Mathias » 23. Okt 2017, 15:39 Re: ATmega328p Timer

Damit zählt TCNT immer nur von 200 bis 255, macht dann Overflow auf 0, der Interrupt wird aufgerufen und da TCNT 0 ist wird es auf 200 gesetzt und zählt wieder bis 255.

Ich habe jetzt folgendes eingefügt:
Code: Alles auswählen
 TCNT2 := 240;
Jetzt blinkt die LED sehr schnell.
Verstehe ich es richtig, das man mit TCNTx, die Feinseinstellung eines Timer regulieren kann.
Beim Timer1 ist TCNT1 16Bit breit und dies ist der Grund, wieso das dieser Timer viel genauer ist ?

Beim Arduino-Code, war es richtig undurchsichtig, was beim einem Timer im Hintergrund passiert. :|

PS: Es wird da eine andere Schreibweise empfohlen, da alias angeblich veraltet ist.
Code: Alles auswählen
  //procedure Timer2_Interrupt; alias: 'TIMER2_OVF_ISR'; interrupt; public;
    procedure Timer2_Interrupt; public Name 'TIMER2_OVF_ISR'; interrupt;

Wen man die ändert, kommt auch der Code-Formatierer zu recht. :wink:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3195
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Timm Thaler » 23. Okt 2017, 16:48 Re: ATmega328p Timer

Mathias hat geschrieben:Ich habe jetzt folgendes eingefügt:
Code: Alles auswählen
 TCNT2 := 240;
Jetzt blinkt die LED sehr schnell.


Logisch, jetzt zählt TCNT nur fon 240 bis 255 und löst den Interrupt aus.

Mathias hat geschrieben:Verstehe ich es richtig, das man mit TCNTx, die Feinseinstellung eines Timer regulieren kann.


Ja. Mit dem Prescaler kannst Du nur Werte vom Systemtakt div 2^n einstellen, und auch nicht für alle n. Mit TCNT - oder auch mit OCR0A, OCR0B und dem OutputCompare Interrupts - kannst Du Zwischenwerte einstellen. Aber auch nicht alle, ist halt digital. ;-)

Mathias hat geschrieben:Beim Timer1 ist TCNT1 16Bit breit und dies ist der Grund, wieso das dieser Timer viel genauer ist ?


Jaein. Die "Genauigkeit" hängt von vielen Faktoren ab. Zum Beispiel vom Quarz. Mit einem 16MHz Quarz kommst Du nur umständlich "genau" auf eine Sekunde, weil 16000000 sich schlecht in 2^n aufteilen läßt. Man braucht zusätzliche Zählvariablen. Mit einem 4.194MHz Quarz - ein beliebter Uhrenquarz - kommst Du allein mit 2^n-Teilern auf genau eine Sekunde.

Die 16bit-Timer spielen ihren hohen Wertebereich vor allem bei der Erzeugung von Frequenzen (Frequenzgenerator), hochauflösenden PWM (DA-Wandler, Motorsteuerung) oder der Messung von Freqenzen oder Pulsdauern aus.
Timm Thaler
 
Beiträge: 431
Registriert: 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.6 FPC3.0.0, Raspbian Jessie Laz1.6 FPC3.0.0 | 
CPU-Target: Raspberry Pi 3
Nach oben

Beitragvon Mathias » 23. Okt 2017, 16:51 Re: ATmega328p Timer

Die 16bit-Timer spielen ihren hohen Wertebereich vor allem bei der Erzeugung von Frequenzen (Frequenzgenerator), hochauflösenden PWM (DA-Wandler, Motorsteuerung) oder der Messung von Freqenzen oder Pulsdauern aus.
Wen ich das so lese, wen man den 16Bit-Timer für eigene Zwecke verwendet, dann ist fertig mit den Analogen-Ausgängen(PWM) ? :roll:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3195
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Timm Thaler » 23. Okt 2017, 18:36 Re: ATmega328p Timer

Mathias hat geschrieben:Wen ich das so lese, wen man den 16Bit-Timer für eigene Zwecke verwendet, dann ist fertig mit den Analogen-Ausgängen(PWM) ? :roll:


Sachmal, meine beharrlichen Hinweise auf das Datenblatt ignorierst Du konsequent?

Der ATmega328 hat zwei 8..16-bit PWM Ausgänge an Timer1, zwei 8-bit-PWM-Ausgänge an Timer2 und zwei 8-bit-PWM-Ausgänge an Timer0. Welche davon man nutzt hängt unter anderem davon ab, welche Pins man sonst noch benötigt. So liegt OC2A zum Beispiel auf MOSI, verträgt sich also nicht mit einer SPI-Schnittstelle (wohl aber mit dem ISP Programmer am SPI), OC2B liegt mit INT1 auf PD3, geht also nicht wenn man beide externen Interrupts braucht.

Da die Anzahl der Pins begrenzt ist und die AVRs eine Menge Hardwarefunktionen bieten, muss man halt Kompromisse machen. So geht Hardware I2C an PC4/PC5 nicht, wenn man alle AD-Kanäle nutzen will, dafür gibt es dann Software-I2C.
Timm Thaler
 
Beiträge: 431
Registriert: 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.6 FPC3.0.0, Raspbian Jessie Laz1.6 FPC3.0.0 | 
CPU-Target: Raspberry Pi 3
Nach oben

Beitragvon Mathias » 23. Okt 2017, 19:05 Re: ATmega328p Timer

Jetzt verstehe ich langsam, wieso gewisse Kombinationen von Funktionen auf dem Arduino nicht funktionierten. Ich wollte mal einen Timer und gleichzeitig I²C nutzen, aber irgendwie ging es nicht. Jetzt weis ich, wieso du nicht so Fan von der Arduino-Software bist. :wink:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3195
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Timm Thaler » 23. Okt 2017, 20:04 Re: ATmega328p Timer

Mathias hat geschrieben:Jetzt weis ich, wieso du nicht so Fan von der Arduino-Software bist. :wink:


Naja, Du siehst halt nicht was drinnen passiert. Für Schüler die ein paar LEDs blinken lassen ist das erstmal ok. Aber es verschenkt eben sehr viele Möglichkeiten.

Ich hab früher auch mal so programmiert: AVR als State-Maschine, mache das, warte auf Ergebnis, mache das, warte auf Uart, mache das... Kann man machen, wird aber irgendwann langweilig. ;-)
Timm Thaler
 
Beiträge: 431
Registriert: 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.6 FPC3.0.0, Raspbian Jessie Laz1.6 FPC3.0.0 | 
CPU-Target: Raspberry Pi 3
Nach oben

Beitragvon Mathias » 23. Okt 2017, 20:25 Re: ATmega328p Timer

AVR als State-Maschine, mache das, warte auf Ergebnis, mache das, warte auf Uart, mache das... Kann man machen, wird aber irgendwann langweilig.

Der Arduino kennt auch Interrupts, immerhin bringe ich damit Multiplex hin.
Mit dem UART konnte ich immerhin mit 1'000'000 Baud kommunizieren. I²C klappt auch gut.
Aber eben wie du sagt, man weis nicht was wirklich passiert.

Gutes Beispiel ist digitalWrite(...), dies ist mindestens 10x langsamer als PORTB |= (1 << PB5);.

Ich hab früher auch mal so programmiert:
Bis vor kurzem kannte ich nur Arduino, immerhin kann, man damit auch ATtiny programmieren.
Aber so wie es aussieht ändert sich dies, da man jetzt Unterstützung von Lazarus hat. :lol: :wink:
Siehe UART-Thread, da hat mir Arduino auch ein Ei gelegt.

Mal gucke, ob Lazarus irgendwann auch den Arduino due unterstützt.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3195
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 11. Nov 2017, 17:22 Re: ATmega328p Timer

Ich habe gerade etwas ganze gemeines entdecke, was die Timer betrifft. Die Procedure-Namen sind unterschiedlich. :roll:
Code: Alles auswählen
// ATtiny2313
procedure Timer0_Interrupt; public Name 'TIMER0_COMPA_ISR'; interrupt;
// ATtiny44
procedure Timer0_Interrupt; public Name 'TIM0_COMPA_ISR'; interrupt;


Ich habe dazu einen Hinweis ins Tutorial geschrieben, nicht das noch wer anders wegen dies Zeit versaumt. :wink:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3195
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •
Vorherige

Zurück zu Sonstiges



Wer ist online?

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

porpoises-institution
accuracy-worried