Hi
habe meinen Code jetzt so überarbeitet wie du es geschrieben hast. Leider hat es nicht funktioniert. Das Problem mit dem 16-Bit-Timer besteht weiterhin.
So sieht der COde jetzt aus:
Bei meinem Anderen Problem habe ich den Fehler gefunden.Code:#define F_CPU 1000000UL #include <util/delay.h> #include <avr/io.h> #include <avr/interrupt.h> #include <stdio.h> #define LED1 1 volatile uint8_t i; #define a 50 //Zeit in ms/10 für Blinkfrequenz der LED1 uint8_t b; //variablen für entprellung #define TASTERPORT PIND #define TASTERBIT PIND3 //Entprellung char taster(void) { static unsigned char zustand; char rw = 0; if(zustand == 0 && !(TASTERPORT & (1<<TASTERBIT))) //Taster wird gedrueckt (steigende Flanke) { zustand = 1; rw = 1; } else if (zustand == 1 && !(TASTERPORT & (1<<TASTERBIT))) //Taster wird gehalten { zustand = 2; rw = 0; } else if (zustand == 2 && (TASTERPORT & (1<<TASTERBIT))) //Taster wird losgelassen (fallende Flanke) { zustand = 3; rw = 0; } else if (zustand == 3 && (TASTERPORT & (1<<TASTERBIT))) //Taster losgelassen { zustand = 0; rw = 0; } else if (((zustand == 1) || (zustand == 2)) && !(TASTERPORT & (1<<TASTERBIT))) //Taster wird gehalten { zustand = 2; rw = 0; } return rw; } int main(void) { DDRB = 0b00000010; //Einstellung Interrupt PORTD = 0b00000100; GIMSK = (1<<INT0); MCUCR = (1<<ISC01); //The falling edge of INT0 generates an Interrupt //Timerkonfiguration //TIMSK = (1<<OCIE0A); //Ineterrupt aktivieren //TCCR0A = (1<<WGM01); //CTC-Mode akrivieren //OCR0A = 155; //Interrupt asulösen bei Zählerstand (10ms) //TCCR0B = ((1<<CS00) | (1<<CS01)); //Timer starten mit Prescaler 64 i=0; b=2*a; //Globale interrupts aktivieren sei(); while (1) { if (i==0) { PORTB &=~ (1<<LED1); } if ((i>=1) && (i<=a)) { PORTB |= (1<<LED1); } if ((i>=1) && (i>a) && (i<=b)) { PORTB &=~ (1<<LED1); if (i>=b) { i=1; } } } } ISR(INT0_vect) { _delay_ms(50); if (bit_is_set (TIMSK,OCIE0A)) { TIMSK &= ~(1<<OCIE0A); //Ineterrupt aktivieren TCCR0A &= ~(1<<WGM01); //CTC-Mode akrivieren OCR0A |= 0; //Interrupt asulösen bei Zählerstand (10ms) TCCR0B &= ~((1<<CS00) | (1<<CS01)); //Timer starten mit Prescaler 64 } if (bit_is_clear (TIMSK,OCIE0A)) { TIMSK |= (1<<OCIE0A); //Ineterrupt aktivieren TCCR0A |= (1<<WGM01); //CTC-Mode akrivieren OCR0A |= 156; //Interrupt asulösen bei Zählerstand (10ms) TCCR0B |= ((1<<CS00) | (1<<CS01)); //Timer starten mit Prescaler 64 } if (i==0) { i=1; } if (i>=1) { i=0; } } ISR(TIMER0_COMPA_vect) { i++; }
Über weitere Tipps bin ich sehr dankbar.
LG Lichti01







Zitieren


Lesezeichen