Forum: Mikrocontroller und Digitale Elektronik leg dich schlafen


von fertzu (Gast)


Lesenswert?

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?

von berd (Gast)


Lesenswert?

nein

von fertzu (Gast)


Lesenswert?

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?

von fertzu (Gast)


Lesenswert?

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

von fertzu (Gast)


Lesenswert?

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
}

von harry (Gast)


Lesenswert?

wurde das mal gelöst?

von Schoasch (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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

von fertzu (Gast)


Lesenswert?

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
}

von fertzu (Gast)


Lesenswert?

CLOSED hat ich erledigt

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.