Hallo Community,
ich brauche hilfe für ein projekt, für das ich nur noch eine Funktion implementieren muss und es dann echt geschafft habe- aber die bereitet mir momentan probleme:
Ich möchte über einen hardwareentprellten taster und dem INT0 Interrupt
bestimmen, ob der µC die Funtion "signal_event" in der mainschleife
ausführt oder nicht. Zum wechseln ob ja oder nein, dachte ich an die
if-bedingungen im ISR und eine globale boolvariable.
Bei meinem Code wird über den INT0 immer nur der zweite teil der
ifbedingung ausgeführt, das heißt die bool ändert sich nicht.
Könnt ihr mir sagen, was ich falsch mache? Sehr viel mehr code passt
nicht rein, bin momentan bei ca 88%.
Code:
#include <stdbool.h>
#include <stdlib.h>
#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/power.h>
#include <avr/sleep.h>
#define F_CPU 9.6E6
#include <util/delay.h>
#define CLOCK_PRESCALER 256
#define TIMER_PRESCALER 1024
#define TIMER_PERIOD (256 / (F_CPU / CLOCK_PRESCALER / TIMER_PRESCALER))
#define MEDIAN ( 1 * 60) /* 10 minutes */
static uint16_t countdown;
static volatile bool timer_expired;
volatile bool on;
ISR(TIM0_OVF_vect)
{
if (--countdown == 0) {
TCCR0B = 0; /* turn off timer */
timer_expired = true;
clock_prescale_set(clock_div_1);
}
}
ISR(INT0_vect)
{
if (on)
{
on = false;
PORTB |= (1<<PB4); // LED 2*flashing: Off
_delay_ms(20);
PORTB &= ~(1<<PB4);
_delay_ms(20);
PORTB |= (1<<PB4);
_delay_ms(20);
PORTB &= ~(1<<PB4);
_delay_ms(20);
}
else if (!on)
{
on = true;
PORTB |= (1<<PB4); // LED 1*flashing: On
_delay_ms(20);
PORTB &= ~(1<<PB4);
_delay_ms(20);
}
}
static void starttimer(uint16_t timeout)
{
countdown = timeout;
TCNT0 = 0;
timer_expired = false;
clock_prescale_set(clock_div_256);
TCCR0B = _BV(CS02) | _BV(CS00); /* start timer with prescaler 1024 */
}
static void ioinit(void)
{
TIMSK0 = _BV(TOIE0);
GIMSK |= (1<<INT0);
MCUCR |= (1<<ISC01); // Falling edge
MCUCR &= ~(1<<ISC00); // INT0 detection
sei();
DDRB = _BV(4); /* connection for LED or something else */
}
static void signal_event(void)
{
PORTB |= _BV(4);
_delay_ms(1000);
PORTB &= ~_BV(4);
}
int
main(void)
{
ioinit();
for (;;) {
int r = rand();
uint16_t timeout = (unsigned)r % (unsigned)(2 * MEDIAN / TIMER_PERIOD) + 1;
starttimer(timeout);
do
{
sleep_mode();
}
while (!timer_expired);
if (on)
signal_event();
}
}
Beste Grüße[/code]
Lesezeichen