Gast
#4229378
Hi, Ich habe den USB Code von Pierre Gaufillet fuer PIC18F2550 der mit Polling arbeitet, auf Interrupt umgestellt. Der USB Code laeuft bis auf ein kleines Problem auch ueber Interrupt. Unten ein Auszug aus meiner main routine. command besteht aus einem switch der Kommandos die ich ueber die USB Schnittstelle sende, ausfuehren soll. void main(void) { ..... sel = 0; while(sel == 0) { LATCbits.LATC0 = 0; command(); LATCbits.LATC0 = 1; } } void interruptHigh (void) __interrupt 1 { //LATCbits.LATC0 = 0; if (PIR2bits.USBIF) { LATCbits.LATC1 = 0; dispatch_usb_event(); PIR2bits.USBIF = 0; LATCbits.LATC1 = 1; } //LATCbits.LATC0 = 1; } Nach einem Reset sehe ich fuer eine kurze Zeit PC0 schalten, danach toggelt nur mehr PC1 mit einem Duty Cycle von 50:50 und einer Periode von ca. 9ms. Ich schliesse daraus dass zumindest der USB Interrupt richtig funktioniert, d.h. nach Verlassen der Interruptroutine nicht sofort wieder aktiv ist. Ich bin mir auch ziemlich sicher, dass der USB Interrupt der einzige Interrupt ist, den das System im Augenblick verwendet. Fuer mich sieht es so aus, als ob der USB Code den PIC18F2550 in den sleep mode versetzt, aus den ihn dann der USB Interrupt wieder aufweckt. Leider konnte ich ausser in einer nicht benutzten Routine keine sleep Anweisung im USB Code finden. In der Doku vom PIC18F2550 finde ich jedenfalls nichts erhellendes zu diesem Thema. Das Setzen des SUSPND Bit des USB Controller im USB Code habe ich auch schon auskommentiert, leider ohne Erfolg. Die Routine von dispatch_usb_event(), die fuer den USB Interrupt zustaendig ist, findet sich im Anhang. Das Problem nervt mich seit einiger Zeit, bin daher um jeden Tip dankbar