atlo atmega168pa working

atlo
vuko 2022-08-20 14:23:22 +02:00
parent cc1785dfee
commit b036f711b7
5 changed files with 38 additions and 27 deletions

View File

@ -1,9 +1,9 @@
PRG = uart_hello
OBJ = main.o buzzer.o keypad.o twi.o
PROGRAMMER = avrisp2
PROGRAMMER = usbasp
PORT = usb
MCU_TARGET = atmega8
AVRDUDE_TARGET = atmega8
MCU_TARGET = atmega168p
AVRDUDE_TARGET = m168p
OPTIMIZE = -Os
DEFS =
LIBS =
@ -81,7 +81,7 @@ install: $(PRG).hex
fuse:
avrdude -p $(AVRDUDE_TARGET) -c $(PROGRAMMER) -P $(PORT) -v \
-U lfuse:w:0xe4:m -U hfuse:w:0xd9:m
-U lfuse:w:0xe2:m -U hfuse:w:0xde:m
ddd: gdbinit
ddd --debugger "avr-gdb -x $(GDBINITFILE)"

View File

@ -4,6 +4,7 @@
#include "io.h"
#include "buzzer.h"
#include <stdbool.h>
IMPORT_IO(BUZZER);
@ -20,9 +21,9 @@ void buzzer_init(void)
void buzzer_start(uint16_t ticks)
{
cli();
TIMSK &= ~_BV(OCIE1A);
TIMSK1 &= ~_BV(OCIE1A);
OCR1A = ticks;
TIMSK |= _BV(OCIE1A);
TIMSK1 |= _BV(OCIE1A);
TCNT1 = 0;
sei();
}
@ -37,7 +38,9 @@ void buzzer_start_timed(uint16_t freq, uint16_t ticks)
void buzzer_stop(void)
{
cli();
TIMSK &= ~_BV(OCIE1A);
TIMSK1 &= ~_BV(OCIE1A); // dissable compare interrupt
TIFR1 |= _BV(OCF1A); // clear compare flags
IO_OUT(BUZZER, 1);
sei();
}
@ -48,7 +51,7 @@ ISR(TIMER1_COMPA_vect)
{
g_BuzzerTicksLeft--;
if (g_BuzzerTicksLeft == 0)
TIMSK &= ~_BV(OCIE1A);
TIMSK1 &= ~_BV(OCIE1A);
}*/
}

View File

@ -4,6 +4,8 @@
void buzzer_init(void);
void buzzer_signal_boot(void);
void buzzer_start_timed(uint16_t, uint16_t);
void buzzer_start(uint16_t ticks);
void buzzer_stop(void);
#define TONE_LOW 128
#define TONE_MID 64

View File

@ -18,9 +18,9 @@ static void _keypad_update_column(void);
void keypad_init(void)
{
TCCR0 = _BV(CS02);
TCCR0B = _BV(CS02);
TCNT0 = 0;
TIMSK |= _BV(TOIE0);
TIMSK0 |= _BV(TOIE0);
IO_OUT(KPAD_ROW1, 1);
IO_OUT(KPAD_ROW2, 1);

View File

@ -2,6 +2,7 @@
#include <avr/wdt.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
#include "io.h"
#include "buzzer.h"
@ -13,27 +14,31 @@
/////////////////////
// Buzzer on PC2
DECLARE_IO(BUZZER, C, 2);
DECLARE_IO(BUZZER, B, 2);
// Red LED pn PC0
DECLARE_IO(LED_RED, C, 0);
DECLARE_IO(LED_RED, D, 4);
// Green LED on PC1
DECLARE_IO(LED_GREEN, C, 1);
DECLARE_IO(LED_GREEN, D, 1);
// Keypad
DECLARE_IO(KPAD_COL3, D, 0);
DECLARE_IO(KPAD_ROW3, D, 1);
DECLARE_IO(KPAD_COL1, D, 5);
DECLARE_IO(KPAD_COL2, B, 0);
DECLARE_IO(KPAD_COL3, B, 3);
DECLARE_IO(KPAD_ROW1, C, 1);
DECLARE_IO(KPAD_ROW2, C, 0);
DECLARE_IO(KPAD_ROW3, B, 5);
DECLARE_IO(KPAD_ROW4, B, 4);
DECLARE_IO(KPAD_COMMON, D, 2);
DECLARE_IO(KPAD_COL2, D, 3);
DECLARE_IO(KPAD_ROW1, D, 4);
DECLARE_IO(KPAD_ROW2, D, 5);
DECLARE_IO(KPAD_ROW4, D, 6);
DECLARE_IO(KPAD_COL1, D, 7);
#define KEYPAD_BUFFER_SIZE 16
static volatile uint8_t KeypadBytes[KEYPAD_BUFFER_SIZE];
static volatile uint8_t KeypadIndex = 0;
static volatile uint8_t KeypadShouldRead = 0;
void fsm_logic(void); // TODO move
#define KEYPAD_STATE_IDLE 0
#define KEYPAD_STATE_GETTING_BYTES 1
#define KEYPAD_STATE_TIMEOUT 2
@ -53,13 +58,14 @@ static void fsm_idle(void)
KeypadState = KEYPAD_STATE_IDLE;
KeypadShouldRead = 0;
KeypadIndex = 0;
IO_OUT(LED_RED, 0);
IO_OUT(LED_GREEN, 0);
IO_OUT(LED_RED, 1);
IO_OUT(LED_GREEN, 1);
}
static void fsm_get_bytes(uint8_t required)
{
KeypadState = KEYPAD_STATE_GETTING_BYTES;
memset((void *)KeypadBytes, 0 , sizeof(KeypadBytes));
KeypadShouldRead = required;
KeypadIndex = 0;
}
@ -84,11 +90,11 @@ int main (void)
TWI_Start_Transceiver();
// Flash LEDs and buzz buzzer for debug
IO_OUT(LED_GREEN, 1);
IO_OUT(LED_RED, 1);
buzzer_signal_boot();
IO_OUT(LED_GREEN, 0);
IO_OUT(LED_RED, 0);
buzzer_signal_boot();
IO_OUT(LED_GREEN, 1);
IO_OUT(LED_RED, 1);
// Zero out the keypad buffer
for (uint8_t i = 0; i < KEYPAD_BUFFER_SIZE; i++)
@ -135,7 +141,7 @@ int main (void)
break;
case KEYPAD_I2C_SOUND_OK:
TWI_Start_Transceiver();
IO_OUT(LED_GREEN, 1);
IO_OUT(LED_GREEN, 0);
buzzer_start(TONE_HIGH);
_delay_ms(100);
buzzer_stop();
@ -154,7 +160,7 @@ int main (void)
break;
case KEYPAD_I2C_SOUND_DENIED:
TWI_Start_Transceiver();
IO_OUT(LED_RED, 1);
IO_OUT(LED_RED, 0);
buzzer_start(TONE_HIGH);
_delay_ms(100);
buzzer_stop();