PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Prog läuft nicht >>> ISR(TIM1_COMPA) ok?



frabe
13.06.2019, 16:25
Hallo zusammen.
Versuche mich gerade an Timer-Interrupt. uC-Schaltung läuft nicht, kein Blinken.
Warnung vom Compiler;
'TIM1_COMPA' appears to be a misspelled signal handler, missing __vector prefix [-Wmisspelled-isr]

Wo liegt der Fehler?



#define F_CPU 1000000UL // int.Takt als Macro übernehmen
#include <avr/interrupt.h> // Interrupt einbinden, damit Interrupt funktioniert

ISR(TIM1_COMPA) // Interrupt Service Routine (Seite 48), sobald Vergleichswert OSR1A erreicht wird
{
PORTB ^= (1<<PB0); // LED blinkt
}

int main(void)
{
DDRB |= (1<<PB0); // LED als Ausgang

TCCR1B |= (1<<WGM12) | (1<<CS11); // Timer1 (16bit), CTC-Mode, Prescaler=8
TIMSK1 |= (1<<OCIE1A); // Interrupt für Timer1, Interrupt auslösen sobald Vergleichswert erreicht wird
OCR1A = 62500; // OCRx = (Wunschzeit bis 1 Interrupt * f_CPU/Prescaler) - 1 // 500ms*1 000 000/8=62500 // bei 100ms=12499
sei(); // Interrupt´s werden gestartet und läuft im Hintergrund

while(1)
{

}
}

oberallgeier
13.06.2019, 16:59
.. Versuche mich gerade an Timer-Interrupt .. Warnung vom Compiler .. missing __vector prefix .. Wo liegt der Fehler? ..Der Fehler liegt wohl da, wo er vom Compiler angemeckert wird:

Dein Aufruf der ISR (für tiny84??) :
ISR(TIM1_COMPA) //
Mein Aufruf der ISR (für mega328P) :
ISR(TIMER2_COMPA_vect) //

Ok, ok, Du hast also wohl (immer noch) den tiny84 und den C-Compiler am Laufen, dort heißt der Interrupt-Vektor wirklich "TIM1_COMPA" - aber die ISR will halt noch den Zusatz: "-vect". Sprich: die ISR wird mit "ISR(TIM1_COMPA-vect)" gecodet. Die Initialisierung habe ich aber nicht controlliert und das alles auch nicht ausprobiert.

Viel Erfolg.

Searcher
13.06.2019, 17:02
Versuche mich gerade an Timer-Interrupt. uC-Schaltung läuft nicht, kein Blinken.
Warnung vom Compiler;
'TIM1_COMPA' appears to be a misspelled signal handler, missing __vector prefix [-Wmisspelled-isr]


Hallo,
welcher µC, welcher Compiler/IDE?
Womöglich hilft dies weiter: http://privatfrickler.de/avr-gcc-namen-der-interrupt-vektoren-fur-isr/

Gruß
Searcher

oberallgeier
13.06.2019, 17:13
...
| Sprache: C | AtmelStudio | Atmel-ICE | Favorit-uC: ATtiny84 | Status: Anfänger |Du hast ja mit Deiner Signatur wirklich eine gute Beschreibung Deiner Person und der forumspezifischen Umgebung. Trotzdem so einen oder andern Wunsch oder Hinweis. Atmel-Studios gibts etliche; ich habe AVR Studio 4 (genauer 4.18.700) und Atmel Studio 7.0.1931 am laufen. Da gibts schon (teils kleine, teils größere) Unterschiede. Und ne Frage: was ist ne Atmel-ICE ? Ist das vielleicht ne IDE ?
Klingt pingelig - nur, ich finde Deine Idee/Signatur a) wirklich super aber b) etwas nicht wirklich gaaanz deutlich/verständlich.

Schönen Abend.

Holomino
13.06.2019, 18:59
Wer es genau wissen will(aber wer will das schon)

Durch die Auswahl eines Controllers beim Anlegen eines neuen Projektes bekommt man im Studio automatisch auch ein oder zwei controllerspezifische IO-Header-Datei eingebunden. Z.B.:
iotn25.h für den Tiny25
und
iotnx5.h für alle 5er Tinys, also Tiny25/45/85

Die werden im SolutionExplorer bei dem neueren ATMEL Studio als Dependencies (!!!erst nach dem Kompilieren) zur Ansicht angeboten. (Beim alten AVRStudio 4 waren die auch unter einem extra Knoten aufgeführt, ob der Dependencies hieß, weiß ich aber auch nicht mehr)

Lange Rede, kurzer Sinn, in diesen Dateien findest Du Konstrukte, wie:
#define TIM0_COMPA_vect _VECTOR(10)

Die geben die notwendige Umbenennung für die ISRs vor.

frabe
14.06.2019, 07:03
Mein Aufruf der ISR (für mega328P) :
ISR(TIMER2_COMPA_vect) //

Hallo OberAllgeier, im Datenblatt des ATTiny84 finde ich nur TIM1_COMPA als Timer/Counter1 Compare Match A (Seite 48).
34221
Es gibt keinen TIM1_COMPA_xxx oder TIMER1_COMPA_vect.
Daher meine Unverständniss (Hilflosigkeit) bzgl. der Warnmeldung.

oberallgeier
14.06.2019, 07:38
.. im Datenblatt des ATTiny84 finde ich nur TIM1_COMPA als Timer/Counter1 Compare Match A .. keinen TIM1_COMPA_xxx oder TIMER1_COMPA_vect ..Du heilige Kuh, woher hast Du nur das "TIM1_COMPA_xxx" ? ? ?

Versuch einfach meine Empfehlung von oben:
.. dort heißt der Interrupt-Vektor wirklich "TIM1_COMPA" - aber die ISR will halt noch den Zusatz: "-vect". Sprich: die ISR wird mit "ISR(TIM1_COMPA-vect)" gecodet ..ohhh, Mist, nein. Natürlich ist der Bindestrich falsch, das müsste ne Fehlermeldung geben, weil der Compiler das wohl als Subtraktionsoperator interpretiert. Also bitte im Code:
ISR(TIM1_COMPA_vect)ISR(TIM1_COMPA_vect)
und keine Angst, der Controller explodiert nicht, selbst wenn mal der Code falsch sein sollte.

Und bitte: welches Atmel-Studio benutzt Du? Was bedeutet in Deiner Signatur "Atmel-ICE ?"

frabe
14.06.2019, 07:58
Du heilige Kuh, woher hast Du nur das "TIM1_COMPA_xxx" ? ? ?

xxx soll als Platzhalter für irgend etwas stehen. Daher habe ich im Datenblatt nach "TIM1_COMPA_" gesucht und nichts gefunden - also auch kein "_vect", oder "_vector"...
Hmmm? Macht es tatsächlich Sinn, Registereinträge zu verwenden, die nicht im Datenblatt vor kommen?

Habe meine Signatur geändert AtmelStudio7.x (x steht hier für Sonstige Unter-Unter-Unter-Versionen ;-).
Mein Programmer/Debugger läuft wie ein ICE, Atmel nennt den tatsächlich auch Atmel-ICE.
http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-ICE_UserGuide.pdf

frabe
14.06.2019, 14:25
ISR(TIM1_COMPA_vect)
und keine Angst, der Controller explodiert nicht, selbst wenn mal der Code falsch sein sollte.

Prima - funktioniert einwandfrei mit TIM1_COMPA_vect !
Gibt es eine Logik, warum das nicht im Datenblatt steht?

Holomino
14.06.2019, 14:54
Sicher. Die DBs einiger Tiny-Typen sind so alt, da gab es den gcc für AVR noch gar nicht.
Im einzig damals verfügbaren Assembler hätte auch ein jmp auf ein beliebig benanntes Label gereicht.

Wie oben geschrieben: Im Zweifelsfall (Warnungen/Fehler) liest der Compiler nicht das DB, sondern die io-Headerdateien.


Nachtrag: Hab ich für die ISR-Benamsung auch zu Anfang nicht über die Header rausgesucht, sondern bin stattdessen über die Seite
https://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html gegangen. Da gibt's ne entsprechende Tabelle, die allerdings seit geraumer Zeit nicht mehr gepflegt wird.

oberallgeier
14.06.2019, 15:31
.. Signatur geändert AtmelStudio7.x (x steht hier für Sonstige Unter-Unter-Unter-Versionen ..Signatur ist VIEL schöner *gg*. Allerdings bei den "x", den Unter-Unter-Versionen gibts dann doch Unterschiede da könnte es besser sein die aktuelle "build"-Ziffer zu nehmen. Aber das ist dann wirklich eher ne Nebensache.


.. Mein Programmer/Debugger läuft wie ein ICE, Atmel nennt den tatsächlich auch Atmel-ICE ..Ach je, die gestrige Frage nach dem "Atmel-ICE" war Blödsinn. Lag vielleicht daran, dass ich zu schwer und zu lange geklettert war - und das in der prallen Sonne . . . Ich hatte vor Jahr(hundert)en selbst mit nem ICE gearbeitet (eher gespielt) und sollte den Unterschied zwischen ICE ( I Cähhh Eh ) der Bahn und ICE ( sprich: "eiß" - In-Circuit Emulator ) eigentlich schon dauernd parat haben. Ich schiebs mal darauf, dass ich bei nem "Anfänger" keinen ICE ( "eiß" ) vermutete.

So, zur Sache.
Ich habe mal ein neues Projekt im Studio 7 (meines : 7.1931) aufgemacht, ein GCC C Executable Projekt. Auswahl des Devices: ATtiny84 - und schon präsentiert das Studio7 die Seite [main.c]. Da gleich mal ne ISR angelegt - einfach Deinen Code
ISR(TIM1_COMPA) // Interrupt Service Routine (Seite 48), sobald Vergleichswert OSR1A erreicht wird
{
PORTB ^= (1<<PB0); // LED blinkt
}eingefügt, - siehe hier :

......https://dl.dropbox.com/s/o4k8dmpf7njkk9f/tiny84.jpg?dl=0

Kaum hatte ich nach dem !! bereits vom Studio 7 vorgeschlagenen !! "ISR(TIM1_COMPA" nen Unterstrich eingetiuppt, kam schon die Ergänzung "vect" - wie es oben gezeigt ist.


Prima - funktioniert einwandfrei mit TIM1_COMPA_vect ! ..Prima. Dann wärs das ja. Und zur Logik - das wurde bereits erklärt. Es gibt eben Unterschiede zwischen Datenblatt-Informationen und den Wünschen bzw. Vorstellungen des Compilers . . . Dazu siehe die Informationen zum Compiler mal hier (die nongnu-site (http://nongnu.org/avr-libc/user-manual/group__avr__interrupts.html#gad28590624d422cdf30d6 26e0a506255f)) oder bei Microchip (aktueller Atmelhersteller/-vertreiber (https://www.microchip.com/webdoc/AVRLibcReferenceManual/porting_1iar_porting_isr.html)) selber !