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