Forum: Compiler & IDEs tiny45 kein Interrupt Vector?


von Sven (Gast)


Lesenswert?

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?

von Johannes M. (johnny-m)


Lesenswert?

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.

von Jörg G. (joergderxte)


Lesenswert?

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

von Sepp (Gast)


Lesenswert?

Vor allem sollte man das sofort bemerken, wenn man die Headerdatei 
durchsieht.

Der Include
1
#include <avr/iotnx5.h>
steht doch ganz am Anfang.

von Sven (Gast)


Lesenswert?

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.

von Jörg G. (joergderxte)


Lesenswert?

>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

von Sven (Gast)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

>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

von Sven (Gast)


Lesenswert?

>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?

von Johannes M. (johnny-m)


Lesenswert?

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
Noch kein Account? Hier anmelden.