Mein ADC wandelt nicht (tiny44)

#3848979
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
}
#3849025
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.
Gast #3849032
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
Gast #3849034
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

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