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