Guten Tag Zusammen, leider habe ich ein Problem beim nutzen des PCINT21 [PD5]. Vorab ein paar Infos: Ich Programmiere im aktuellen AVR Studio und nutze das Microchip XPlained 328PB. Momentan ist der Plan über einen Taster, welcher an PD5 angeschlossen ist (Wenn Taster gedrückt = LOW, Taster nicht gedrückt = HIGH) eine LED an PC3 zum leuchten zu bringen. Hierzu folgender Programmteil: define F_CPU 16000000 #include <avr/interrupt.h> #include <avr/io.h> #include <asf.h> ISR(PCINT21_vect){ PORTC|=1<<PORTC3; } int main (void) { DDRD|=1<<PORTD5; PCICR|=1<<PCIE2; PCMSK2|=1<<PCINT21; sei(); while(1){} } Leider kommt hier immer eine Fehlermeldung bezüglich dem Handler: 'PCINT21_vect' appears to be a misspelled signal handler, missing __vector prefix [-Wmisspelled-isr] Da ich das Datenblatt nun das zweite Wochenende (ohne Ergebnis) nach einer Lösung durchsucht habe, hoffe ich hier Hilfe finden zu können. Mit bestem Dank und freundlichen Grüßen Christoph
Die ISR gilt ja für die ganze Gruppe, also heißt es vielleicht 'PCINT2_vect'.
> das Datenblatt nun das zweite Wochenende (ohne Ergebnis)
?
Ein Blick in die Dokumentation der C Bibliothek könnte ebenso angebracht sein. Da sind alle Interrupt-Vektoren tabellarisch aufgelistet. https://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
noch etwas:
> DDRD|=1<<PORTD5;
Das solle doch
1 | DDRC|=1<<PORTC3; |
heißen, oder? Und D5 benötigt einen externen Pullup-Widerstand, oder intern im Programm
1 | PORTD|=PORTD5; |
Guten Abend S.Landolt, erstmal herzlichen Dank für Ihre schnelle Antwort. Die betreffenden Stelle (Auszug aus dem Datenblatt) habe ich mir nochmal angeschaut... muss ich gekonnt ignoriert haben. Wie Sie bereits gesagt haben es muss ISR(PCINT2_vect) heißen. Mit dem Fehler im Quelltext (DDRC|=1<<PC3) haben Sie recht der ist jedoch schon behoben. Ebenso habe ich externe Pullups verwendet. Muss aber noch ein Fehler haben... geht leider immer noch nicht. Aber hat mir schon mal sehr geholfen.
Hallo, du hast noch 2 Probleme. Der Taster prellt, musste entprellen. In der ISR tust du ver-odern nicht toggeln. Wenn es keine reine Übung ist, dann würde ich Taster nicht mittels ISR abfragen.
> geht leider immer noch nicht
Also bei mir läuft es; vielleicht besteht ein Missverständnis bezüglich
der Funktion: nach Programmstart liegt C3 auf low, nach Drücken von
Taster an D5 geht C3 dauerhaft auf high.
1 | #define F_CPU 16000000
|
2 | #include <avr/interrupt.h> |
3 | #include <avr/io.h> |
4 | |
5 | ISR(PCINT2_vect){ |
6 | PORTC|=1<<PORTC3; |
7 | }
|
8 | |
9 | int main (void) |
10 | {
|
11 | PORTD|=PORTD5; |
12 | DDRC|=1<<PORTC3; |
13 | PCICR|=1<<PCIE2; |
14 | PCMSK2|=1<<PCINT21; |
15 | |
16 | sei(); |
17 | while(1){} |
18 | }
|
PS: Mangels ATmega328PB arbeite ich mit einem ATmega48PA, aber da besteht in diesem Fall sicher kein Unterschied.
Guten Abend Zusammen, Entschuldigung, dass ich mich jetzt erst ein paar Tage später melde. Also das Programm Funktionier doch, warum es aber erst ein Tag später ging kann ich nicht sicher sagen. Ich vermute, dass es ein Kontaktproblem an der Schalterschnittstelle war (Steckkontakt). Das habe ich aber inzwischen geändert. Habe gestern schon einiges damit ausprobiert und es läuft absolut zuverlässig. Jetzt kann es weiter gehen mit meinem Projekt. Möchte mich nochmal ganz herzlich für die ultra schnelle Hilfe hier bedanken und wünsch eine schöne Weihnachtszeit. Grüße Christoph
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.