Forum: Mikrocontroller und Digitale Elektronik PIC18F2550 USB Interrupt sleep


von Robert (Gast)


Angehängte Dateien:

Lesenswert?

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

von Peter (Gast)


Lesenswert?

Und was war jetzt die Frage?

von Robert (Gast)


Lesenswert?

@Peter

Die anscheinend nur fuer mich offensichtliche Fragen lauten :
Warum toggelt PC0 nicht mehr oder warum fuehrt die CPU die Routine
command nicht mehr aus sobald die USB Interrupt Routine aktiviert
wird ?
Versetzt die USB Interrupt Routine die CPU in den Sleep Zustand und
wenn ja wie ?

von Peter (Gast)


Lesenswert?

Robert schrieb:
> Ich habe den USB Code von Pierre Gaufillet fuer PIC18F2550 der mit
> Polling arbeitet, auf Interrupt umgestellt.

Vermutlich liegt schon in Deinem ersten Satz das Problem.

Jedenfalls ist es ein erheblicher Unterschied, ob man mit oder ohne 
Interrupt arbeitet. Und das schlägt sich auch in der Art der 
Programmierung nieder. Einfach so kann man das jedenfalls nicht machen 
ohne den Quellcode bis ins Detail zu kennen.

Robert schrieb:
> Der USB Code laeuft bis auf ein kleines Problem auch ueber Interrupt.

Und hier liegt dann wohl Dein zweiter Irrtum.

Das Problem sieht vielleicht klein aus, da der USB aber überhaupt nicht 
funktioniert, ist es eher ein großes Problem.

Was ich damit sagen will: Du schaust nicht genau hin.

Das führt dazu, dass Du uns irgendwelche Codeschnipsel aus dem 
Zusammenhang heraus gerissen vorwirfst und denkst, dass sich das jemand 
tatsächlich detailliert anschaut.
Um einen USB Stack zu verstehen brauchts schonmal den einen oder anderen 
Tag.

Robert schrieb:
> Nach einem Reset sehe ich fuer eine kurze Zeit PC0 schalten, danach
> toggelt nur mehr PC1

Und welche Funktion kehrt dann offenbar nicht mehr nach dem Aufruf 
zurück?
Mit anderen Worten: Wo hängt sich Deine Kiste auf?

Robert schrieb:
> Fuer mich sieht es so aus, als ob der USB Code den PIC18F2550 in den
> sleep mode

Das ist natürlich die perfekte Erklärung dafür, warum es nicht an den 
selber durchgeführten Änderungen liegen kann.
In 99% der Fälle beruhigt das ungemein und ist aber trotzdem falsch 
(beachte meinen Kommentar zuvor: Deine Kiste hängt sich auf).

Robert schrieb:
> Das Setzen des SUSPND Bit des USB Controller im USB Code habe ich
> auch schon auskommentiert, leider ohne Erfolg.

Und wenn mn dann einfach immer weiter herumbastelt, ohne zu wissen was 
man tut, kann man genausogut auf ein Wunder hoffen.

Mein Tipp: Mach Dir klar, dass USB nicht trivial ist und nimm Dir die 
entsprechende Zeit zur Einarbeitung oder lass es gleich bleiben.

Robert schrieb:
> Die Routine von dispatch_usb_event(), die fuer den USB Interrupt
> zustaendig ist, findet sich im Anhang.

Was soll man sich das anschauen, wenn sich die Kiste in command() 
aufhängt?

von Robert (Gast)


Lesenswert?

@ Oberlehrer Peter

1. Du musst meinen Thread NICHT lesen !
2. Du musst auf meinen Thread NICHT antworten !
3. Die USB Routine funktioniert auf Interrupt Basis !
4. Die CPU haengt sich in command nicht auf !
5. Um ganz auf Nummer Sicher zu gehen habe ich die command Routine durch 
eine einfache for Schleife ersetzt. Erscheinungsbild wie oben 
beschrieben
PC0 toggelt nicht mehr.

n. sic tacuisses

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.