Forum: Mikrocontroller und Digitale Elektronik Mein ADC wandelt nicht (tiny44)


von M. G. (ixil96)


Lesenswert?

Hallo,

ich habe ein Problem mit der ADC-Wandlung beim tiny44.
Das Ergebnis meiner Messung ist immer 0! Ich sehe derzeit aber auch 
leider keinen Fehler.

Nach dem ADC-Init erfolgen die ADC-Messungen in der while-Schleife 
solange PA4 LOW ist. Beim debuggen erhalte ich aber immer 0 als 
Messwertergebnis.
Bitte um eure Hilfe!

1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
void Init_ADC(void)
5
{
6
  //*** Init ADC ***
7
  int x;
8
  PRR    &= !(1<<PRADC);        // ADC power reduction cleared
9
  ADCSRA |= (1<<ADEN);        // ADC aktivieren
10
  ADCSRA |= (1<<ADPS1)|(1<<ADPS2);  // Vorteiler auf 64
11
  ADMUX  |= (1<<REFS0);        // Uref = 5V
12
  ADMUX  |= (1<<MUX1)|(1<<MUX0);    // ADC-Kanal 3 einstellen
13
  ADMUX  |= (1<<ADLAR);        // Ausgabe linksbündig
14
  
15
  //*** Dummy Readout ***
16
  ADCSRA |= (1<<ADSC);        // Start ADC-Wandlung
17
  while (ADCSRA &(1<<ADSC));      // Auf Abschluss der Konvertierung warten
18
    x = ADC;              // Das Ergebnis der 1.Wandlung in x speichern
19
}
20
21
int main(void)
22
{
23
  int messwert, messwert1=0, messwert2=0, messwert3=0;
24
  
25
  DDRA = 0x03;            // PA0, PA1 = Ausgang
26
  DDRB = 0xFF;
27
  
28
  Init_ADC();
29
  
30
    while(1)
31
    {
32
        PORTB ^= (1<<PB0);        // Toggle PB0 every 20ms
33
    
34
    while (!(PINA & (1<<PA4)))    // Wenn Signal an PA4 = LOW (Startpunkt für die Messung)
35
    {
36
      _delay_us(600);        // Warte bis zur 1. Messung
37
      
38
      PORTB |= (1<<PB1);      // Oszi Messpunkt
39
      _delay_us(2);        
40
      PORTB &= ~(1<<PB1);
41
      
42
      ADCSRA |= (1<<ADSC);    // Start ADC-Wandlung
43
      while (ADCSRA &(1<<ADSC));  // Auf Abschluss der Konvertierung warten
44
      messwert1 = ADC;      // Das Ergebnis der Wandlung in messwert speichern
45
      ADCSRA |= (1<<ADSC);    // Start ADC-Wandlung
46
      while (ADCSRA &(1<<ADSC));  // Auf Abschluss der Konvertierung warten
47
      messwert2 = ADC;      // Das Ergebnis der Wandlung in messwert speichern
48
      ADCSRA |= (1<<ADSC);    // Start ADC-Wandlung
49
      while (ADCSRA &(1<<ADSC));  // Auf Abschluss der Konvertierung warten
50
      messwert3 = ADC;      // Das Ergebnis der Wandlung in messwert speichern
51
      
52
      messwert = (messwert1 + messwert2 + messwert3)/3;      // Mittelwert bilden
53
    }
54
    if (messwert <= 410)      // Sender = OFF (Taste = gedrückt)
55
      PORTA |= (1<<PA1);      // PA1 = HIGH (LED ON)
56
    else
57
      PORTA |= (1<<PA1);      // PA1 = HIGH (LED ON)
58
59
    _delay_ms(20);
60
    }
61
}

von spess53 (Gast)


Lesenswert?

Hi

>Nach dem ADC-Init erfolgen die ADC-Messungen in der while-Schleife
>solange PA4 LOW ist. Beim debuggen erhalte ich aber immer 0 als
>Messwertergebnis.

Womit debugst du?

MfG Spess

von Sudo (Gast)


Lesenswert?

1
PRR    &= !(1<<PRADC);        // ADC power reduction cleared
meist du vielleicht
1
PRR    &= ~(1<<PRADC);        // ADC power reduction cleared

von M. G. (ixil96)


Lesenswert?

Ich debugge mit dem AVR Dragon (6pol. ISP-Schnittstelle auf 3 Pins VCC, 
GND und Reset reduziert)

von M. G. (ixil96)


Lesenswert?

Sudo schrieb:
>
1
PRR    &= !(1<<PRADC);        // ADC power reduction cleared
> meist du vielleicht
>
1
PRR    &= ~(1<<PRADC);        // ADC power reduction cleared

Ja, meinte ich. Bringt aber auch nix!

von der alte Hanns (Gast)


Lesenswert?

Verstehe ich das richtig, Sie haben als Referenzspannung 5.0 V auf PA0 
gelegt?

von Sudo (Gast)


Lesenswert?

1
ADMUX  |= (1<<REFS0);
External voltage reference at PA0 (AREF) pin, internal reference turned 
off

von M. G. (ixil96)


Lesenswert?

der alte Hanns schrieb:
> Verstehe ich das richtig, Sie haben als Referenzspannung 5.0 V auf PA0
> gelegt?

Hab ich grad auch gesehen! Das ist ein Irrtum, sorry.
Vcc soll die Referenzspannung von +5V sein.

Somit ist REFS1 = 0 und REFS0 = 0

Die Wandlung funktioniert nun prinzipiell. Was mich jetzt aber noch 
wundert ist, dass ich bei 0,26V Spannung am ADC-Pin einen Messwert von 
916 erhalte.

von Sudo (Gast)


Lesenswert?

Achso wie schnell läuft dein Chip?

>By default, the successive approximation circuitry requires an input clock
> frequency between 50
>kHz and 200 kHz to get maximum resolution.

Bei 1 MHz wäre das z.b. zu langsam mit 64 Prescaler

von spess53 (Gast)


Lesenswert?

Hi

>Die Wandlung funktioniert nun prinzipiell. Was mich jetzt aber noch
>wundert ist, dass ich bei 0,26V Spannung am ADC-Pin einen Messwert von
>916 erhalte.

Kein Wunder

>  ADMUX  |= (1<<ADLAR);        // Ausgabe linksbündig
>      ....
>      messwert1 = ADC;

MfG Spess

von M. G. (ixil96)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Die Wandlung funktioniert nun prinzipiell. Was mich jetzt aber noch
>>wundert ist, dass ich bei 0,26V Spannung am ADC-Pin einen Messwert von
>>916 erhalte.
>
> Kein Wunder
>
>>  ADMUX  |= (1<<ADLAR);        // Ausgabe linksbündig
>>      ....
>>      messwert1 = ADC;
>
> MfG Spess


DANKE!!! Das wars!

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.