Forum: Mikrocontroller und Digitale Elektronik Wake-up from sleep mode funktioniert nicht


von Paarthurnax (Gast)


Lesenswert?

Hallo Leute,

ich beschäftige mich zur Zeit  mit dem Sleep mode. Ich programmiere mit 
dem High tech compiler und benutze den PIC12F1822. Zum Testen habe ich 
ein simples Programm geschrieben, indem der ADC läuft. Ich habe im 
Datenblatt gelesen, dass man den Sleep mode durch ein Interrupt 
aufwecken kann. Dazu muss aber der Clock beim ADC auf FRC (dedicated 
internal oscillator) gewählt sein, weil sonst der ADC gar nicht läuft. 
Ich habe alles nach den Anweisungen programmiert. Es steht, dass nach 
dem eine Konvertierung fertig ist und das Flag bit gesetzt wird, der 
Code nach der Sleep-Anweisung folgt. Es steht drin, dass das GIE bit 
nicht gesetzt sein muss, aber das ADC enable bit und das peripheral 
interrupt enable bit. Ich habe an meiner Schaltung nur den Controller, 
sodass nicht verfälscht werden kann. Doch ich schaffe es nicht den 
Controller vom Sleep mode aufzuwecken. Ich hoffe, dass jemand schon 
Erfahrungen mit dem sleep mode hat.

Gruß

Paarthurnax
1
#include <htc.h>
2
3
void main(void)
4
{
5
  TRISA2 = 1;
6
  ANSELA = 0b00000100;
7
  ADCON1bits.ADCS = 0b111;
8
  ADCON1bits.ADPREF = 0b00;
9
  ADCON0bits.CHS = 2;
10
  ADCON0bits.ADON = 1;
11
  PIR1bits.ADIF = 0;
12
  PIE1bits.ADIE = 1;
13
  INTCONbits.PEIE = 1;
14
  INTCONbits.GIE = 0;
15
  ADCON1bits.ADFM = 1;
16
  
17
  SLEEP();
18
19
  while(1)
20
  {  
21
    ADGO = 1;
22
    while(ADIF == 0)
23
    {}  
24
  }
25
}

von Paarthurnax (Gast)


Lesenswert?

EDIT: Mit Interrupt-On-Change funktioniert es einwandfrei, nur mit ADC 
aben nicht !!!

von Lutz (Gast)


Lesenswert?

Paarthurnax schrieb:
> ADGO = 1;

Sofern das die Wandlung starten soll (ich kenne die PICs nicht): Pennt 
der Chip da nicht schon?
Selbst wenn er nach dem sleep aufwachen würde, würde er danach eine 
Wandlung nach der anderen machen. Für immer.

Ich würde tippen, daß das sleep in die while() nach ADGO = 1 gehört. 
Aber ohne Abfrage des Wertes in der while hast du ja auch nix von der 
Wandlung???

von Scotty (Gast)


Lesenswert?

In 16.1.5 steht's ein wenig anders:

If the user is attempting to wake-up from Sleep and resume in-line code 
execution, the GIE and PEIE bits of the INTCON register must be 
disabled.

So müßte es gehen:
1
  INTCONbits.PEIE = 0;
2
  INTCONbits.GIE = 0;
3
  while(1)
4
  {
5
    ADGO = 1;
6
    SLEEP();
7
    {}  
8
  }

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.