Tiny und sleep mit watchdog

Gast #2643531
Hy alle mit einander,
Ich habe da ein kleines Problem abzugeben :D.
Spaß bei seite Ich wollte ein mit nem Tiny13 temperatur messen und 
danach schlafen legen für ein paar sekunden.

Ich glaube es hat halb geklappt, wenn ich alle Sleep und WDT-Funktionen 
weg nehme habe komme ich auf 2.7mA. und mit auf 0.5mA aber er kommt aus 
dem schlaf nicht mehr raus.

Hier mal den Code und Sorrs für den style aber so habe ein bessere 
Übersicht
1
#include <avr/io.h>     
2
#include <avr/sleep.h>
3
#include <avr/wdt.h>
4
#include <avr/interrupt.h>
5

6
void sleep_Init(void)
7
{
8
  wdt_enable(WDTO_4S);      // Watchdog einstellen
9
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // Stromsparmodus einstellen
10
}
11

12

13
//Software SPI Sende-Routine
14
void send(unsigned char Data)
15
{
16
DDRB |= (1<<PB2)|(1<<PB1)|(1<<PB0);
17
PORTB |= (1<<PB1);
18
PORTB &= ~(1<<PB2)|(1<<PB0);
19

20

21
uint8_t MSB, a; 
22
MSB = 0x80;
23

24

25
PORTB &= ~(1<<PB1); 
26
 
27
 for( a = 0 ; a<8 ;a++)
28
  {  
29
  
30
  if(MSB & Data) 
31
  {
32
   PORTB |= (1<<PB0); 
33
   PORTB |=(1<<PB2);
34
  }//if Ende
35

36
  else 
37
  {
38
  PORTB &= ~(1<<PB0);//MOSI
39
  PORTB |= (1<<PB2);//CLK HIGH
40
  }//else ende
41

42
  PORTB &= ~(1<<PB2);//CLK HIGH
43
 
44
   MSB >>= 1;   //MSB nach rechts schieben
45
  
46
  }//for ende
47

48
PORTB |=(1<<PB1);
49
//alle wieder auf eingang Schalten
50
DDRB &= ~(1<<PB2)|(1<<PB1)|(1<<PB0);
51
}
52

53
int main(void)
54
{
55

56
sleep_Init();
57
sei();
58

59
//Endloss Schleife
60
while(1)
61
{
62

63
wdt_reset();
64

65
DDRB |= (1<<DDB2);
66
PORTB |= (1<<PB2);
67
uint16_t result; //Hilfsvariable für Dummy wert
68

69
ADMUX =  (1<<MUX1);
70

71
ADCSRA |= (1<<ADPS2) | (1<<ADPS1)| (1<<ADPS0); //ein | hinzugefügt
72
ADCSRA |= (1<<ADEN);
73
ADCSRA |= (1<<ADSC); 
74
while (ADCSRA & (1<<ADSC) ) {}
75

76
result = ADCW;
77

78
ADCSRA &= ~(1<<ADEN);
79

80

81
DDRB &= ~(1<<PB2);
82
PORTB |=(1<<PB2);
83

84

85
send(result);//Sende Funktion
86
  
87
sleep_mode();
88

89
}//while ende
90
return 0;
91
}//main Ende

Danke für die Tipps
mike
@  mike (Gast)

>weg nehme habe komme ich auf 2.7mA. und mit auf 0.5mA aber er kommt aus
>dem schlaf nicht mehr raus.

Wie auch, es fehlt a) ein freigegebener Interrupt und b) sie 
dazugehörige ISR, siehe Sleep Mode.

>Hier mal den Code und Sorrs für den style aber so habe ein bessere
>Übersicht

Kleiner Chaot? Dein Programm ist schlecht strukturiert, optisch wie 
inhaltlich. Initialisierungen macht man EINMAL an Anfang des Programms, 
nicht in der endlosen Hauptschleife! Am Ende der Initialisierungen kommt 
dann meist sei(); Siehe nocheinmal Sleep Mode.

Dann klappts auch mit dem Aufwachen.
Gast
Ok danke habe es durch gearbeitet und wollte es dann doch mit PCINT3, 
falls es doch länger nicht gebraucht wird habe mich an das tutorial 
gehalten, aber komme zum selben ergebniss.
1
#include <avr/io.h>     
2
#include <avr/sleep.h>
3
#include <avr/wdt.h>
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6

7

8
ISR(PCINT0_vect)
9
{}
10

11
//Software SPI Sende-Routine
12
void send(unsigned char Data)
13
{
14

15
uint8_t MSB, a; 
16
MSB = 0x80;
17

18
PORTB &= ~(1<<PB1); 
19
 
20
 for( a = 0 ; a<8 ;a++)
21
  {  
22
  
23
  if(MSB & Data) 
24
  {
25
   PORTB |= (1<<PB0); 
26
   PORTB |=(1<<PB2);
27
  }//if Ende
28

29
  else 
30
  {
31
  PORTB &= ~(1<<PB0);//MOSI
32
  PORTB |= (1<<PB2);//CLK HIGH
33
  }//else ende
34

35
  PORTB &= ~(1<<PB2);//CLK HIGH
36
 
37
   MSB >>= 1;   //MSB nach rechts schieben
38
  
39
  }//for ende
40

41
PORTB |=(1<<PB1);
42
}
43

44
int main(void)
45
{
46

47
DDRB |= (1<<PB2)|(1<<PB1)|(1<<PB0);
48
PORTB &= ~(1<<PB2)|(1<<PB0);
49
PORTB |= (1<<PB1);
50

51
//PCINT3 (PB3) Init
52
DDRB &=~(1<<PB3);
53
PORTB |= (1<<PB3);
54
MCUCR |= (1<<ISC00);
55
GIMSK |= (1<<PCIE);
56
PCMSK |= (1<<PCINT3);
57

58
//Sleep-mode Init
59
MCUCR |= (1<<SE)|(1<<SM1);
60
  
61
//Interrupt aktivieren
62
sei();
63

64

65
//Endloss Schleife
66
while(1)
67
{
68
//Schlafen   
69
//sleep_cpu();
70
//Hier aufwachen wenn am PCINT3 etwas passiert
71

72

73
PORTB |= (1<<PB2);
74
uint16_t result; //Hilfsvariable für Dummy wert
75

76
ADMUX =  (1<<MUX1);
77

78
ADCSRA |= (1<<ADPS2) | (1<<ADPS1)| (1<<ADPS0); //ein | hinzugefügt
79
ADCSRA |= (1<<ADEN);
80
ADCSRA |= (1<<ADSC); 
81
while (ADCSRA & (1<<ADSC) ) {}
82

83
result = ADCW;
84

85
ADCSRA &= ~(1<<ADEN);
86
PORTB |=(1<<PB2);
87

88
send(result);//Sende Funktion
89

90
}//while ende
91
return 0;
92
}//main Ende

danke für den hinweis mit der ISR und sei()

mfg mike
Gast
Habe es mit dem Pin change hin bekommen und auch mit dem Watchdog-timer, 
aber nur beim anschalten. Ich würde in gern jedes mal in den Power-dawn 
zustand zu versetzen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.