Forum: Mikrocontroller und Digitale Elektronik Atmega88 ADC Code OK?


von Christian (Gast)


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
}

von holger (Gast)


Lesenswert?

>//.....................................................

Kannst du mal diesen Fliegenschiss da wegmachen?

von Christian (Gast)


Lesenswert?

Das ist aber besser wenn man den Code lies z.B im Ausgedruckten Zustand.

von holger (Gast)


Lesenswert?

>Das ist aber besser wenn man den Code lies z.B im Ausgedruckten Zustand.

Nö, ist es nicht.

Den ADC liest man so aus:

 while(ADCSRA & (1<<ADSC)){}
  ADC_WertC0 = ADC;

Den Rest kannst du dir sparen.

von Christian (Gast)


Lesenswert?

Bist du dir da sicher? Es handelt sich nämlich um einen 10 Bit Wert, der 
in ADCL und ADCH ausgegeben wird, wenn ich das richtig verstanden hab. 
Im Datenblatt auf Seite 253 steht das. Daher muss ich ja auch das Bit 
ADLAR im ADMUX Register setzen, um festzulegen ob es rechts- oder 
linksbündig gespeichert wird.

von Christian (Gast)


Lesenswert?


von holger (Gast)


Lesenswert?

>Bist du dir da sicher?

Nein, bin ich nicht. Deshalb funktioniert das
schon seit hundert Jahren bei mir.

von Christian (Gast)


Lesenswert?

Was hat es dann mit den ADCL/H auf sich?

von chris (Gast)


Lesenswert?

das erledigt der Compiler für dich. Wenn du auf 'ADC' zugreifst, setzt 
der das schon entsprechend mit ADCH und ADCL um

von Christian (Gast)


Lesenswert?

Achso, dass muss man ja mach gesagt bekommen.
Vielen Dank für deine schnellen Antworten :).
Die haben mir sehr geholfen, Danke.

MfG Christian

von innerand i. (innerand)


Lesenswert?

Christian schrieb:
> Das ist aber besser wenn man den Code lies z.B im Ausgedruckten Zustand.

Man druckt Code nicht aus.

von spess53 (Gast)


Lesenswert?

Hi

>ADMUX = 0xff;//.......................// Alle Bits von ADMUX auf 0 setzen

>ADCSRA = 0xff;//......................// Alle Bits von ADCSRA auf 0 setzen

Was soll das denn sein?

MfG Spess

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.