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:
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++;
}
Bei meinem Anderen Problem habe ich den Fehler gefunden.
Über weitere Tipps bin ich sehr dankbar.
LG Lichti01
Lesezeichen