Atmega88 ADC Code OK?

Gast #3525795
Lesenswert?

Hallo Zusammen,

ich habe mir einen kleinen Code für den Atmega88 geschrieben, der mir 2 
AD Kanäle auslesen und in eine Variable schreiben soll. Die Werte möchte 
ich später über UART an einen weiteren Atmega88 weitergeben.
Wäre nett wenn sich jemand den Code mal ansehen könnte. Ich bin mir 
nicht sicher ob ich das mir den ADCL/H richtig gemacht habe, da mir das 
AVR-Studio diese Bits mit 0 - 7 vorschlägt. Ich habe mir gedacht, dass 
die Zahlen dahinter die einzelnen Kanäle zurückgeben d.h. (ADCL0 > Kanal 
0; ADCL2 > Kanal 2). Ich hoffe das stimmt.
Das ist mein erstes Projekt. Ich bin also ein absoluter anfänger in der 
AVR Programmierung, bzw die C-Sprache behersche ich auch nicht perfekt. 
Also seid nachsichtig.
Vielen Dank.
1
#define F_CPU 20000000UL //Prozessortakt in Hertz, hier 20 MHz
2
#include <avr/io.h>
3
#include <util/delay.h>
4

5

6
uint16_t ADC_WertC0;//..........................................................// Diese 16 Bit große Variable dient zur Speicherung der 2x 8 Bit großen ADC-Werte von Kanal 0
7
uint16_t ADC_WertC1;//..........................................................// Diese 16 Bit große Variable dient zur Speicherung der 2x 8 Bit großen ADC-Werte von Kanal 1
8
uint8_t ADC_LWert;//............................................................// Diese 8 Bit große Variable dient zur kurzfristigen Übernahme des ADC-Wertes ADCL
9
uint8_t ADC_HWert;//............................................................// Diese 8 Bit große Variable dient zur kurzfristigen Übernahme des ADC-Wertes ADCH
10

11

12

13

14
void ADC_Init (void){//________________________________________________________________________________________________// Dies ist eine Methode, in der die AD-Wandlung initialisiert wird bzw. die Einstellungs-Bits gesetz werden
15

16
  ADMUX = 0xff;//.............................................................// Alle Bits von ADMUX auf 0 setzen
17
  ADMUX |= (1<<REFS0);
18
        //..............................................................// Referenzspannung = AVCC
19
        
20
  
21
  ADCSRA = 0xff;//............................................................// Alle Bits von ADCSRA auf 0 setzen
22
  ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);//...........................// ADC-Takt Prescaler wird auf 128 gesetzt
23
  ADCSRB |= (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);//...........................// ADC-Modus wird auf Free Running gesetzt
24
  ADCSRA |= (1<<ADEN)  | (1<<ADSC);
25
        //..............................................................// ADC wird aktiviert
26
              //........................................................// ADC-Wandlung starten
27
  
28
  while (ADCSRA & (1<<ADSC)); {}//............................................// Hier wird gewartet bis eine Messung vorgenommen wurde
29

30
  ADC_LWert = ADCL0;
31
  ADC_HWert = ADCH0;//........................................................// Die Werte von ADCL und ADCH werden ausgelesen und somit eine neue Messung durchgeführt
32
  
33
}//____________________________________________________________________________________________________________________// Ende der ADC_Init Methode
34

35

36

37

38

39
void AD_Read (void){//_________________________________________________________________________________________________// Dies ist die Methode in der die AD-Wandlung durchgeführt wird
40
  
41
  ADMUX &= (0<<MUX0);//.......................................................// Der AD-Kanal wird auf Kanal 0 gesetzt
42
    while(ADCSRA & (1<<ADSC)){}//...........................................// Es wird gewartet bis die AD-Wandlung abgeschlossen ist
43
      ADC_LWert = ADCL0;//................................................// Die 8 ersten Bits des 10 Bit AD-Wertes werden in die Variable ADC_LWert gelesen
44
      ADC_HWert = ADCH0;//................................................// Die 2 höchstwertigen Bits des 10 Bit AD-Wertes werden in die Variable ADC_HWert gelesen
45
      ADC_WertC0 = ADC_LWert + (ADC_HWert * 256);//.......................// Die Werte werden in eine 16 Bit große Variable zusammengerechnet
46
    
47
  ADMUX |= (1<<MUX0);//.......................................................// Der AD-Kanal wird auf Kanal 0 gesetzt
48
    while(ADCSRA & (1<<ADSC)){}//...........................................// Es wird gewartet bis die AD-Wandlung abgeschlossen ist
49
      ADC_LWert = ADCL0;//................................................// Die 8 ersten Bits des 10 Bit AD-Wertes werden in die Variable ADC_LWert gelesen
50
      ADC_HWert = ADCH0;//................................................// Die 2 höchstwertigen Bits des 10 Bit AD-Wertes werden in die Variable ADC_HWert gelesen
51
      ADC_WertC1 = ADC_LWert + (ADC_HWert * 256);//.......................// Die Werte werden in eine 16 Bit große Variable zusammengerechnet
52
      
53
}//____________________________________________________________________________________________________________________// Ende der AD_Read Methode
54

55

56

57

58

59

60
int main(void)
61
{
62
  
63
  ADC_Init();
64
  
65
  
66
  
67
  
68
    while(1)
69
    {
70
    AD_Read(); 
71
    }
72
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren