Forum: Mikrocontroller und Digitale Elektronik Tiny und sleep mit watchdog


von mike (Gast)


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

von mike (Gast)


Lesenswert?

Kann mir den keiner helfen bzw. will mir keiner helfen?

Habe noch rum gespielt am code Ich komme aber aus dem 
Sleep-modus(Power-down) nicht raus.

von Falk B. (falk)


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.

von mike (Gast)


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

von mike (Gast)


Lesenswert?

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.

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.