IR-Proximity mit ATmega8 und ADC

Gast #4049258
Lesenswert?
• ▲
▼
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.