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 PRG = uart_hello
OBJ = main.o buzzer.o keypad.o twi.o OBJ = main.o buzzer.o keypad.o twi.o
PROGRAMMER = avrisp2 PROGRAMMER = usbasp
PORT = usb PORT = usb
MCU_TARGET = atmega8 MCU_TARGET = atmega168p
AVRDUDE_TARGET = atmega8 AVRDUDE_TARGET = m168p
OPTIMIZE = -Os OPTIMIZE = -Os
DEFS = DEFS =
LIBS = LIBS =
@ -81,7 +81,7 @@ install: $(PRG).hex
fuse: fuse:
avrdude -p $(AVRDUDE_TARGET) -c $(PROGRAMMER) -P $(PORT) -v \ 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: gdbinit
ddd --debugger "avr-gdb -x $(GDBINITFILE)" ddd --debugger "avr-gdb -x $(GDBINITFILE)"

View File

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

View File

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

View File

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

View File

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