Ich bekomme einfach nicht den ADC vom AtTiny85 zum Laufen... Hab mich an
diesem Code orientiert:
1 | void initADC()
|
2 | {
|
3 | /* this function initialises the ADC
|
4 |
|
5 | ADC Notes
|
6 |
|
7 | Prescaler
|
8 |
|
9 | ADC Prescaler needs to be set so that the ADC input frequency is between 50 - 200kHz.
|
10 |
|
11 | Example prescaler values for various frequencies
|
12 |
|
13 | Clock Available prescaler values
|
14 | ---------------------------------------
|
15 | 1 MHz 8 (125kHz), 16 (62.5kHz)
|
16 | 4 MHz 32 (125kHz), 64 (62.5kHz)
|
17 | 8 MHz 64 (125kHz), 128 (62.5kHz)
|
18 | 16 MHz 128 (125kHz)
|
19 |
|
20 | below example set prescaler to 128 for mcu running at 8MHz
|
21 |
|
22 |
|
23 | */
|
24 |
|
25 | ADMUX =
|
26 | (1 << ADLAR) | // left shift result
|
27 | (0 << REFS1) | // Sets ref. voltage to VCC, bit 1
|
28 | (0 << REFS0) | // Sets ref. voltage to VCC, bit 0
|
29 | (0 << MUX3) | // use ADC2 for input (PB4), MUX bit 3
|
30 | (0 << MUX2) | // use ADC2 for input (PB4), MUX bit 2
|
31 | (1 << MUX1) | // use ADC2 for input (PB4), MUX bit 1
|
32 | (0 << MUX0); // use ADC2 for input (PB4), MUX bit 0
|
33 |
|
34 | ADCSRA =
|
35 | (1 << ADEN) | // Enable ADC
|
36 | (1 << ADPS2) | // set prescaler to 64, bit 2
|
37 | (1 << ADPS1) | // set prescaler to 64, bit 1
|
38 | (0 << ADPS0); // set prescaler to 64, bit 0
|
39 | }
|
40 |
|
41 |
|
42 | int main( void )
|
43 | {
|
44 |
|
45 | initADC();
|
46 |
|
47 | while(1)
|
48 | {
|
49 |
|
50 | ADCSRA |= (1 << ADSC); // start ADC measurement
|
51 | while (ADCSRA & (1 << ADSC) ); // wait till conversion complete
|
52 |
|
53 | if (ADCH > 128)
|
54 | {
|
55 | // ADC input voltage is more than half of VCC
|
56 |
|
57 | } else {
|
58 |
|
59 | // ADC input voltage is less than half of VCC
|
60 |
|
61 | }
|
62 |
|
63 | }
|
64 |
|
65 | return 0;
|
66 | }
|
Quelle: http://www.marcelpost.com/wiki/index.php/ATtiny85_ADC
Natürlich bin ich auch das Datenblatt rauf und runter, aber ich komm
einfach nicht auf das Problem. Fuses sind auch richtig gesetzt.
Dem Code habe ich lediglich 'DDRB = (1<<PB1);' und in der if-else
Abfrage 'PORTB |= (1<<PB1);', 'PORTB |= (0<<PB1);' hinzugefügt.
An PB1 hängt eine LED mit Vorwiderstand.
Derzeitig scheint es nur zu einer Umwandlung zu kommen... schwebt PB4
(ADC2) beim Neustart oder liegt auf Masse ist die LED wie gewünscht aus.
Ist PB4 beim Start auf VCC leuchtet die LED. Verbinde ich PB4 von
Floating/Masse auf Vcc geht die LED an. Aber nicht mehr aus.