Forum: Mikrocontroller und Digitale Elektronik AVR-USB Interrupt


von Marc08 (Gast)


Lesenswert?

Ich habe 2 Fragen:

1. Ist es richtig, dass PCINT-Interrupt immer dann auslösen, wenn der 
Pin eine steigende oder fallende Flanke hat? Solange mein Pin immer auf 
logisch 1 oder 0 bleibet wird dieser Interrupt nicht ausgelöst, oder?

2. Ich habe das Problem, dass (wie ich bisher nur vermute) mit AVR-USB 
den PCINT-Interrupt nachdem Daten an den Computer gesand wurden 
aktiviert wird. Wie kann ich das abstellen?


Das Signal das an dem Pin anliegt bleibt kontinuierlich auf 1 
(nachgemessen mit dem Oszi) und leider wird trotzdem die PCINT-ISR 
aufgerufen, ich weiß halt nicht wie ich das mit dem AVR-USB überprüfen 
sollte...

von Hmm... (Gast)


Lesenswert?

> Ist es richtig, dass PCINT-Interrupt immer dann auslösen, wenn der
> Pin eine steigende oder fallende Flanke hat? Solange mein Pin immer auf
> logisch 1 oder 0 bleibet wird dieser Interrupt nicht ausgelöst, oder?

Jap, falls du den Pin-Change Interrupt der AVRs meinst ist das richtig. 
Der Interrupt erfolgt wenn die Funktion aktiviert ist und ein Flanke 
detektiert wird.

Zitat aus den Datenblatt des ATtiny2313:

"The pin change interrupt PCIF will trigger if any enabled PCINT7..0
pin toggles. The PCMSK Register control which pins contribute to the pin 
change interrupts. Pin change interrupts on PCINT7..0 are detected 
asynchronously. This implies that these interrupts can be used for 
waking the part also from sleep modes other than Idle mode."

> Ich habe das Problem, dass (wie ich bisher nur vermute) mit AVR-USB
> den PCINT-Interrupt nachdem Daten an den Computer gesand wurden
> aktiviert wird.

Ähm, was? Anscheinend ist die Kristallkugel etwas beschlagen...

> Wie kann ich das abstellen?
Beim Attiny2313 geht das in dem man die Pinchange-Interrupts 
deaktiviert:

PCMSK = 0x00;

von Marc08 (Gast)


Lesenswert?

Beim ATTiny24 auch, oder?


Ich will nur sagen, dass ich AVR-USB auf dem TINY24 an ebenfalls an dem 
PortA habe, wie auch das Signal, dass es zu decodieren gilt...


Pinbelegung: USB: PINA6 und PINA7
             Signal: PINA0


SFR-Register:
PCMSK0 |= (1 << PCINT0);
GIMSK |= (1 << PCIE0);

Somit müsste er doch nur in die ISR springen, wenn am PINA0 ein 
Flankenwechsel passiert, oder?

von Marc08 (Gast)


Lesenswert?

Was ich auch nicht verstehe im Datenblatt:

Initalwerte der Interruptflags sind 0, aber es steht auch drin, dass ich 
diese zum manuell Löschen auf logisch 1 setzen muss, was macht denn das 
für ein Sinn?

Heißt das dass erst mal alle Interrupts beim aktivieren aus dem 
Initialzustand ausgelöst werden?

von Marc08 (Gast)


Lesenswert?

Habe jetzt nochmal alles ausführlichst getestet.

Ich glaube dass mir sobald der INT0-Interrupt (USB-Kommunikation) 
auslöst irgendwas mit den DDRA und PORTA-Registern passiert, dass danach 
der Timer auslöst...

Ein löschen nach dem Abschluss der Übertragung des PCIF0-Flags würde mir 
ja dann reichen, aber die INT0-ISR wurde in Assembler geschrieben und 
kann also nicht nochmal die ISR im C-Programm aufrufen, oder?

von Marc08 (Gast)


Lesenswert?

Weiß zufällig jemand wo der Rücksprungbefehl von der INT0-ISR im 
Assemblerfile (des AVR-USB) ist?

von Hmm... (Gast)


Lesenswert?

Kann ich dem entnehmen, dass du versuchst einen Software USB-Stack 
(obdev?) auf einem ATtiny24 zum laufen zu bekommen?

Vielleicht solltest du dich zunächst etwas näher mit USB beschäftigen. 
Dein Problem ist nunmal die für einen AVR nicht unerhebliche 
Geschwindigkeit, es müssen immerhin runde 1.1 Mhz abgetastet werden, von 
dem knappem Megabyte Daten das im Extremfall pro Sekunde auseinander 
gebastelt werden muss ganz zu schweigen.

Das ist schon mit dem Pinchange-Interrupt ein hartes Stück Arbeit für 
den AVR, ohne ist es gänzlich unmöglich.

Vorschlag:

1. Poste deine Schaltung

2. Poste deine Quellen.

3. Formuliere bitte dein Problem mal ordentlich aus, so dass klar wird

   - wie dein System aussieht
   - was es tun soll
   - wie dein Problem aussieht

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.