Forum: Mikrocontroller und Digitale Elektronik AVR XPlained 328PB Freigabe/Nutzung von PCINT 21


von Christoph (Gast)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

Die ISR gilt ja für die ganze Gruppe, also heißt es vielleicht 
'PCINT2_vect'.

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

> das Datenblatt nun das zweite Wochenende (ohne Ergebnis)

?

von Stefan F. (Gast)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?


von S. Landolt (Gast)


Lesenswert?

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;

von Christoph (Gast)


Lesenswert?

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.

von Veit D. (devil-elec)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

PS:
Mangels ATmega328PB arbeite ich mit einem ATmega48PA, aber da besteht in 
diesem Fall sicher kein Unterschied.

von Christoph (Gast)


Lesenswert?

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