Hallo,
ich versuche seit mehreren Stunden eine ADC mit dem Attiny85 zum Laufen
zu bekommen.
Da ich ein Codebeispiel im Internet gefunden habe, dachte ich das dürfte
kein Problem sein. Ich habe nur das ADMUX Register geändert, damit die
ADC an PB2 durchgeführt wird.
Abhängig vom ermittelten Spannungswert sollen verschiedene Ausgänge
geschaltet werden, als Referenz dient VCC.
Allerdings reagiert der uC nicht, egal welche Spannung ich an PB2
anlege.
Hier mein Code:
1 | #include <avr/io.h>
|
2 |
|
3 | void init(void);
|
4 | void initADC(void);
|
5 | void adcmeasure(void);
|
6 |
|
7 | void main(void)
|
8 | {
|
9 | init();
|
10 | initADC();
|
11 | while(1)
|
12 | {
|
13 | adcstart();
|
14 | if(ADCH > 50)
|
15 | {
|
16 | PORTB |= 0b00001;
|
17 | }
|
18 |
|
19 | if(ADCH > 100)
|
20 | {
|
21 | PORTB |= 0b00011;
|
22 | }
|
23 |
|
24 | if(ADCH > 150)
|
25 | {
|
26 | PORTB |= 0b01011;
|
27 | }
|
28 |
|
29 | if(ADCH > 200)
|
30 | {
|
31 | PORTB |= 0b11011;
|
32 | }
|
33 | }
|
34 | }
|
35 |
|
36 | void init(void)
|
37 | {
|
38 | DDRB |= ((1 << DDB0) | (1 << DDB1) | (1 << DDB3) | (1 << DDB4)); //Set PB0,1,3,4 as output
|
39 | }
|
40 |
|
41 | void initADC(void)
|
42 | {
|
43 | /* this function initialises the ADC
|
44 |
|
45 | ADC Notes
|
46 |
|
47 | Prescaler
|
48 |
|
49 | ADC Prescaler needs to be set so that the ADC input frequency is between 50 - 200kHz.
|
50 |
|
51 | Example prescaler values for various frequencies
|
52 |
|
53 | Clock Available prescaler values
|
54 | ---------------------------------------
|
55 | 1 MHz 8 (125kHz), 16 (62.5kHz)
|
56 | 4 MHz 32 (125kHz), 64 (62.5kHz)
|
57 | 8 MHz 64 (125kHz), 128 (62.5kHz)
|
58 | 16 MHz 128 (125kHz)
|
59 |
|
60 | below example set prescaler to 128 for mcu running at 8MHz
|
61 |
|
62 |
|
63 | */
|
64 |
|
65 | ADMUX =
|
66 | (1 << ADLAR) | // left shift result
|
67 | (0 << REFS1) | // Sets ref. voltage to VCC, bit 1
|
68 | (0 << REFS0) | // Sets ref. voltage to VCC, bit 0
|
69 | (0 << MUX3) | // use ADC1 for input (PB2), MUX bit 3
|
70 | (1 << MUX2) | // use ADC1 for input (PB2), MUX bit 2
|
71 | (0 << MUX1) | // use ADC1 for input (PB2), MUX bit 1
|
72 | (1 << MUX0); // use ADC1 for input (PB2), MUX bit 0
|
73 |
|
74 | ADCSRA =
|
75 | (1 << ADEN) | // Enable ADC
|
76 | (1 << ADPS2) | // set prescaler to 64, bit 2
|
77 | (1 << ADPS1) | // set prescaler to 64, bit 1
|
78 | (0 << ADPS0); // set prescaler to 64, bit 0
|
79 | }
|
80 |
|
81 | void adcstart(void)
|
82 | {
|
83 | ADCSRA |= (1 << ADSC);// start ADC measurement
|
84 | while (ADCSRA & (1 << ADSC) ); // wait till conversion complete
|
85 | }
|
Stimmt vielleicht etwas mit der Frequenz nicht? Eigentlich müsste der
Attiny mit 8MHZ laufen.
Wäre super, wenn mir jemand weiterhelfen könnte :)