Forum: Mikrocontroller und Digitale Elektronik fragen zu 8 bit timer und 16 bit timer bei einem atmega328p


von Franz (Gast)


Lesenswert?

guten abend,
ich habe einen arduino uno(atmega328p), welchen ich im atmel studio in c 
programmiere. dieser chip hat ja drei timer, timer0 und timer2 sind 8 
bit und timer 1 ist 16 bit.

warum ist timer 1 16 bit? und nicht timer 2?
also warum ist der 16 bit timer zwischen zwei 8 bit timern?
kann man alle drei timer gleichzeitig verwenden? also das man alle drei 
timer programmiert und diese in unterschiedlichen dauern einen interrupt 
auslösen? oder ist wenn man den 16 bit timer verwendet die beiden 8 bit 
timer belegt?

Franz

von Christian S. (roehrenvorheizer)


Lesenswert?

"also warum ist der 16 bit timer zwischen zwei 8 bit timern?
kann man alle drei timer gleichzeitig verwenden? "

Aus historischen Gründen, denn es gibt kleinere oder ältere Modelle, die 
weniger als 3 Timer haben.

Ja, und sie haben völlig getrennte Interrupts.

Steht natürlich alles im Datenblatt von mehreren hundert Seiten.


Nein.

MfG

: Bearbeitet durch User
von Karl M. (Gast)


Lesenswert?

Hallo Franz,

man hört aus dem Datenblatt, alle Hardware-Timer können unabhängig 
voneinander verwendet werden.

Warum die so angelegt wurden, liegt an Atmel und nach meiner Meinung 
durch die Evolution der Ersten Atmel bis heute.

Es ist für den Programmierer fast egal wie die Nummerierung ist, nur die 
Interrupt Priorität der Timer und aller anderen Hardwarebaugruppen ist 
untereinander zu beachten!

von Einer K. (Gast)


Lesenswert?

Warum liest du nicht das Datenblatt?
Dort findest du alle Abhängigkeiten, sofern welche bestehen.


Franz schrieb:
> also warum ist der 16 bit timer zwischen zwei 8 bit timern?
Weil es der Entwickler so gebaut hat.

Besonderheiten:
Das Arduino Framework verwendet Timer0 für millis() usw.
Und alle Timer werden für PWM vorbereitet.

von Wolfgang (Gast)


Lesenswert?

Karl M. schrieb:
> Es ist für den Programmierer fast egal wie die Nummerierung ist, nur die
> Interrupt Priorität der Timer und aller anderen Hardwarebaugruppen ist
> untereinander zu beachten!

Welche Interrupt Priorität?
Guck mal ins Datenblatt vom ATmega328p

von Harry L. (mysth)


Lesenswert?

Karl M. schrieb:
> man hört aus dem Datenblatt

Wo gibts das Datenblatt als Hörbuch?

Wär vielleicht ja was für die lese-faulen....LOL

von Michael U. (amiga)


Lesenswert?

Hallo,

Wolfgang schrieb:
> Welche Interrupt Priorität?
> Guck mal ins Datenblatt vom ATmega328p

bei gleichteitigen Auftreten werden die Interrupts in Reihenfolge der 
Vectortabelle ausgeführt. Man kann diese Priorität zwar nicht 
beeinflussen, sie existiert aber und es gibt Fälle, wo man sie beachten 
sollte.

Harry L. schrieb:
> Wo gibts das Datenblatt als Hörbuch?

Ich kann ja mal Alexa fragen...

Gruß aus Berlin
Michael

von Axel S. (a-za-z0-9)


Lesenswert?

Franz schrieb:

> ich habe einen arduino uno(atmega328p), welchen ich im atmel studio in c
> programmiere. dieser chip hat ja drei timer, timer0 und timer2 sind 8
> bit und timer 1 ist 16 bit.
>
> warum ist timer 1 16 bit? und nicht timer 2?

Was ist das denn für eine bescheuerte Frage? Ach ich sehe, der Post ist 
vom Freitag. Eine Trollfrage also.

Namen sind Schall und Rauch. Du kannst die Timer gerne anders nennen, 
wenn dir das besser gefällt. Wie wäre es mit "Tick, Trick und Track"?

> also warum ist der 16 bit timer zwischen zwei 8 bit timern?

Weil es so schön symmetrisch aussieht, mit "dem Langen" in der Mitte.

> kann man alle drei timer gleichzeitig verwenden?

Nein, das ist verboten. Dann kommt die Polizei und nimmt dir deinen 
Arduino weg. Und zur Strafe mußt du das Handbuch zum ATmega328 lesen.

von Karl M. (Gast)


Lesenswert?

Wolfgang schrieb:
> Karl M. schrieb:
>> Es ist für den Programmierer fast egal wie die Nummerierung ist, nur die
>> Interrupt Priorität der Timer und aller anderen Hardwarebaugruppen ist
>> untereinander zu beachten!
>
> Welche Interrupt Priorität?
> Guck mal ins Datenblatt vom ATmega328p

Habe ich:

http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf

ATmega48A/PA/88A/PA/168A/PA/328/P
12.4 Interrupt Vectors in ATmega328 and ATmega328P

Ihre Prioritäten sind nach den Interrupt-Vektor-Nummern sortiert, je 
kleiner, des so höher,

Quelle: 7.1 Overview
"A flexible interrupt module has its control registers in the I/O space 
with an additional Global Interrupt Enable bit in the Status Register. 
All interrupts have a separate Interrupt Vector in the Interrupt Vector 
table. The interrupts have priority in accordance with their Interrupt 
Vector  position. The lower the Interrupt Vector address, the higher the 
priority"

Es gibt noch einige weitere Verweise im Datenblatt, man muss es nur 
lesen!

von Ersatz-Kasper (Gast)


Lesenswert?

Axel S. schrieb:
> Franz schrieb:
>
>> ich habe einen arduino uno(atmega328p), welchen ich im atmel studio in c
>> programmiere. dieser chip hat ja drei timer, timer0 und timer2 sind 8
>> bit und timer 1 ist 16 bit.
>>
>> warum ist timer 1 16 bit? und nicht timer 2?
>
> Was ist das denn für eine bescheuerte Frage? Ach ich sehe, der Post ist
> vom Freitag. Eine Trollfrage also.
>
> Namen sind Schall und Rauch. Du kannst die Timer gerne anders nennen,
> wenn dir das besser gefällt. Wie wäre es mit "Tick, Trick und Track"?
>
>> also warum ist der 16 bit timer zwischen zwei 8 bit timern?
>
> Weil es so schön symmetrisch aussieht, mit "dem Langen" in der Mitte.
>
>> kann man alle drei timer gleichzeitig verwenden?
>
> Nein, das ist verboten. Dann kommt die Polizei und nimmt dir deinen
> Arduino weg. Und zur Strafe mußt du das Handbuch zum ATmega328 lesen.


Du bist ja ein grandioser Komiker. Deinen Post habe ich mir gespeichert, 
da kann ich an einem trüben Dezemberabend bestimmt drüber lachen. Heute 
noch nicht.

Wieso kann dieser Kerl jeden Tag mindestens einen beleidigenden Beitrag 
bringen, ohne daß das irgendwelche Folgen für ihn hätte?

von c-hater (Gast)


Lesenswert?

Franz schrieb:

> warum ist timer 1 16 bit? und nicht timer 2?

Das hat historische und konzeptionelle Gründe. Die sollten dir aber 
vollkommen egal sein. Viel wichtiger sollte sein, dass dir klar sein 
muss, dass jeder dieser Timer in verschiedenen Devices durchaus 
Unterschiede aufweisen kann. Timer0 auf einem ATmega1284P ist z.B. schon 
recht verschieden von Timer0 auf einem ATmega8.

Das fängt (leider) schon bei den symbolischen Namen der Register, Bits 
und zugehörigen Interruptvektoren an. Das ist eindeutig Atmel 
anzulasten, die waren nicht in der Lage, wenigstens auf der Ebene der 
Deklarations-Konventionen eine Art "Abwärtskompatibilität" herzustellen. 
An einigen Stellen haben sie es wenigstens versucht, dann aber meist 
gleich wieder so selten dämlich, das es eher kontraproduktiv wirksam 
wird, wenn man die Sache über alle AVR8 hinweg betrachtet. Da war ganz 
klar irgendeine konkrete Anwendung eines Großkunden relevant, und nur 
für diese wurde der Kram notdürftig eingebaut. Ohne jede Übersicht, ohne 
irgendeinen deviceübergreifenden Generalplan. Typisches Frickler-Niveau. 
Leider...

Und bezüglich des Deklarationsproblems sieht beim avr-gcc leider 
ziemlich genauso aus. Die haben auch versucht, wenigstens auf 
Deklarationsebene eine gewisse Einheitlichkeit reinzubekommen, aber das 
mindestens genauso dumm umgesetzt wie Atmel selber. Und nur als 
Tüpfelchen auf dem 'i' haben sie es dann zusätzlich auch noch geschafft, 
dass sie mit den Atmel-Deklarationen in einigen Punkten (speziell 
Interuptvektoren) nicht mehr übereinstimmen...
Auch wieder: typisches Frickler-Niveau (allerdings zum Quadrat, denn es 
multipliziert sich mit der Atmel-Frickelei)...

Neben den ganzen deklarativen Problemen kommt aber noch hinzu, dass es 
echte funktionelle Unterschiede wischen gleich benamsten Timern auf 
unterschiedlichen Devices gibt. Wäre das deklarative Wirrwar auf allen 
Ebenen nicht, könnte man das einfachst zur Designzeit abhandeln, nach 
dem Schema: gibt's irgendein erwartetes Register oder Bit nicht, kann 
ich den Timer nicht wie gewünscht verwenden und schon beim 
Kompilieren/Assemblieren einen für den Benutzer (also in diesem Fall: 
Programmierer) aussagekräftigen Fehler werfen.

> kann man alle drei timer gleichzeitig verwenden?

Ja.

> oder ist wenn man den 16 bit timer verwendet die beiden 8 bit
> timer belegt?

Nein, es sind wirklich drei Timer vorhanden. Sowas kann man getrost dem 
DB entnehmen. Wen man nicht zu faul ist, wenigstens dessen 
Inhaltsvezeichnis auch nur zu überfliegen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.