Tiny und sleep mit watchdog

Gast #2643531
Lesenswert?

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
#2644879
Lesenswert?

@  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 #2644951
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren