Wenn ich das richtig verstanden habe brauche ich um den Pic schlafen zu legen: Eine INT-Routine welche alles abspeichert was vorher war und den schlaf an sich. INTCON2bits.INTEDG0=1 // Flanke 0 auf 1 INTCONbits.INT0IE=1 //INT RB erlauben INTCONbits.GIEH=1; // INT Überhaupt erlauben kann ich jett einfach schreiben Sleep() INTCON2bits.INTEDG0=1 // Flanke 0 auf 1 INTCONbits.INT0IE=1 //INT RB erlauben INTCONbits.GIEH=1; // INT Überhaupt erlauben reicht das?
bisher hab ich es so Hautprogramm was der Pic so an aufgaben zu lösen hat + RB Int Flag löschen und halt das Int Programm wie oben geschrieben. wie baut man jetzt das Sleep() ein?
1 | void 1 (void) |
2 | {
|
3 | INTCON2bits.INTEDG0=1; //PORTRBx als int für Flanke 0-1 |
4 | INTCONbits.INT0IE=1; //Int Port RB0 erlauben |
5 | INTCONbits.GIEH=1; //Int erlauben |
6 | }
|
7 | |
8 | void 2 (void) |
9 | {
|
10 | INTCONbits.INT0IF=1; //IntPort RB0 löschen |
was fehlt da noch
1 | void INT1_Init(void) |
2 | {
|
3 | INTCON2bits.INTEDG0=1; //PORTRBx als interrrupteingang für Flanke 1-0 |
4 | INTCONbits.INT0IE=1; //Interrupt vom Port RB0 erlauben |
5 | INTCONbits.GIEH=1; //Interrupts überhaupt erlauben |
6 | |
7 | }
|
8 | |
9 | |
10 | void main (void){ |
11 | |
12 | TRISD = 0x0000; /* LEDs on dsPICDEM 1.1 board are connected to RD0-RD3 */ |
13 | LATD = 0x0000; /* We will configure Port D to be output so we can use */ |
14 | /* use LEDs as an indicator of the occurrence of external */
|
15 | /* interrupts */
|
16 | |
17 | INT1_Init(); /* Call function to initialize the External Interrupt- INT1 */ |
18 | while (1) /* Loop endlessly */ |
19 | {
|
20 | Sleep(); /* View the time between the falling edge on the INT1 pin*/ |
21 | |
22 | }
|
23 | }
|
Hi Zuerst musst du mal den ganzen Kram so einstellen, dass er auch vom Sleep aufgeweckt wird. Durch welches Ereignis soll das denn bei dir geschehen und was soll er danach machen? Das musst du dir dann halt genau im Datenblatt durchlesen. Und danach brauchst du nur an geeigneter Stelle:
1 | Sleep(); |
einfügen. mfg Schoasch PS.: Dein Programm mag vl richtig sein, jedoch würd ich da einfach den PIC aus der fassung nehmen und alles mit fest verdrahtet gegen Masse schalten ;-). sorry... aber ohne mehr Informationen kann ich dir leider nicht weiter helfen. Wichtige Infos wären zb: Compiler (wird wohl der C18 sein).. welchen µC?! Was willst du machen?
fertzu wrote: > Eine INT-Routine welche alles abspeichert was vorher war und den schlaf > an sich. Nö. Der Interrupt muß enabled werden, damit man wieder aufwachen kann, sonst gehts nur mit Reset. Es reicht also völlig ein Interrupt nur mit RETI drin. Damit ist auch klar, daß Sleep keinesfalls innerhalb eines Interrupthandlers stehen darf. Der Sleep-Befehl muß der letzte sein und nach dem Aufwachen gehts einfach danach weiter. Das wichtigste am Sleep ist aber, vorher alle IO-Pins so zu setzen, daß kein Strom fließt, also alle Ausgänge so, daß sie nichts treiben und keinen Eingang floatend. Das Sleep macht ja nur bei Batteriebetrieb Sinn, um Strom zu sparen. Bei Netzbetrieb ist es Mumpitz (Verbrauch durch Trafo, Spannungsregler ist viel höher). Peter
Er soll per Timer INT am Ausgang Low High aufwachen. Die Ports für die LED zum ansteuern mache ich wo anders. Wie muss ich das Programm jetzt verändern? bisher habe ich das und es geht nicht:
1 | void int_sleep_lade_tag(void) |
2 | {
|
3 | alles_out(); |
4 | while(1) |
5 | {
|
6 | Sleep(); |
7 | }
|
8 | |
9 | void int_interr(void) |
10 | {
|
11 | INTCON2bits.INTEDG0=1; |
12 | INTCONbits.INT0IE=1; |
13 | INTCONbits.GIEH=1; |
14 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.