oh weia ist das peinlich!
das scheint irgendwo zwischendrin rausgeflogen zu sein.
ok, mit ausführen der init scheint er jetzt AD Wandlungen zu machen,
leider bleibt es beim Anschein, denn: der AD Wert ist immer 0, den ich
zurücklese. Ich hab jetzt das Ganze soweit umgebaut, daß er nur noch bei
einem AD Wert von 0 den Ausgang setzt, sonst nicht.
Leider ist der Ausgang immer gesetzt.
desweiteren hab ich diese Zeile
ebenfalls gelöscht, somit sollte er ja automatisch VCC als Referenz
nutzen.
ich hänge nochmal den ganzen Code an:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | #include "mydefs.h"
|
5 | #include "Lipo_Saver.h"
|
6 | #include <util/delay.h>
|
7 |
|
8 | void init(void)
|
9 | {
|
10 | /* Schaltausgang 1: PB0
|
11 | Schaltausgang 2: PB1
|
12 | Fahrsignal out/In; PB2
|
13 | Schaltausgang 3: PA7
|
14 | Schaltausgang 4: PA6
|
15 | Schaltausgang 5: PA5
|
16 | Schaltausgang 6: PA4
|
17 | Schaltausgang 7: PA3
|
18 | Schaltausgang 8: PA2
|
19 | Schalteingang: PA1
|
20 | AkkuSpannung analog in: PA0
|
21 | */
|
22 | DDRA = 0xFC; //Datenrichtung der Pins festlegen
|
23 | DDRB = 0x03;
|
24 | PORTA = 0x01; // Pull Ups einschalten
|
25 |
|
26 | ADCSRA = (1 << ADPS0) | (1 << ADPS2);
|
27 | DIDR0 = (1 << ADC0D);
|
28 | }
|
29 |
|
30 | int ADC_Messung(uint8_t Kanal)
|
31 | {
|
32 | uint8_t i;
|
33 | uint16_t Messwert;
|
34 | uint32_t Mittelwert = 0;
|
35 |
|
36 | ADMUX &= ~((1 << MUX0) | (1 << MUX1) | (1 << MUX2) | (1 << MUX3));
|
37 | ADMUX |= Kanal;
|
38 | Mittelwert = 0;
|
39 |
|
40 | for(i = 0; i < ADC_Messungen; i++)
|
41 | {
|
42 | ADCSRA |= (1 << ADSC);
|
43 | while(ADCSRA & (1<<ADSC))
|
44 | {
|
45 | asm volatile("NOP");
|
46 | }
|
47 | Mittelwert += ADC;
|
48 | }
|
49 |
|
50 | ADCSRA &= ~(1 << ADSC);
|
51 |
|
52 | Messwert = (uint16_t)(Mittelwert / ADC_Messungen);
|
53 |
|
54 | return Messwert;
|
55 | }
|
56 |
|
57 | int main(void)
|
58 | {
|
59 | uint16_t Akkustatus;
|
60 |
|
61 | init();
|
62 |
|
63 | ADCSRA |= (1 << ADSC); //Start der ersten AD Wandlung
|
64 |
|
65 | TCNT0 = 0;
|
66 | Drive_Out = OFF;
|
67 |
|
68 | Out4 = ON; //nur für debugzwecke
|
69 | _delay_ms(500); //
|
70 | Out4 = OFF; //
|
71 | _delay_ms(500); //
|
72 |
|
73 | ADCSRA |= (1 << ADSC);
|
74 | while(1)
|
75 | {
|
76 | Akkustatus = ADC_Messung(0);
|
77 |
|
78 | if (Akkustatus <= Abschalten)
|
79 | {
|
80 | Drive_Out = OFF; //Ausgang auf Low legen
|
81 | Drive_DDR = ON; //Eingang auf Ausgang umschalten -> Puls wird unterdrückt -> Failsave springt an
|
82 | }
|
83 | /*else*/ if(Akkustatus <= Warnlevel)
|
84 | {
|
85 | Out4 = ON; //Vorerst nur debug, Später Blinkmodus einschalten
|
86 | }
|
87 | else
|
88 | {
|
89 | Drive_DDR = OFF; //Falls Eingang als Ausgang -> zurück auf Eingang stellen
|
90 | Out4 = OFF;
|
91 | }
|
92 | }
|
93 | }
|
die Lip_Saver.h hat folenden Aufbau
1 | #ifndef _Lipo_Saver_h_
|
2 | #define _Lipo_Saver_h_
|
3 |
|
4 | #define Out1 SBIT( PORTB, 0 )
|
5 | #define Out2 SBIT( PORTB, 1 )
|
6 | #define Out3 SBIT( PORTA, 7 )
|
7 | #define Out4 SBIT( PORTA, 6 )
|
8 | #define Out5 SBIT( PORTA, 5 )
|
9 | #define Out6 SBIT( PORTA, 4 )
|
10 | #define Out7 SBIT( PORTA, 3 )
|
11 | #define Out8 SBIT( PORTA, 2 )
|
12 |
|
13 | #define Drive_Out SBIT( PORTB, 2 )
|
14 | #define Drive_In SBIT( PINB, 2 )
|
15 | #define Drive_DDR SBIT( DDRB, 2 )
|
16 |
|
17 | #define In1 SBIT( PINA, 1 )
|
18 |
|
19 | /*
|
20 | Schaltausgang 1: PB0
|
21 | Schaltausgang 2: PB1
|
22 | Fahrsignal out/In; PB2
|
23 | Schaltausgang 3: PA7
|
24 | Schaltausgang 4: PA6
|
25 | Schaltausgang 5: PA5
|
26 | Schaltausgang 6: PA4
|
27 | Schaltausgang 7: PA3
|
28 | Schaltausgang 8: PA2
|
29 | Schalteingang: PA1
|
30 | AkkuSpannung analog in: PA0 */
|
31 |
|
32 | #define Warnlevel 0 //Warnwert, max 1024
|
33 | #define Abschalten 200 //Abschaltwert, max 1024
|
34 | #define ADC_Messungen 1 //Anzahl der Messungen aus welchen der Mittelwert gebildet wird. Maximal möglich: 4194304
|
35 |
|
36 | #define ON 1
|
37 | #define OFF 0
|
38 |
|
39 | #endif
|
ich wird morgen mal nen anderen Controller ausprobieren, vielleicht hat
der durch meine Experimente auch nen Treffer abbekommen.