Compare commits
13 Commits
24171244ff
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
4da8b3d86a
|
|||
|
7d19efa11f
|
|||
|
1c9439f76d
|
|||
|
eecdddd8fe
|
|||
|
89cb9a3464
|
|||
|
204e94d613
|
|||
|
a30bf50f67
|
|||
|
0d6d8dbd2a
|
|||
|
bb92ec7bd5
|
|||
|
c58acf3524
|
|||
|
2c239dd8e4
|
|||
|
74be66bfea
|
|||
|
a4b3a1f2ad
|
49
README.md
49
README.md
@@ -1,22 +1,51 @@
|
|||||||
# 01_atmega328_lauflicht
|
# 01_atmega328_lauflicht
|
||||||
|
|
||||||
## Stage 1:
|
## Stage 1 - Hello World, Assembler:
|
||||||
|
|
||||||
- [x] Kompilieren und Flashen via Shell-Skript
|
- [x] Kompilieren und Flashen via Shell-Skript
|
||||||
- [x] LED Reihe via Assembler aufleuchten lassen
|
- [x] LED Reihe via Assembler aufleuchten lassen
|
||||||
|
|
||||||
## Stage 2:
|
## Stage 2 - Timer Integration:
|
||||||
|
|
||||||
- [x] Hardcodiertes Lauflicht L2R Richtung
|
- [x] Hardcodiertes Lauflicht L2R Richtung
|
||||||
- [ ] Hardcodiertes Lauflicht R2L Richtung
|
- [x] Hardcodiertes Lauflicht R2L Richtung
|
||||||
|
|
||||||
## Stage 3:
|
## Stage 3 - Statuswechsel via Hardware Interaktion:
|
||||||
|
|
||||||
- [ ] Richtungswechsel via Taster Klick
|
- [x] Richtungswechsel via Taster Klick
|
||||||
- [ ] Animation läuft unbeirrt weiter bei Taster-Klick
|
- [x] Animation läuft unbeirrt weiter bei Taster-Klick
|
||||||
- [ ] Wechsel von L2R auf R2L bei Taster-Links-Klick
|
- [x] Wechsel von L2R auf R2L bei Taster-Links-Klick
|
||||||
- [ ] Wechsel von R2L auf L2R bei Taster-Rechts-Klick
|
- [x] Wechsel von R2L auf L2R bei Taster-Rechts-Klick
|
||||||
|
|
||||||
## Stage 4:
|
## Stage 4 - Erweiterte Status Abhandlung (Anzahl Status > 2):
|
||||||
|
|
||||||
- [ ] Animation stoppt wenn beide Taster simultan gedrückt sind
|
- [x] Animation stoppt wenn beide Taster simultan gedrückt sind
|
||||||
|
|
||||||
|
## Stage 5 - Willkommen in der Analogen MCU-Welt:
|
||||||
|
|
||||||
|
- [ ] Geschwindigkeit via Poti steuern
|
||||||
|
|
||||||
|
## Stage 6 - Gray-Code Handling kann auch nicht schaden:
|
||||||
|
|
||||||
|
- [ ] Modi umschalten via Encoder-Taster
|
||||||
|
- [ ] Mode 1: autom. Lauflicht
|
||||||
|
- [ ] Mode 2: manuelles Lauflicht gesteuert via Encoder-Drehung
|
||||||
|
|
||||||
|
## Stage 7 - Pin Reduzierung:
|
||||||
|
|
||||||
|
- [ ] LEDs via Charlieplexing betreiben um Pin-Anzahl von 8 auf 4 zu reduzieren
|
||||||
|
- [ ] Standard-LEDs durch einzel adressierbare RGB-LEDs austauschen um so die Daten-Pin-Anzahl auf 1 zu reduzieren
|
||||||
|
|
||||||
|
## Stage 8 - Lass uns ein Spiel spielen:
|
||||||
|
|
||||||
|
- [ ] Mode 3: 1-Dimensionales Pong Spiel
|
||||||
|
- [ ] Wenn das Lauflicht (LL) das linke/rechte Ende erreicht, muss der jeweilige Button rechtzeitig gedrückt werden um die Laufrichtung umzukehren.
|
||||||
|
- [ ] Wenn das LL durchläuft bekommt der Gegner einen Punkt
|
||||||
|
- [ ] Punktestände werden mit zwei einzelnen 7-Segmentanzeigen visualisiert
|
||||||
|
- [ ] Wer zuerst 10 Punkte erreicht gewinnt
|
||||||
|
- [ ] ToDo: Sieges-Animation bestimmen z.B. Farbenspiel der LL-LEDs oder Kreisanimation der 7-Segmentanzeige
|
||||||
|
|
||||||
|
## Stage 9 - Mal was für's Auge (SPI & I2C):
|
||||||
|
|
||||||
|
- [ ] Zeige aktuellen Modus auf LCD an
|
||||||
|
- [ ] Zeige aktuellen Modus auf OLED an
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# Build & Flash
|
# Build & Flash
|
||||||
avra main.asm && avrdude -p m328p -c arduino -b 115200 -P /dev/tty.usbserial-A50285BI -U flash:w:main.hex
|
avra main.asm && avrdude -p m328p -c arduino -b 115200 -P /dev/tty.usbserial-110 -U flash:w:main.hex
|
||||||
|
|
||||||
|
|||||||
22
macros.inc
Normal file
22
macros.inc
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
;========
|
||||||
|
; Macros
|
||||||
|
;========
|
||||||
|
|
||||||
|
.macro left_to_right
|
||||||
|
in @0, PORTD
|
||||||
|
clc
|
||||||
|
ror @0
|
||||||
|
brcc PC+2
|
||||||
|
ldi @0, 0b10000000
|
||||||
|
out PORTD, @0
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro right_to_left
|
||||||
|
in @0, PORTD
|
||||||
|
clc
|
||||||
|
rol @0
|
||||||
|
brcc PC+2
|
||||||
|
ldi @0, 0b00000001
|
||||||
|
out PORTD, @0
|
||||||
|
.endmacro
|
||||||
|
|
||||||
145
main.asm
145
main.asm
@@ -7,28 +7,42 @@
|
|||||||
.include "./m328Pdef.inc"
|
.include "./m328Pdef.inc"
|
||||||
.list
|
.list
|
||||||
|
|
||||||
.def setter = R16
|
.def setter = R16
|
||||||
.def overflows = R17
|
.def overflows = R17
|
||||||
.def active_led = R18
|
.def active_led = R18
|
||||||
|
.def btn_status = R19
|
||||||
|
.def cur_direction = R20
|
||||||
|
|
||||||
|
.equ L2R = 0x01
|
||||||
|
.equ R2L = 0x04
|
||||||
|
.equ RBTN_PRESSED = 0b00000100
|
||||||
|
.equ LBTN_PRESSED = 0b00000001
|
||||||
|
.equ BOTH_PRESSED = 0b00000101
|
||||||
|
|
||||||
.org 0x0000
|
.org 0x0000
|
||||||
rjmp init
|
rjmp init
|
||||||
.org 0x0020
|
.org 0x0020
|
||||||
rjmp overflow_handler
|
rjmp overflow_handler
|
||||||
|
|
||||||
.macro check_led
|
.include "./macros.inc"
|
||||||
cpi active_led, @0
|
|
||||||
brne PC+3
|
|
||||||
ldi setter, (1<<@0)
|
|
||||||
out PORTD, setter
|
|
||||||
.endmacro
|
|
||||||
|
|
||||||
init:
|
init:
|
||||||
;--
|
;--
|
||||||
; Output Ports definieren
|
; Output Ports definieren
|
||||||
;----
|
;----
|
||||||
ser setter
|
ser setter
|
||||||
out DDRD, setter ; Alle LEDs standardmäßig aus
|
out DDRD, setter ; Alle PortD Pins als OUTPUT
|
||||||
|
|
||||||
|
;--
|
||||||
|
; Taster Pins definieren
|
||||||
|
;----
|
||||||
|
; ldi setter, 0b11111010
|
||||||
|
ser setter
|
||||||
|
out DDRB, setter ; PB0 und PB2 als Inputs definieren
|
||||||
|
ldi setter, 0b00000101
|
||||||
|
out PORTB, setter ; Interne Pullups aktivieren
|
||||||
|
clr setter
|
||||||
|
out PORTB, setter
|
||||||
|
|
||||||
;--
|
;--
|
||||||
; Timer/Counter konfigurieren
|
; Timer/Counter konfigurieren
|
||||||
@@ -42,37 +56,98 @@ init:
|
|||||||
;--
|
;--
|
||||||
; Definiere Startzustand
|
; Definiere Startzustand
|
||||||
;----
|
;----
|
||||||
ldi active_led, 0
|
|
||||||
ldi setter, 0
|
ldi setter, 0
|
||||||
out TCNT0, setter ; Timer/Counter explizit mit 0 initialisieren
|
out TCNT0, setter ; Timer/Counter explizit mit 0 initialisieren
|
||||||
|
ldi setter, 0b00000001
|
||||||
|
out PORTD, setter ; erste LED einschalten
|
||||||
|
clr btn_status ; initialer Status = kein Taster gedrückt
|
||||||
|
ldi cur_direction, L2R ; initial mit Laufrichtung von links nach rechts starten
|
||||||
|
|
||||||
main:
|
loop:
|
||||||
clr setter
|
|
||||||
out PORTD, setter ; Alle LEDs erstmal aus
|
|
||||||
|
|
||||||
;--
|
;--
|
||||||
; Schalte aktuell aktive LED gezielt wieder an
|
; Dreh Dräumchen und lass den Timer-Interrupt die Show leiten
|
||||||
;----
|
;----
|
||||||
check_led 0
|
rjmp loop
|
||||||
check_led 1
|
|
||||||
check_led 2
|
|
||||||
check_led 3
|
|
||||||
check_led 4
|
|
||||||
check_led 5
|
|
||||||
check_led 6
|
|
||||||
check_led 7
|
|
||||||
|
|
||||||
rjmp main
|
|
||||||
|
|
||||||
overflow_handler:
|
overflow_handler:
|
||||||
inc overflows
|
inc overflows
|
||||||
cpi overflows, 246 ; bei ~980 Überläufe/Sekunde entsprechen 245 Überläufe ca. 250ms
|
cpi overflows, 246 ; bei ~980 Überläufe/Sekunde entsprechen 245 Überläufe ca. 250ms
|
||||||
brne overflow_handler_exit ; early Return wenn Schwellenwert noch nicht erreicht
|
brne early_exit ; early Return wenn Schwellenwert noch nicht erreicht
|
||||||
clr overflows ; Überlaufzähler kontrolliert zurücksetzen
|
clr overflows ; Überlaufzähler kontrolliert zurücksetzen
|
||||||
inc active_led ; nächste LED aktivieren
|
in btn_status, PINB ; Aktuellen Button Zustand einlesen
|
||||||
cpi active_led, 8 ; prüfen ob LED-Zähler überzählt wurde
|
|
||||||
brne overflow_handler_exit ; early Return solange die aktive LED im erlaubten Bereich liegt
|
;--
|
||||||
ldi active_led, 0 ; LED-Zähler kontrolliert zurücksetzen
|
; Geh direkt zur Animationslogik wenn
|
||||||
overflow_handler_exit:
|
; kein Button gedrückt
|
||||||
reti
|
; oder
|
||||||
|
; wenn der gedrückt Button dem der aktuellen
|
||||||
|
; Animation entspricht
|
||||||
|
;----
|
||||||
|
cpi btn_status, 0
|
||||||
|
breq run_animation ; kein Button gedrückt
|
||||||
|
|
||||||
|
cp cur_direction, btn_status
|
||||||
|
breq run_animation ; Animation bildet aktuellen Button-Status bereit ab
|
||||||
|
;------
|
||||||
|
|
||||||
|
;--
|
||||||
|
; Setze definierten Start für den
|
||||||
|
; Laufrichtungswechsel
|
||||||
|
;----
|
||||||
|
check_left_btn:
|
||||||
|
cpi btn_status, LBTN_PRESSED
|
||||||
|
brne check_right_btn
|
||||||
|
|
||||||
|
; Linker Button wurde gedrückt
|
||||||
|
ldi cur_direction, L2R
|
||||||
|
in setter, PORTD
|
||||||
|
cpi setter, 0
|
||||||
|
brne run_animation
|
||||||
|
|
||||||
|
; Lauflicht wurde zuvor gestopped und muss neu initialisiert werden
|
||||||
|
ldi setter, 0b00000001
|
||||||
|
out PORTD, setter
|
||||||
|
rjmp run_animation
|
||||||
|
|
||||||
|
check_right_btn:
|
||||||
|
cpi btn_status, RBTN_PRESSED
|
||||||
|
brne check_both_btn
|
||||||
|
|
||||||
|
; Rechter Button wurde gedrückt
|
||||||
|
ldi cur_direction, R2L
|
||||||
|
in setter, PORTD
|
||||||
|
cpi setter, 0
|
||||||
|
brne run_animation
|
||||||
|
|
||||||
|
; Lauflicht wurde zuvor gestopped und muss neu initialisiert werden
|
||||||
|
ldi setter, 0b10000000
|
||||||
|
out PORTD, setter
|
||||||
|
rjmp run_animation
|
||||||
|
|
||||||
|
check_both_btn:
|
||||||
|
cpi btn_status, BOTH_PRESSED
|
||||||
|
brne run_animation
|
||||||
|
ldi setter, 0
|
||||||
|
out PORTD, setter
|
||||||
|
;------
|
||||||
|
|
||||||
|
run_animation:
|
||||||
|
cpi cur_direction, L2R
|
||||||
|
brne check_r2l
|
||||||
|
left_to_right active_led
|
||||||
|
reti
|
||||||
|
|
||||||
|
check_r2l:
|
||||||
|
cpi cur_direction, R2L
|
||||||
|
brne show_err_code
|
||||||
|
right_to_left active_led
|
||||||
|
reti
|
||||||
|
|
||||||
|
early_exit:
|
||||||
|
reti
|
||||||
|
|
||||||
|
show_err_code:
|
||||||
|
ldi setter, 0b00011000
|
||||||
|
out PORTD, setter
|
||||||
|
reti
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user