ADC Messung beim ATtiny13 will einfach nicht klappen

Gast #5004727
Hallo,

ich sitze jetzt schon ein paar Stunden daran und versuche den ADC1 
auszulesen. Es will aber einfach nicht klappen. Ich habe schon mehrere 
Beispiele und Tinys durchprobiert. An PB2 (ADC1) lege ich über einen 
einstellbaren Spannungsteiler (10k auf 100k Poti) eine Spannung bereit. 
Diese wird auch noch über einen 47uF Elko stabilisiert. Funktioniert 
laut Multimeter auch. Mit meinem Programm möchte ich unter einer 
Schwelle eine LED einschalten. Das gelingt mir aber nicht. Ansonsten 
funktioniert alles wie gewollt. Der Tiny13 läuft mit 1MHz. Ich habe auch 
mal an das Ende der Lesefunktion ein Aufblinken der LED gesetzt, um zu 
gucken, ob es nach der Warte-Whileschleife weitergeht. Nach meinen 
Beobachtungen bleibt der ATtiny da drin hängen...

Was übersehe ich?

Beste Grüße
1
#include <avr/io.h>
2
#include <util/delay.h>
3

4
int main(void){
5
  
6
  DDRB |= 0b00000001; //PINB0 als Output für LED
7
  
8
  ADCSRA |= (1 << ADEN); //ADC einschalten
9
  ADMUX |= ~(1 << REFS0); //VCC als Referenz nehmen
10
  
11
  ADCSRA |= (1 << ADPS0); //Prescaler auf 8 (125 kHz)
12
  ADCSRA |= (1 << ADPS1);
13
  ADCSRA |= ~(1 << ADPS2);
14
  
15
  ADMUX |= ~(1 << ADLAR); //Ergebnis right-adjusted
16

17
  read(1); // Einmal lesen, um "warmzulaufen"
18
  _delay_ms(10);
19
  
20
  
21
  
22
  while(1){
23
    if(read(1) <= 614){
24
      PORTB = 0b00000001;
25
    }else{
26
      PORTB = 0b00000000;
27
    }
28
    _delay_ms(50);
29
  }
30
  return 0;
31
}
32

33
int read(int ch){
34
  if(ch == 1){ //Logik, um ADC-Eingang auszuwählen
35
    ADMUX |= (1 << MUX0);
36
    ADMUX |= ~(1 << MUX1);
37
  }else if(ch == 2){
38
    ADMUX |= ~(1 << MUX0);
39
    ADMUX |= (1 << MUX1);
40
  } else if(ch == 3){
41
    ADMUX |= (1 << MUX0);
42
    ADMUX |= (1 << MUX1);
43
  }
44
  
45
  ADCSRA |= (1 << ADSC); //Messung starten
46
  
47
  while(ADCSRA & (1 << ADSC)); //Warten bis Messung vorbei ist
48
  return ADC; //Wert zurückgeben
49
}
Gast #5004789
Der Befehl löscht meines Wissens nur das Bit, die anderen Bits aus dem 
Register bleiben unberührt. Funktioniert jedenfalls beim im DDRx und 
PORTx Register...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.