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
"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
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!
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.
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
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
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.
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!
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?
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...