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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von startek (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht lesenswert
> ADMUX |= ~( ...

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

von startek (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Wo bin ich?

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ein oder kann doch nichts löschen, sondern nur setzen.

von Kai (Gast)


Bewertung
0 lesenswert
nicht lesenswert
|= kann Bits löschen? Wäre mir neu...

von C? (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Um welche Programmiersprache geht es hier. "C" geht jedenfalls anders!

von startek (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht lesenswert
startek schrieb:
> Jetzt geht's

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.