Guten Abend,
zu meiner Hardware:
ATtiny13, Dragon, AtmelStudio 6
vorgeschichte:
- AD-Wandlung an PB3 & PB4 (ohne Timer-Interrupt)funktioniert Wunderbar
- Timer-Interrupt (ohne AD-Wandlung) funktioniert Wunderbar
zu meinem Problem:
ich würde gerne beides kombinieren um daraus 2 vco's (z.B PB0 & PB1) zu
realisieren, zur not tuts auch nur ein vco.
Hat irgendjemand ideen?
Hier mein Code der so nicht funktioniert:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | int portb_out();
|
5 | int init_timer();
|
6 | int config_adc(int x);
|
7 |
|
8 |
|
9 | volatile int a = 0; // Zählvariable
|
10 | volatile int b = 0; // Zählvariable
|
11 |
|
12 |
|
13 | unsigned int adc3h = 0;
|
14 | unsigned int adc3l = 0;
|
15 | unsigned int adc2h = 0;
|
16 | unsigned int adc2l = 0;
|
17 |
|
18 | ISR(TIM0_OVF_vect)
|
19 | {
|
20 | ++a;
|
21 | ++b;
|
22 | }
|
23 |
|
24 |
|
25 | int main(void)
|
26 | {
|
27 | portb_out(); // aufruf des Prototypen zur Initialisierung
|
28 | init_timer(); // aufruf des Prototypen zur Initialisierung
|
29 |
|
30 |
|
31 | while(1)
|
32 | {
|
33 | config_adc(2);
|
34 | adc2l = ADCL; // schreibt die untersten 2 Bits
|
35 | adc2h = ADCH; // schreibt die obersten 8 Bits
|
36 | ADCSRA = ADCSRA & (~(1<<ADEN)); // stoppt den ADC
|
37 |
|
38 | if (a == adc2h)
|
39 | {
|
40 | PORTB ^= 0b00000001; // ^= toggelt PB0
|
41 | a = 0;
|
42 | }
|
43 |
|
44 | config_adc(3);
|
45 | adc3l = ADCL; // schreibt die untersten 2 Bits
|
46 | adc3h = ADCH; // schreibt die obersten 8 Bits
|
47 | ADCSRA = ADCSRA & (~(1<<ADEN)); // stoppt den ADC
|
48 | if (b == adc3h)
|
49 | {
|
50 | PORTB ^= 0b00000010; // ^= toggelt PB1
|
51 | b = 0;
|
52 | }
|
53 |
|
54 | }
|
55 | }
|
56 |
|
57 |
|
58 |
|
59 | int portb_out()
|
60 | {
|
61 | DDRB = DDRB | 0b00000011;
|
62 | PORTB = 0;
|
63 | }
|
64 |
|
65 | int init_timer()
|
66 | {
|
67 | TCCR0B=0x01;
|
68 | TIMSK0 |=1<<TOIE0; // enable timer overflow interrupt
|
69 | sei();
|
70 | }
|
71 |
|
72 | int config_adc(x)
|
73 | {
|
74 | ADMUX = x; // Auswahl des ADC-Kanals:
|
75 | DIDR0 = 0b00011000;
|
76 | ADMUX |= (0 << REFS0);
|
77 | ADMUX |= (1 << ADLAR);
|
78 | ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
|
79 | ADCSRB |= (0 << ADTS2) | (0 << ADTS1) | (0 << ADTS1);
|
80 | ADCSRA |= (1 << ADEN); // aktiviert den ADC
|
81 | ADCSRA |= (1 << ADSC);
|
82 | while(ADCSRA & (1<<ADSC))
|
83 | {
|
84 | asm volatile("nop"); // NOP
|
85 | }
|
86 | }
|