generated from TDD-Templates/cmake_cpputest_template_avr
Added debouncing section from the old code.
This commit is contained in:
parent
aed602668a
commit
ed788a8583
101
src/main.c
101
src/main.c
|
@ -1,3 +1,18 @@
|
||||||
|
/*
|
||||||
|
* Author: Jake G Email: jakegoodwin@gorge.works
|
||||||
|
* FileName: main.c
|
||||||
|
* Date: 2025
|
||||||
|
* Descripton: Program for Atiny13A controllers
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MCU
|
||||||
|
#define MCU atiny13a
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef F_CPU
|
||||||
|
#define F_CPU 4800000UL
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "stdio.h"
|
#include "stdio.h"
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
@ -9,6 +24,10 @@
|
||||||
//Globals
|
//Globals
|
||||||
//#############################
|
//#############################
|
||||||
|
|
||||||
|
|
||||||
|
//Debounce check number.
|
||||||
|
#define MAX_CHECKS 10
|
||||||
|
|
||||||
#define LED_PORT (1<<5)
|
#define LED_PORT (1<<5)
|
||||||
#define LED_PIN PB5
|
#define LED_PIN PB5
|
||||||
#define BLINK_DELAY_MS 5000
|
#define BLINK_DELAY_MS 5000
|
||||||
|
@ -72,19 +91,81 @@ int main(int argc, char **argv)
|
||||||
//FUNCTIONS
|
//FUNCTIONS
|
||||||
//#############################
|
//#############################
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Input: None
|
* ############################
|
||||||
* Output: None
|
* DEBOUNCING CODE
|
||||||
* Description: Toggles the pin for the LED indicator.
|
* ############################
|
||||||
*/
|
*/
|
||||||
void led_blink(void) {
|
|
||||||
//Set the DDR for output.
|
|
||||||
DDRB |= LED_PORT;
|
|
||||||
|
|
||||||
PORTB ^= (1<<LED_PIN);
|
/*
|
||||||
_delay_ms(500);
|
* INPUT: The port to check.
|
||||||
PORTB ^= (1<<LED_PIN);
|
* OUTPUT: None
|
||||||
_delay_ms(500);
|
* DESCRIPTION: Updates the global debounced state. This function
|
||||||
|
* should be called in a ISR a set rate using the hardware timer.
|
||||||
|
*/
|
||||||
|
static inline void debounce_switch() {
|
||||||
|
uint8_t i, j;
|
||||||
|
db_state[idx] = PINB & 0xFF;
|
||||||
|
idx+=1;
|
||||||
|
j = 0xff;
|
||||||
|
/*Loop through a number of checks*/
|
||||||
|
for(i = 0; i < MAX_CHECKS; i++) {
|
||||||
|
j = j & db_state[i];
|
||||||
|
}
|
||||||
|
debounced_state = j;
|
||||||
|
|
||||||
|
if(idx >= MAX_CHECKS) {
|
||||||
|
idx = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*Setup the timer0 on the AVR*/
|
||||||
|
static inline void init_timer0() {
|
||||||
|
/*Zero out the tick_count var*/
|
||||||
|
tick_count = 0;
|
||||||
|
|
||||||
|
/*config to normal mode.*/
|
||||||
|
TCCR0A = 0x00; //stop timer
|
||||||
|
TCCR0B = 0x00; //zero timer
|
||||||
|
|
||||||
|
/*set prescaler*/
|
||||||
|
//Set to div64
|
||||||
|
TCCR0B |= (1<<CS01)|(1<<CS00);
|
||||||
|
|
||||||
|
|
||||||
|
/*Enable global interrupts*/
|
||||||
|
sei();
|
||||||
|
|
||||||
|
/*Enabling timer0 interrupt*/
|
||||||
|
TCNT0 = 0;
|
||||||
|
TIMSK0 |= (1<<TOIE0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//ISR(TIMER0_OVF_vect)
|
||||||
|
|
||||||
|
/*The interrupt service routine for the timer0*/
|
||||||
|
ISR(TIM0_OVF_vect)
|
||||||
|
{
|
||||||
|
/*Disable global interrupts*/
|
||||||
|
cli();
|
||||||
|
|
||||||
|
/*Check the state of the switches*/
|
||||||
|
debounce_switch();
|
||||||
|
|
||||||
|
/*Update the tick_count*/
|
||||||
|
if(btn1.timer_enabled && btn1.pressed_ticks <= UINT8_MAX){
|
||||||
|
btn1.pressed_ticks += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(btn2.timer_enabled && btn2.pressed_ticks <= UINT8_MAX){
|
||||||
|
btn2.pressed_ticks += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*Re-Enable global interrupts*/
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue