Hallöchen! Habe gerade einen frischen tiny45 auf mein Platinchen gebracht und wollte nun ein kleines C Programm mit einem Pin-Change-Interrupt schreiben. Habe also in die iotn45.h geschaut und festgestellt, dass da nichts über die Interrupt "Namen" drin steht?!? Interrupts kann er aber laut Datenblatt! Habe auch schon die neuste Version von WinAVR installiert, aber auch da steht nichts in der iotn45 Hat jemand ein Tip für mich?
Die Interrupt-Vektoren und die meisten Register-Definitionen stehen in der iotnx5.h. Abgesehen davon sind die Vektornamen für alle unterstützten Controller in der libc-Doku sauber dokumentiert. Darüberhinaus sind die Namen aus den Bezeichnungen im Datenblatt durch Anhängen von "_vect" (und eventuellem Ersetzen von Blanks durch Underscores) ableitbar.
iotnx5.h (sagt "find _vector <winavr-verzeichnis>\avr\include\avr\tn*.h" unter windows xp) Die Header für die größeren AVR-Familen (tinyx5, tinyx4, megax8, etc.) sind alle so organisiert. hth, Jörg
Vor allem sollte man das sofort bemerken, wenn man die Headerdatei durchsieht. Der Include
1 | #include <avr/iotnx5.h> |
steht doch ganz am Anfang.
Ok! Danke. Habe halt nur immer die iotn45.h geöffnet und runtergescrollt. In den mega-Files die ich bislang gebraucht hatte, da stand das auch so drin und bei der tn2313 war es halt auch noch so. Mit dem Ableiten aus dem Datenblatt hatte ichs auch schon probiert, dummerweise klappt das nicht immer! Wie in meinem Fall PCINT2_vect gibts nämlich nicht, das Ding heisst, warum auch immer, PCINT0_vect. Aber okay, weiss ja nun wo ich suchen muss, läuft auch alles! Danke.
>Wie in meinem Fall PCINT2_vect gibts nämlich nicht, In der Tat > das Ding heisst, warum auch immer, PCINT0_vect. Das heißt PCINT0, weil der Interrupt so heißt - es gibt schließlich nur einen Pin-Change-Interrupt (Der von mehreren Pins ausgelöst werden kann):
1 | Table 10-1. Reset and Interrupt Vectors |
2 | Vector |
3 | No. |
4 | Program |
5 | Address Source Interrupt Definition |
6 | 1 0x0000 RESET |
7 | External Pin, Power-on Reset, Brown-out Reset, |
8 | Watchdog Reset |
9 | 2 0x0001 INT0 External Interrupt Request 0 |
10 | 3 0x0002 PCINT0 Pin Change Interrupt Request 0 |
11 | ^^^^^^ DA steht der Name |
12 | 4 0x0003 TIMER1_COMPA Timer/Counter1 Compare Match A |
13 | 5 0x0004 TIMER1_OVF Timer/Counter1 Overflow |
14 | 6 0x0005 TIMER0_OVF Timer/Counter0 Overflow |
15 | 7 0x0006 EE_RDY EEPROM Ready |
16 | 8 0x0007 ANA_COMP Analog Comparator |
17 | 9 0x0008 ADC ADC Conversion Complete |
18 | 10 0x0009 TIMER1_COMPB Timer/Counter1 Compare Match B |
19 | 11 0x000A TIMER0_COMPA Timer/Counter0 Compare Match A |
20 | 12 0x000B TIMER0_COMPB Timer/Counter0 Compare Match B |
21 | 13 0x000C WDT Watchdog Time-out |
22 | 14 0x000D USI_START USI START |
23 | 15 0x000E USI_OVF USI Overflow |
24 | ^ Der GCC zählt hier ab 0 |
/klugscheiß, Jörg
Ja, das es nur Einen gibt, der von mehrern Pins ausgelöst werden kann ist mir schon klar gewesen. Weil ich in der iotn45.h ja nichts gefunden hatte, hatte ich vorher auch mal "ISR(PCINT_vect) {...}" probiert, weil ich gedacht habe, wenn es nur einen Interrupt gibt, wird der sicher PCINT heissen. Für mich klingt es halt nur ein bisschen unsinnig es PCINT0 zu nennen, wenn er nicht nur den Pin PCINT0 sondern auch PCINT1..PCINT5 pollen kann. Wie auch immer, er heisst einfach so! :) Ich werd jedenfalls zukünftig mal auf die include-Zeilen achten! ;) Dann spar ich mir das mit dem Raten.
Sven wrote: > Ja, das es nur Einen gibt, der von mehrern Pins ausgelöst werden kann > ist mir schon klar gewesen. > > Weil ich in der iotn45.h ja nichts gefunden hatte, hatte ich vorher auch > mal "ISR(PCINT_vect) {...}" probiert, weil ich gedacht habe, wenn es nur > einen Interrupt gibt, wird der sicher PCINT heissen. Für mich klingt es > halt nur ein bisschen unsinnig es PCINT0 zu nennen, wenn er nicht nur > den Pin PCINT0 sondern auch PCINT1..PCINT5 pollen kann. Wie willste den denn sonst nennen? PCINT0bis5 oder was? Bei größeren Controllern gibt es nunmal mehrere Pin Change Interrupts und deshalb hat ATMEL die Nomenklatur für alle AVRs vereinheitlicht. Klar, auf den ersten Blick macht es keinen Sinn, Dinge durchzunummerieren, von denen es nur eins gibt, aber man darf nicht vergessen, dass die AVRs eine große Familie sind. Und um dem Programmierer das Leben leichter zu machen, sind die Bezeichnungen bei allen AVRs identisch. Es gibt auch AVRs mit mehreren UARTs, die dann mit UART0, UART1 usw. durchnummeriert werden. Deshalb heißt auch bei einem AVR mit nur einem UART das Ding UART0. Das einzige, was in den Datenblättern wirklich nicht gut gelöst ist, ist die teilweise Verwendung der selben Bezeichnung PCINT für den Interrupt und für die Pins, die damit zusammenhängen.
>Ich werd jedenfalls zukünftig mal auf die include-Zeilen achten! ;) Dann >spar ich mir das mit dem Raten. RTFM http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html Findest du auch auf deiner Platte... Oliver
>Wie willste den denn sonst nennen? PCINT0bis5 oder was? PCINT_vect, hatte ich aber auch geschrieben. >Bei größeren Controllern gibt es nunmal mehrere Pin Change Interrupts und >deshalb hat ATMEL die Nomenklatur für alle AVRs vereinheitlicht. Unter dem Aspekt der Vereinheitlichung macht PCINT0_vect Sinn, da gebe ich dir Recht. Bei dem Tiny2313 heisst es aber PCINT_vect bei dem Tiny45 PCINT0_vect! Ausserdem existieren Alternativen wie SIG_PIN_CHANGE oder _VECTOR(11). Was ist daran vereinheitlicht? Was hat ATMEL denn damit zu tun? WinAVR ist doch -soweit ich weiß- OpenSource!? Oder hat Atmel die Finger da noch mit drin?
Sven wrote: > Unter dem Aspekt der Vereinheitlichung macht PCINT0_vect Sinn, da gebe > ich dir Recht. Bei dem Tiny2313 heisst es aber PCINT_vect bei dem Tiny45 > PCINT0_vect! Der Tiny2313 ist aber auch deutlich älter. Als der rauskam, war die Vereinheitlichung noch nicht durch. > Ausserdem existieren Alternativen wie SIG_PIN_CHANGE oder > _VECTOR(11). Was ist daran vereinheitlicht? Die SIG_-Varianten sind für die alten SIGNAL-Handler, die nur noch aus Kompatibilitätsgründen unterstützt werden und in neuen Projekten nicht mehr verwendet werden sollten (und die noch nicht so vereinheitlicht waren). Und die _VECTOR(NUMMER)-Dinger sind ja wohl selbsterklärend! Mit so einem Konstrukt kann man den Interrupt-Vektor eben anhand seiner Nummer ansprechen. > Was hat ATMEL denn damit zu tun? WinAVR ist doch -soweit ich weiß- > OpenSource!? Oder hat Atmel die Finger da noch mit drin? Sag mal, denkst Du auch mal ein bisschen nach, bevor Du hier schreibst? Solltest Du jedenfalls mal in Erwägung ziehen! Der WINAVR ist ein Paket für AVR-Controller... [SARKASMUS] Wenn ich einen Compiler für eine Controllerfamilie baue, dann werde ich natürlich darauf achten, dass ich für alles, was an Controller-spezifischen Dingen angesprochen werden muss, eigene Namen definiere, damit die Leute, die den Compiler verwenden wollen, zusätzlich noch im Buchhandel ein dickes Handbuch mit einer Referenzliste kaufen müssen, die die im Datenblatt stehenden Bezeichnungen mit den von mir als Compiler-Anbieter vorgegebenen verknüpft. Schließlich sollen Entwickler sich nicht an die beschissenen Datenblätter vom Hersteller halten, sondern gefälligst meine überteuerten Bücher kaufen. Der Compiler ist zwar Open Source, aber irgendwo muss das Geld ja herkommen [/SARKASMUS] Abgesehen davon steht der Hauptentwickler von WINAVR afaik bei ATMEL (zumindest teilzeitmäßig) in Lohn und Brot...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.