Forum: Mikrocontroller und Digitale Elektronik Atmega48 & ADC


von Johannes (Gast)


Lesenswert?

Hallo Leute,

ich habe ein Board entwickelt für die Ansteuerung von LED-Treibern. 
Soweit hat alles funktioniert...PWM, Timer, I²C, SPI und UART. Jedoch 
eine wichtige Komponente (ADC) funktioniert halt überhaupt nicht.
1
void adc_init (void)
2
{
3
  DDRC   &= ~(1<<port);            /*Den Port auf einang schalten*/
4
5
  ADMUX  = (1<<REFS0);            /*Referenz auf AREF - interne Ref aus */
6
7
  ADCSRA = 0x07;                /*Teiler auf 128 - höchste Genauigkeit*/
8
  
9
  ADCSRB = 0x00;                // Einfach so aus Verzwiflung auf null
10
11
  ADCSRA |= (1<<ADEN);            /*Analogwandler einschalten*/
12
}
13
14
15
unsigned int adc_read (unsigned char port)
16
{
17
  unsigned int value;
18
19
  ADMUX  = (0x0F & port);    // Mux auf Port ausrichten
20
21
  ADCSRA |= (1<<ADSC);    // Wandlung starten
22
  while (!(ADCSRA & ADSC));  // Warten bis wandlung ende
23
  
24
  value = ADCH;
25
  value += ADCL<<8;
26
27
  return value;
28
}

Mein Controller... Atmega48 - AVCC & VCC=3,3 - AREF = AVCC.
Returnwert der Funktion ist immer 0.

Was mach ich falsch? Sieht einer von euch einen Fehler?

Vielen Dank im voraus!

Gruß
Johannes

von Johannes B. (Firma: SSB-Computer) (ssb-computer)


Lesenswert?

Sorry! Falscher Code. Alter Stand.

Hier der neue. ;)
1
#include <avr/io.h>
2
3
void adc_init (void)
4
{
5
  ADMUX  = 0x00;            /*Referenz auf AREF - interne Ref aus */
6
7
  ADCSRA = 0x07;                /*Teiler auf 128 - höchste Genauigkeit*/
8
  
9
  ADCSRB = 0x00;                // Einfach so aus Verzwiflung auf null
10
11
  ADCSRA |= (1<<ADEN);            /*Analogwandler einschalten*/
12
}
13
14
15
unsigned int adc_read (unsigned char port)
16
{
17
  unsigned int value;
18
19
  ADMUX  = (0x0F & port);    // Mux auf Port ausrichten
20
21
  ADCSRA |= (1<<ADSC);    // Wandlung starten
22
  while (!(ADCSRA & ADSC));  // Warten bis wandlung ende
23
  
24
  value = ADCH;
25
  value += ADCL<<8;
26
27
  value = ADCL;
28
29
  return value;
30
}

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Johannes Boss schrieb:
> ADMUX  = (0x0F & port);    // Mux auf Port ausrichten

Ist das nicht der alte Fehler, wo die Referenzauswahl gelöscht wird? 
Kann jemand mal das Tutorial endlich korrigieren?
Richtig wäre :
ADMUX  = ((ADMUX & 0xF0) | (0x0F & port));    // Mux auf Port ausrichten

von Krapao (Gast)


Lesenswert?

Im AVR-GCC-Tutorial steht bereits:

>  // Kanal waehlen, ohne andere Bits zu beeinflußen
>  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);

von Johannes B. (Firma: SSB-Computer) (ssb-computer)


Lesenswert?

Hy funktioniert wunderbar!

Ich kann mich nur für meine blindheit entschuldigen :(

Hab ich in dem Projekt einfach nicht drüber nachgedacht. Sorry!

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.