Hallo ich wollte eine analoge Schaltung bauen um einen Bleiakku bei geringer Spannung abzuschalten. Am Ende kam das Ergebnis die Schaltung nicht analog zu bauen sondern mit einem uC. Die Schaltung sollte jetzt fertig sein und bin gerade dabei ein Programm zu schreiben. Es wurde ein Atmega8 verwendet. Dabei wird bei vollem Akku eine Lampe auf HIGH gesetzt, geblinkt wird bei fast leerem Akku und bei leerem Akku abgeschalten. Jetzt habe ich versucht das Programm zu simulieren ob es auch funktioniert. Beim Programm werden die Ports, ADC und Timer-Interrupt initialisiert. Vom ADC-Wert ist abhängig ob die PINs auf HIGH gesetzt werden oder blinken soll. Dabei wird sleep_down() verwendet. Es bleibt aber nach dem ersten sleep_down() hängen. Wie kann ich das Programm bei der Simulation von Microchip Studio wieder aus dem sleep_down() wecken. Danke! LG
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <avr/sleep.h> |
4 | |
5 | volatile unsigned char zaehler; |
6 | |
7 | uint16_t adc_read() |
8 | {
|
9 | uint16_t adc_measurement = 0; |
10 | |
11 | ADCSRA |= (1 << ADSC); //Startet Konvertierung |
12 | while(ADCSRA & (1 << ADSC)){ |
13 | } //Wartet bis Konvertierung fertig ist |
14 | |
15 | adc_measurement = ADCL; //Speichert Register in adc_value |
16 | adc_measurement = (ADCH << 8) + adc_measurement; |
17 | |
18 | return adc_measurement; |
19 | }
|
20 | |
21 | ISR (TIMER1_COMPA_vect) |
22 | {
|
23 | zaehler++; |
24 | }
|
25 | |
26 | |
27 | int main(void) |
28 | {
|
29 | /* Replace with your application code */
|
30 | |
31 | DDRD = (1 << DDD1) | (1 <<DDD0); |
32 | PORTD = (1 << PD1) | (1 << PD0); |
33 | |
34 | ADMUX |= (1 << REFS1) | (1 << REFS0); |
35 | ADMUX &= ~((1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0)); |
36 | ADCSRA |= (1 << ADEN) | (1 << ADSC) | (1 << ADPS1) | (1 << ADPS0); |
37 | ADCSRA &= ~(1 << ADPS2); |
38 | |
39 | ADCSRA |= (1 << ADSC); //Startet Konvertierung |
40 | while(ADCSRA & (1 << ADSC)){ |
41 | } //Wartet bis Konvertierung fertig ist |
42 | |
43 | TCCR1A &= ~((1 << WGM11) | (1 << WGM10)); //CTC Mode |
44 | TCCR1B |= (1 << WGM12) | (1 << CS12) | (1 << CS10); //1024 Prescaler |
45 | TCCR1B &= ~((1 << WGM13) | (1 << CS11)); |
46 | TIMSK |= (1 << OCIE1A); |
47 | |
48 | OCR1A = 250; |
49 | |
50 | sei(); |
51 | |
52 | |
53 | |
54 | |
55 | uint16_t adc_value = 0; |
56 | int zustand = 0; |
57 | |
58 | |
59 | while (1) |
60 | {
|
61 | adc_value = adc_read(); |
62 | |
63 | if(adc_value >= 940) |
64 | {
|
65 | if(zustand == 0) |
66 | {
|
67 | PORTD = (1 << PD1) | (1 << PD0); |
68 | }
|
69 | set_sleep_mode(SLEEP_MODE_PWR_SAVE); |
70 | sleep_mode(); |
71 | }
|
72 | else if((adc_value <= 939) && (adc_value >= 926)) |
73 | {
|
74 | PORTD |= (1 << PD0); |
75 | |
76 | if(zustand == 0) |
77 | {
|
78 | zustand = 1; |
79 | }
|
80 | |
81 | if(zustand == 1) |
82 | {
|
83 | if (zaehler == 60) |
84 | {
|
85 | PORTD &= ~(1 << PD1); |
86 | }
|
87 | else if (zaehler == 61) |
88 | {
|
89 | zaehler = 0; |
90 | PORTD |= (1 << PD1); |
91 | }
|
92 | }
|
93 | set_sleep_mode(SLEEP_MODE_PWR_SAVE); |
94 | sleep_mode(); |
95 | }
|
96 | else if (adc_value <= 925) |
97 | {
|
98 | zustand = 2; |
99 | PORTD &= ~((1 << PD0) | (1 << PD0)); |
100 | set_sleep_mode(SLEEP_MODE_PWR_DOWN); |
101 | sleep_mode(); |
102 | }
|
103 | else
|
104 | {
|
105 | PORTD &= ~((1 << PD0) | (1 << PD0)); |
106 | set_sleep_mode(SLEEP_MODE_PWR_DOWN); |
107 | sleep_mode(); |
108 | }
|
109 | }
|
110 | }
|