Ich möchte mit einem ATtiny45 eine Spannung messen und abhängig davon eine LED ein- bzw. ausschalten. Programmiert wird er tiny mittels ISP. Im Anhang ist die Schaltung zu finden. Das Problem ist nun, dass am ADC-Eingang PB4 immer 0 gelesen wird. Ich habe die Schaltung auch schon mit und ohne Kondensator an AREF ausprobiert, und den ADC auch laut Datenblatt dementsprechend konfiguriert. Jedoch ohne Erfolg. Bei den ATmega war der ADC noch nie ein Problem, jedoch bereitet mir der tiny nun etwas Kopfzerbrechen. Bitte um Hilfe. Edit: Den Schaltplan habe ich irrtümlich doppelt hochgeladen. Code richtiggestellt Hier nun der Code:
1 | #define F_CPU 1000000
|
2 | |
3 | #include <avr/io.h> |
4 | #include <util/delay.h> |
5 | |
6 | void init_adc(void) { |
7 | uint16_t result; |
8 | |
9 | ADMUX = (1<<REFS2) | (1 << REFS1); |
10 | ADCSRA = (1 << ADEN) | (1 << ADPS1) | (1<<ADPS0); |
11 | DIDR0 = (1<<ADC1D) | (1<<ADC2D) | (1<<ADC3D); |
12 | |
13 | ADCSRA |= (1 << ADSC); |
14 | while (ADCSRA & (1 << ADSC)) { |
15 | asm("nop"); |
16 | }
|
17 | |
18 | result = ADCW; |
19 | }
|
20 | |
21 | uint16_t adc_read(uint8_t channel) { |
22 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); |
23 | ADCSRA |= (1 << ADSC); |
24 | while (ADCSRA & (1 << ADSC)) |
25 | ;
|
26 | return ADCW; |
27 | }
|
28 | |
29 | uint16_t adc_read_avg(uint8_t channel, uint8_t average) { |
30 | uint16_t result = 0; |
31 | uint8_t i; |
32 | |
33 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); |
34 | |
35 | for (i = 0; i < average; ++i) { |
36 | ADCSRA |= (1 << ADSC); |
37 | while (ADCSRA & (1 << ADSC)) |
38 | ;
|
39 | result += ADCW; |
40 | }
|
41 | |
42 | return result / average; |
43 | }
|
44 | |
45 | void init() |
46 | {
|
47 | DDRB |= (1<<PB1); |
48 | }
|
49 | |
50 | int main(void) |
51 | {
|
52 | init(); |
53 | init_adc(); |
54 | uint16_t adc; |
55 | |
56 | while (1) |
57 | {
|
58 | adc = adc_read_avg(PB4, 5); |
59 | |
60 | if(adc< 500) |
61 | {
|
62 | PORTB |= (1<<PB1); |
63 | }
|
64 | else
|
65 | {
|
66 | PORTB &= ~(1<<PB1); |
67 | }
|
68 | }
|
69 | }
|