Das einlesen des UART Strings über die ISR Routine funktioniert jetzt
tadellos. Danke dafür an Alle.
Jetzt möchte ich ja nach erfolgreich übertragenen String den MCU wieder
in den Sleep Modus versetzten. Das funktioniert in etwa wie folgt:
1 | ...
|
2 | void main(void)
|
3 | {
|
4 | while(1)
|
5 | {
|
6 | if(flag == 1) // Wenn Endekennung oder Buffer voll
|
7 | {
|
8 | // verarbeite UART string irgendwie
|
9 | clean_buffer(); // Lösche Buffer wieder
|
10 | i = 0; // zeige wieder auf erstes Element im Buffer
|
11 | flag = 0; // Lösche Flag, da Wort erfolgreich erkannt
|
12 | Sleep(); // Schicke PIC18 über Makro wieder in Sleep Modus
|
13 | }
|
14 | }
|
15 | }
|
So weit so gut. Wie funktioniert das jetzt genau mit dem Erwachen aus
dem Sleep Modus. Ich würde ja gerne NICHT nach Irgendeiner Zeit den PIC
wieder erwachen, sondern immer genau dann wenn neue UART Daten anliegen.
Laut dem Reference Manual ("Section 28 Watchdog Timer and Sleep Mode")
soll dies auch möglich sein.
Wenn ich einen UART RX Interruptroutine implementiert habe über
1 | RCONbits.IPEN = 0; // disable interrupt priority
|
2 | INTCONbits.GIE = 1; // enable interrupts
|
3 | INTCONbits.PEIE = 1; // enable peripheral interrupts.
|
4 | PIE1bits.RCIE = 1; // enable USART receive interrupt
|
5 | PIE1bits.TXIE = 0; // disable USART TX interrupt
|
Erwacht der PIC dann automatisch genau dann wenn die ISR Routine
ausgelöst wird oder muss ich das Erwachen "händisch" in der ISR Routine
angeben??
Was genau hat es mit dem Watchdog auf sich? Ich habe gelesen, dass
dieser gelöscht bzw. disablet sein muss?
In den Config Bits sieht das bei mir bis dato wie folgt aus:
1 | #pragma config WDTEN = SWON // Watchdog Timer controlled by SWDTEN
|
2 | #pragma config WDTPS = 32768 // WDT postscalar
|
So wie ich es jetzt habe (siehe oben) scheint der PIC in den Sleep Modus
zu springen, aber danach nie wieder hinaus.
Die von WehohWeh angesprochene Problematik mit der disableten Clock (und
der damit fehlenden Baudrate) während des Sleep Modus scheint mir auch
noch nicht ganz klar und muss vermutlich beachtet werden.
Hat da jemand ein paar Codezeilen für mich?
Danke