Add timer abstraction
This commit is contained in:
parent
a1bebfd7ed
commit
15d45fd496
|
@ -8,8 +8,10 @@
|
||||||
#include "../lib/freq_table.h"
|
#include "../lib/freq_table.h"
|
||||||
#include <lib/bughal.h>
|
#include <lib/bughal.h>
|
||||||
|
|
||||||
#include "../lib/apps.h"
|
#include <lib/timer.h>
|
||||||
|
#include <lib/apps.h>
|
||||||
|
|
||||||
|
void tetris_play(void);
|
||||||
|
|
||||||
static uint16_t osc0;
|
static uint16_t osc0;
|
||||||
static uint16_t osc1;
|
static uint16_t osc1;
|
||||||
|
@ -21,29 +23,17 @@ static uint16_t speedtime;
|
||||||
void synth_init(void){
|
void synth_init(void){
|
||||||
init_buzzr();
|
init_buzzr();
|
||||||
|
|
||||||
cli();
|
|
||||||
osc0 = osc1 = sample = row = 0;
|
osc0 = osc1 = sample = row = 0;
|
||||||
speedtime = 3000;
|
speedtime = 3000;
|
||||||
|
|
||||||
/* set timer0 to CTC & prescaler 64 → 125kHz increment */
|
start_timer(tetris_play);
|
||||||
TCCR0A = (1 << WGM01);
|
|
||||||
TCCR0B = (1 << CS00) | (1 << CS01);
|
|
||||||
|
|
||||||
OCR0A = 4; /* TOP */
|
|
||||||
TCNT0 = 0;
|
|
||||||
|
|
||||||
/*enable interrupt */
|
|
||||||
TIMSK0 |= (1 << OCIE0A);
|
|
||||||
|
|
||||||
sei();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void synth_deinit(void) {
|
void synth_deinit(void) {
|
||||||
cli();
|
stop_timer();
|
||||||
TIMSK0 = 0;
|
|
||||||
sei();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,8 +91,7 @@ const char music_data[2][SONG_LENGTH] PROGMEM = {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ISR(TIMER0_COMPA_vect,ISR_NOBLOCK)
|
void tetris_play(void) {
|
||||||
{
|
|
||||||
osc0 += pgm_read_word(&freq_table[ pgm_read_byte(&music_data[0][row])]);
|
osc0 += pgm_read_word(&freq_table[ pgm_read_byte(&music_data[0][row])]);
|
||||||
osc1 += pgm_read_word(&freq_table[ pgm_read_byte(&music_data[1][row])]);
|
osc1 += pgm_read_word(&freq_table[ pgm_read_byte(&music_data[1][row])]);
|
||||||
if (++sample == speedtime ) {
|
if (++sample == speedtime ) {
|
||||||
|
|
40
firmware/lib/timer.c
Normal file
40
firmware/lib/timer.c
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <lib/timer.h>
|
||||||
|
|
||||||
|
timer_cb cur_cb;
|
||||||
|
|
||||||
|
void start_timer(timer_cb cb) {
|
||||||
|
cur_cb = cb;
|
||||||
|
|
||||||
|
cli();
|
||||||
|
|
||||||
|
/* set timer0 to CTC & prescaler 64 → 125kHz increment */
|
||||||
|
TCCR0A = (1 << WGM01);
|
||||||
|
TCCR0B = (1 << CS00) | (1 << CS01);
|
||||||
|
|
||||||
|
OCR0A = 4; /* TOP */
|
||||||
|
TCNT0 = 0;
|
||||||
|
|
||||||
|
/*enable interrupt */
|
||||||
|
TIMSK0 |= (1 << OCIE0A);
|
||||||
|
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
|
||||||
|
void stop_timer(void) {
|
||||||
|
cli();
|
||||||
|
TIMSK0 = 0;
|
||||||
|
sei();
|
||||||
|
|
||||||
|
cur_cb = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(TIMER0_COMPA_vect,ISR_NOBLOCK) {
|
||||||
|
if(cur_cb != NULL) {
|
||||||
|
cur_cb();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
10
firmware/lib/timer.h
Normal file
10
firmware/lib/timer.h
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#ifndef TIMER_H
|
||||||
|
#define TIMER_H
|
||||||
|
|
||||||
|
typedef void (*timer_cb)(void);
|
||||||
|
|
||||||
|
void start_timer(timer_cb cb);
|
||||||
|
|
||||||
|
void stop_timer(void);
|
||||||
|
|
||||||
|
#endif /* TIMER_H */
|
Loading…
Reference in New Issue
Block a user