mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik leg dich schlafen


Autor: fertzu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: berd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein

Autor: fertzu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: fertzu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void 1 (void)
{
INTCON2bits.INTEDG0=1;            //PORTRBx als int für Flanke 0-1
INTCONbits.INT0IE=1;            //Int Port RB0 erlauben
INTCONbits.GIEH=1;              //Int erlauben
}

void 2 (void)
{
INTCONbits.INT0IF=1;            //IntPort RB0 löschen

Autor: fertzu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was fehlt da noch
void INT1_Init(void)
{
        INTCON2bits.INTEDG0=1;            //PORTRBx als interrrupteingang für Flanke 1-0
    INTCONbits.INT0IE=1;            //Interrupt vom Port RB0 erlauben
    INTCONbits.GIEH=1;              //Interrupts überhaupt erlauben
        
}


void main (void){
        
        TRISD = 0x0000;         /* LEDs on dsPICDEM 1.1 board are connected to RD0-RD3 */
        LATD = 0x0000;          /* We will configure Port D to be output so we can use */
                                /* use LEDs as an indicator of the occurrence of external */
                                /* interrupts */

        INT1_Init();            /* Call function to initialize the External Interrupt- INT1 */
        while (1)               /* Loop endlessly */
        {
                Sleep();        /* View the time between the falling edge on the INT1 pin*/
                                
        }
}

Autor: harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wurde das mal gelöst?

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: fertzu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void int_sleep_lade_tag(void)
  {
    alles_out();
  while(1)
  {
  Sleep();
  }
  
void int_interr(void)
{
       INTCON2bits.INTEDG0=1;            
    INTCONbits.INT0IE=1;            
    INTCONbits.GIEH=1;                    
}

Autor: fertzu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CLOSED hat ich erledigt

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.