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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.