- Registriert
- Feb. 2015
- Beiträge
- 17
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <stdlib.h> // ka denke nicht nötig
enum uCState {
STATE_MAIN = 0,
STATE_WAIT = 1,
STATE_BUZZ = 2
};
enum uCState currentState;
uint16_t _ovf_cnt = 0;
ISR(TIM0_OVF_vect)
{
/* Overflow Zähler erhöhen */
++_ovf_cnt;
}
void timer_reset(void)
{
uint8_t oldSREG = SREG;
/* Interrupts deaktivieren */
cli();
/* Timer zurück setzen */
_ovf_cnt = 0;
TCNT0 = 0;
/* SREG wiederherstellen */
SREG = oldSREG;
}
uint8_t timer_get(void)
{
uint8_t oldSREG = SREG, scnds = 0;
/* Interrupts deaktivieren */
cli();
/*
1 Overflow 1024 uS
_ovf_cnt XXX S
*/
scnds = (_ovf_cnt / 1) * 1024E-6;
/* SREG wiederherstellen */
SREG = oldSREG;
return scnds;
}
int main(void)
{
uint32_t ui32_PreScaler = 0;
DDRB = ( 1<<PINB3 ) | ( 1<<PINB4 );
PORTB = 0x00;
while ( 1 )
{
if ( 200000LU <= ++ui32_PreScaler )
{
ui32_PreScaler = 0;
PINB |= ( 1<<PINB3 ) | ( 1<<PINB4 );
}
}
// PB3 als EINGANG definieren
// PB4 als AUSGANG definieren
DDRB = 0b00010000;
/* Gesamter Port B auf 0 setzen */
PORTB = 0b00001000;
/* Timer Konfigurieren */
TCNT0 = 0;
// Timer Overflow Interrupt zulassen
TIMSK0 = 0b00000010;
// Normaler Modus
TCCR0A = 0b00000000;
// Prescaler von 1024 einstellen
TCCR0B = 0b00000101;
/* Globale Interrupts erlauben */
sei();
/* Zustand ist MAIN */
currentState = STATE_MAIN;
/* Endlos Schleife */
while (1) {
while (1) {
if (0 == ( PINB & 0b00001000)) PORTB &= ~0b00010000;
else PORTB |= 0b00010000;
}
switch (currentState) {
case STATE_MAIN: {
/* Warten bis der Taster an PB3 gedrückt wurde */
if (0 == ( PINB & 0b00001000)) {
currentState = STATE_WAIT;
/* Timer zurücksetzen */
timer_reset();
}
} break;
case STATE_WAIT: {
/* Warten bis 2 Min. und 20 Sek. verstrichen sind */
if (timer_get() >= 20) {
/* State wechseln */
currentState = STATE_BUZZ;
/* Timer zurücksetzen */
timer_reset();
}
} break;
case STATE_BUZZ: {
/* Buzzer anstellen */
PORTB |= 0b00010000;
/* Warten bis 3 bis 5 Sekunden verstrichen sind */
if (timer_get() >= 3) {
/* Buzzer ausstellen */
PORTB &= 0b11101111;
/* Ins MAIN zurückspringen */
currentState = STATE_MAIN;
}
} break;
}
}
}
Ist das so richtig?
Wenn ja, es passiert leider immer noch nix