USB-CDC mit externen Interrupt1

Gast #2123581
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
Angehängte Dateien:
Gast #2124368
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.
Gast #2124394
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.
Gast #2133208
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.
Gast #2133964
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
Gast #2137187
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??
Gast #2137861
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)?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren