MoinMoin
ich hab mal wieder ein kleines Problem, ich möchte mit dem
Analogkomparator eine Spannung messen.
Meine Spannung gebe ich auf PinA0, den Komp habe ich auf interne
Bandgabreferenz gestellt, und den Multiplexer eingeschaltet. Per polling
hat das auch alles wunderbar geklappt, Spannung größer Bandgap --> LED
an und andersrum. Dann hab ich versucht, das ganze per Interrupt zu
lösen, jeddoch wird mein Interrupt nicht ausgelöst. ACO wechselt aber je
nachdem, ob ich positivere oder negativere Spannung an PinA0 geb, das
sehe ich per OCD. Globale Interrupts sind auch aktiviert, in einem alten
Beitrag hab ich gelesen, das es auf die Reihenfolge ankommt, in der man
den AC initialisiert. Also hab ichs wie dort gemacht, ACD ein,
Einstellungen machen, ACO wieder aus, und dann ACIE (die
Komparatorinterrupts) an. Auch erfolglos....
Das ganze läuft auf nem Mega32, wie oben schon erwähnt.
Für weiterführende Hinweise wäre ich sehr dankbar,
MfG Chaos =)
Hier noch der Quelltext
1 | /*
|
2 | * Lueftercontroller.c
|
3 | *
|
4 | * Created: 09/07/2014 21:35:30
|
5 | * Author: Ich
|
6 | */
|
7 |
|
8 |
|
9 | #include <avr/io.h>
|
10 | #include <avr/interrupt.h>
|
11 | #include <inttypes.h>
|
12 |
|
13 | ISR(ANA_COMP_vect)
|
14 | {
|
15 | uint8_t Arbeitsreg = 0;
|
16 |
|
17 | Arbeitsreg = ACSR & (1 << ACO);
|
18 |
|
19 | if (Arbeitsreg == 0)
|
20 | {
|
21 | PORTB &= ~(1 << PB0);
|
22 | }
|
23 |
|
24 | if (Arbeitsreg == ACO)
|
25 | {
|
26 | PORTB |= (1<< PB0);
|
27 | }
|
28 | }
|
29 |
|
30 |
|
31 | void init(void);
|
32 |
|
33 |
|
34 |
|
35 | int main(void)
|
36 | {
|
37 | init();
|
38 |
|
39 | while(1)
|
40 | {
|
41 | uint8_t i = 0; //um zu sehen, ob etwas passiert
|
42 | i = PORTC;
|
43 | i++;
|
44 | PORTC = i;
|
45 | }
|
46 | }
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 | void init(void)
|
53 | {
|
54 | TCCR0 = (1<<WGM00) | (1<<WGM01) | (1<<COM00) | (1<<COM01) | (1<<CS01); //Timer0 init auf FastPWM Inverting Mode, Prescaler 1
|
55 | DDRB = (1<<PB3) | (1<<PB0); //auf Ausgang setzen, um den Ausgangstreiber vom OC-Pin zu aktivieren
|
56 | DDRC = 255;
|
57 | ACSR |= (1<<ACD);
|
58 | ACSR |= (1<<ACBG); //AnalogComparator auf interne Referenz am +Eingang
|
59 | SFIOR |= (1<<ACME); //AnaCompMultiplexer aktivieren
|
60 | ACSR &= ~(1<<ACD);
|
61 | ACSR |= (1<<ACIE);
|
62 | sei();
|
63 | }
|