Compare commits

..

20 Commits

Author SHA1 Message Date
4da8b3d86a Definiere weitere Übungsziele 2025-06-21 13:28:06 +02:00
7d19efa11f Setze weitere Übungsziele mit Display Komponenten 2025-06-20 20:29:14 +02:00
1c9439f76d Setze weitere Übungsziele mit Encoder Komponente 2025-06-20 20:27:51 +02:00
eecdddd8fe Markiere erreichtes Stage-4 Ziel als erreicht 2025-06-20 20:23:47 +02:00
89cb9a3464 Füge Funktion zum Anhalten hinzu 2025-06-20 20:20:23 +02:00
204e94d613 Wechsel Laufrichtung ab der aktuellen Stelle 2025-06-20 19:50:04 +02:00
a30bf50f67 Verwende das Arduino-Nano Board im Build-Skript 2025-06-20 19:48:52 +02:00
0d6d8dbd2a Schließe Übungsziele der Stage 3 ab 2025-06-04 14:07:44 +02:00
bb92ec7bd5 Speichere Zwischenstand 2025-06-01 19:46:34 +02:00
c58acf3524 Definiere weiteres Ziel 2025-05-31 23:31:44 +02:00
2c239dd8e4 Schließe Übungsziel Stage 2, Punkt 2 ab 2025-05-31 23:23:37 +02:00
74be66bfea Lagere Macros in eigene Datei aus 2025-05-31 23:06:44 +02:00
a4b3a1f2ad Stelle Lauflicht auf Rotate-Mechanismus um 2025-05-31 23:01:47 +02:00
24171244ff Schließe Etappenziel Stage 2, Punkt 1 ab 2025-05-31 21:43:00 +02:00
b0a8135837 Entferne falsch benanntes Shell-Skript 2025-05-31 19:15:58 +02:00
4f24ab5fd6 Benenne Shell-Skript um 2025-05-31 16:45:54 +02:00
6ddcf70b8f Halte Übungsziele als Checkliste fest 2025-05-31 16:42:32 +02:00
21ea419fd6 Flashe nur wenn Kompilierung erfolgreich war 2025-05-31 16:41:31 +02:00
1bc94159f9 Lege Hauptdatei mit allen LEDs HIGH an 2025-05-31 13:51:05 +02:00
7f3d03d3e2 Erstelle Build und Flash Skript 2025-05-31 13:49:39 +02:00
4 changed files with 229 additions and 0 deletions

View File

@@ -1,2 +1,51 @@
# 01_atmega328_lauflicht # 01_atmega328_lauflicht
## Stage 1 - Hello World, Assembler:
- [x] Kompilieren und Flashen via Shell-Skript
- [x] LED Reihe via Assembler aufleuchten lassen
## Stage 2 - Timer Integration:
- [x] Hardcodiertes Lauflicht L2R Richtung
- [x] Hardcodiertes Lauflicht R2L Richtung
## Stage 3 - Statuswechsel via Hardware Interaktion:
- [x] Richtungswechsel via Taster Klick
- [x] Animation läuft unbeirrt weiter bei Taster-Klick
- [x] Wechsel von L2R auf R2L bei Taster-Links-Klick
- [x] Wechsel von R2L auf L2R bei Taster-Rechts-Klick
## Stage 4 - Erweiterte Status Abhandlung (Anzahl Status > 2):
- [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

5
build_and_flash Executable file
View File

@@ -0,0 +1,5 @@
#!/bin/sh
# Build & Flash
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
View 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

153
main.asm Normal file
View File

@@ -0,0 +1,153 @@
;==========================
; Author: Marcel Schirmer
; Date: 31.05.2025
;==========================
.nolist
.include "./m328Pdef.inc"
.list
.def setter = R16
.def overflows = R17
.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
rjmp init
.org 0x0020
rjmp overflow_handler
.include "./macros.inc"
init:
;--
; Output Ports definieren
;----
ser setter
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
;----
ldi setter, 0b00000011
out TCCR0B, setter ; CLK/1024 ergibt 250.000 Timer-Ticks/Sekunde
ldi setter, 0b00000001
sts TIMSK0, setter ; Timer-Interupt aktivieren
sei ; globale Interrups aktivieren
;--
; Definiere Startzustand
;----
ldi setter, 0
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
loop:
;--
; Dreh Dräumchen und lass den Timer-Interrupt die Show leiten
;----
rjmp loop
overflow_handler:
inc overflows
cpi overflows, 246 ; bei ~980 Überläufe/Sekunde entsprechen 245 Überläufe ca. 250ms
brne early_exit ; early Return wenn Schwellenwert noch nicht erreicht
clr overflows ; Überlaufzähler kontrolliert zurücksetzen
in btn_status, PINB ; Aktuellen Button Zustand einlesen
;--
; Geh direkt zur Animationslogik wenn
; kein Button gedrückt
; 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