Forum: Mikrocontroller und Digitale Elektronik USB-CDC mit externen Interrupt1


von Maverick (Gast)


Angehängte Dateien:

Lesenswert?

Versuch schon seit längerer Zeit herauszufinden weshalb bei jedem 
starten des PICs (realeas from reset), die USB-Schnittstelle bzw. das 
Terminal Programm sich aufhängt.

Das Pic soll Daten von einem I2C-Bus sniffer (kein use_i2c) und binär 
über die USB-Schnittstelle an den PC schicken. Die Start und Stop 
Bedingung werden von meiner Beschaltung (auf die ich jetzt nicht näher 
eingehen will) erkannt.
Im Prinzip soll in der Interrupt-Routine zuerst alle positiven 
Taktflanken erkannt werden und dann die Datenleitung ausgelesen werden.
Entweder liegt der Fehler beim Warten auf die START und STOP-Bedingung 
in der Main oder der USB-Treiber schluck den Interrupt nicht.

Danke im Voraus

von Guest (Gast)


Lesenswert?

Und was ist jetzt Deine Frage?

von Holger Löffler (Gast)


Lesenswert?

Interrupts sind essentiell in der USB-Kommunikation. Ohne Interrupts 
würde dein PC z.B. das Anstecken deines USB-Sticks nicht erkennen. Lesen 
der USB-Enumeration wäre für dich von Vorteil.

von holger (Gast)


Lesenswert?

>Entweder liegt der Fehler beim Warten auf die START und STOP-Bedingung
>in der Main oder der USB-Treiber schluck den Interrupt nicht.

Warten ist bei USB überhaupt nicht gut. Der PC fragt
in regelmäßigen Abständen dein USB-Device ab. Wenn das
nicht antwortet wird es vom OS ignoriert bis du den Stecker
abziehst und es wieder reinsteckst. Tja, und dann geht das
Spiel von vorne los. Dein Programm wird so nie funktionieren.

von Maverick (Gast)


Lesenswert?

Sorry, die Frage war ein wenig unverständlich:
Mein Problem ist vor allem, dass das Terminal sich aufhängt wenn der PIC 
startet. Sobald ich aber den Interrupt "disable" funktioniert die 
USB-Schnittstelle ohne Probleme.
Meine Frage: Liegt das daran, dass die USB-Schnittstelle vom Interrupt 
behindert wird.

von Potter (Gast)


Lesenswert?

Kann sein, daß sich die Interrupts beißen. Vesuch mal den USB zu pollen.

Wo bleibt denn Dein Mikrocontroller hängen? Oder läuft der durch? Laß 
mal eine LED blinken (in der main()).

1
while() ...
schreit nach hängen bleiben! Sind das original Microchip-Routinen?

Gruß Potter

von Maverick (Gast)


Lesenswert?

OK hab's jetzt mit der Methode der blinkenden LED versucht:
1. Ohne Interrupt:
1
disable_interrupts(int_ext1);
     blinkt in der While-Schleife andauernd was logisch ist
     da die Bedingung (in der While-Schleife):
1
if(numb == 17){
     nicht erfüllt wird.  (numb wird in der Interrupt Rutine erhöht!!!)
2. Mit Interrupt:
     Springt in die if-schleife. Schreibt aber nichts auf den USB-Bus.
     Auch die Interrupt-Rutine wird durchlaufen, wahrscheinlich aber nur
     einmal!!!
     Schreib außerdem nur "Analyse" aber nie "Analyse2"

Hab daraufhin versuch die Befehle:
1
while(!START);
1
while(!SSTOP);
aus zu kommentieren (//)
und den Interrupt während die werte über die USB-Schnittstelle gesendet 
werden, die deaktivieren:
  ohne Erfolg??

von Potter (Gast)


Lesenswert?

Dann hängt er bei
1
while(!START);          //Wartet auf Startbedinnung
oder bei
1
 while(!usb_cdc_putready());

D.h. entweder wird START nicht erfüllt oder der Transfer-Buffer vom CDC 
wird zwar einmal gesendet aber dann nicht mehr zurückgesetzt.

Was hast Du denn am START-Pin hängen?
Wird denn der USB regelmäßig bedient (Service-Routine)?

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.