initial commit
This commit is contained in:
commit
2b4d907200
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
||||||
|
!main.c
|
||||||
|
!Makefile
|
20
Makefile
Normal file
20
Makefile
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
CXX=avr-gcc
|
||||||
|
CXXFLAGS=-std=gnu99 -Os -mmcu=atmega644 -DF_CPU=10000000ul
|
||||||
|
LDFLAGS=
|
||||||
|
LDLIBS=
|
||||||
|
SOURCE= main.c
|
||||||
|
COM=/dev/ttyUSB0 #mit "lsusb" und "sudo dmesg | grep tty" herausfinden
|
||||||
|
PLATFORM=atmega644
|
||||||
|
BOARD=stk500
|
||||||
|
|
||||||
|
all: clean build push
|
||||||
|
clean:
|
||||||
|
rm -f *.elf
|
||||||
|
rm -f *.hex
|
||||||
|
|
||||||
|
build:
|
||||||
|
$(CXX) $(CXXFLAGS) main.c -o main.elf
|
||||||
|
avr-objcopy -O ihex -j .text -j .data main.elf main.hex
|
||||||
|
|
||||||
|
push:
|
||||||
|
sudo avrdude -p $(PLATFORM) -c $(BOARD) -P $(COM) -U flash:w:main.hex
|
109
main.c
Normal file
109
main.c
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
#include <stdbool.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#define PORT_LED PORTB
|
||||||
|
#define PIN_SWITCH PIND
|
||||||
|
|
||||||
|
bool do_round(uint8_t *seq, int len);
|
||||||
|
void display_seq(uint8_t *seq, int len);
|
||||||
|
bool read_input(uint8_t *seq, int len);
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
// Port B LED
|
||||||
|
DDRB = 0xFF;
|
||||||
|
|
||||||
|
// Port A Switch
|
||||||
|
DDRD = 0x00;
|
||||||
|
|
||||||
|
// Values from 0-7 representing the LED position
|
||||||
|
uint8_t seq[] = {4,2,4,5,1,0,3};
|
||||||
|
|
||||||
|
if (do_round(seq,7)) {
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
PORT_LED = 0x55;
|
||||||
|
_delay_ms(250);
|
||||||
|
PORT_LED = 0xAA;
|
||||||
|
_delay_ms(250);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
PORT_LED = 0xF0;
|
||||||
|
_delay_ms(250);
|
||||||
|
PORT_LED = 0x0F;
|
||||||
|
_delay_ms(250);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool do_round(uint8_t *seq, int len){
|
||||||
|
|
||||||
|
for (int i = 2; i < len; i++)
|
||||||
|
{
|
||||||
|
display_seq(seq,i);
|
||||||
|
if (!read_input(seq,i)){
|
||||||
|
// Failed
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void display_seq(uint8_t *seq, int len){
|
||||||
|
|
||||||
|
// Turn off all LEDs
|
||||||
|
PORT_LED = 0xFF;
|
||||||
|
|
||||||
|
_delay_ms(1000);
|
||||||
|
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
PORT_LED = (0xFF ^ (1 << seq[i] ));
|
||||||
|
|
||||||
|
_delay_ms(1000);
|
||||||
|
|
||||||
|
// Turn off LEDs
|
||||||
|
PORT_LED = 0xFF;
|
||||||
|
_delay_ms(250);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Turn off all LEDs
|
||||||
|
PORT_LED = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool read_input(uint8_t *seq, int len){
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
uint8_t expected = 0xFF ^ (1 << seq[i]);
|
||||||
|
|
||||||
|
bool run = true;
|
||||||
|
while (run)
|
||||||
|
{
|
||||||
|
uint8_t input = PIN_SWITCH;
|
||||||
|
if (input < 0xFF){
|
||||||
|
// A button is pressed
|
||||||
|
if (input == expected){
|
||||||
|
run = false;
|
||||||
|
|
||||||
|
// Wait for button to release
|
||||||
|
while (PIN_SWITCH != 0xFF)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// "debounce"
|
||||||
|
_delay_ms(50);
|
||||||
|
|
||||||
|
}else{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user