Forum: Mikrocontroller und Digitale Elektronik ADC Messung beim ATtiny13 will einfach nicht klappen


von startek (Gast)


Lesenswert?

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
}

von S. Landolt (Gast)


Lesenswert?

> ADMUX |= ~( ...

Was bewirken solche Befehle? Sollte da nicht jeweils ein '&' stehen?

von startek (Gast)


Lesenswert?

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...

von Schaltbild (Gast)


Lesenswert?

Wo bin ich?

von S. Landolt (Gast)


Lesenswert?

Ein oder kann doch nichts löschen, sondern nur setzen.

von Kai (Gast)


Lesenswert?

|= kann Bits löschen? Wäre mir neu...

von C? (Gast)


Lesenswert?

Um welche Programmiersprache geht es hier. "C" geht jedenfalls anders!

von startek (Gast)


Lesenswert?

Jo, danke. Ihr habt mich indirekt drauf geschubst: Das |= musste zum &= 
beim löschen der Bits sein. Jetzt geht's. Dankeschön!

von C? (Gast)


Lesenswert?

startek schrieb:
> Jetzt geht's

Damit wurde wieder bewiesen: "Kaum macht man's richtig, schon 
funktioniert's"

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.