Hallo,
ich möchte mit meinem ATmega8 einen IR-Poroximity-Sensor konstruieren.
Dazu möchte ich den Timer1 zum einen dazu verwenden, um über den
OC1A-Pin eine IR-LED mit PWM anzusteuern, den ADC0-Pin zum Auslesen des
Photostroms einer Photodiode verwenden und eine PWM je nach ADC-Wert
über den OC1B-Pin auf eine LED geben.
Geht das prinzipiell bei Verwendung nur eines Timers?
Mein Code:
1 | /*
|
2 | * IR_Proximity.c
|
3 | *
|
4 | * Created: 09.03.2015 21:14:05
|
5 | * Author: Joe
|
6 | */
|
7 |
|
8 | #include <avr/io.h>
|
9 | #include <avr/interrupt.h>
|
10 |
|
11 | int main(void)
|
12 | {
|
13 |
|
14 | // Pin PB2, PB1 und PB0 als Ausgang
|
15 | DDRB |= (1<<PB2) | (1<<PB1) | (1<<PB0);
|
16 |
|
17 | //---Timer1 konfigurieren---//
|
18 | //--------------------------//
|
19 | //lösche OC1A beim Compare-Match und setze OC1A nach dem Timer-Reset -> COM1A1 = 1, COM1A0 = 0
|
20 |
|
21 | //Fast PWM 8 Bit Modus -> WGM10 = 1, WGM11 = 0, WGM12 = 1, WGM13 = 0
|
22 |
|
23 | //Timer1 Clock Source
|
24 | // 1/8 des Controller-Clocktakts -> CS10 = 0, CS11 = 1, CS12 = 0
|
25 |
|
26 | TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM10);
|
27 |
|
28 | TCCR1B = (0<<CS10) | (1<<CS11) | (0<<CS12) | (1<<WGM12);
|
29 |
|
30 | //Duty-Cycle einstellen -> Duty-Cycle = 50% (n-1/256)
|
31 | OCR1A = 127;
|
32 |
|
33 | //ADC konfigurieren --- ADC0 ist der Messeingang für die Fotodiode SFH 203 FA
|
34 | //zunächst werden Referenzspannung, die interne, und der ADC-Input-Pin festgelegt
|
35 | ADMUX = (1<<REFS1) | (1<<REFS0) | (0<<ADLAR) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1);
|
36 |
|
37 | //nun wird festgelegt in welchem Modus der ADC läuft und mit welchem Takt
|
38 | ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE);
|
39 |
|
40 | //Globale Interrupts aktivieren
|
41 | sei();
|
42 |
|
43 | //Konvertierung starten
|
44 | ADC |= (1<<ADSC);
|
45 |
|
46 | for(;;);
|
47 | {
|
48 |
|
49 | }
|
50 | return 0;
|
51 | }
|
52 |
|
53 | //Interrupt-Service-Routine
|
54 | ISR(ADC_vect)
|
55 | {
|
56 |
|
57 |
|
58 | //OCR1B = ADC;
|
59 |
|
60 |
|
61 |
|
62 | if(ADC > 1000)
|
63 | {
|
64 | PORTB |= (1<<PB0);
|
65 | }
|
66 | else
|
67 | {
|
68 | PORTB &= ~(1<<PB0);
|
69 | }
|
70 | }
|
Ich habe versucht mit der auskommentierten Zeile in der ISR die PWM für
den OC1B-Pin zu setzen, leider ohne Erfolg.
Meine Status-LED flackert ohne Objektkopplung und wird nicht heller bei
Objektannäherung.
Ist der Denkfehler bei Verwendung eines Timers oder woanders ein Fehler
im Code?
Vielen Dank für jede Hilfe!
Gruß
Joe