;; jetzt bin ich so weit, der naechste teil kommt gleich, meine mutti will irgendetwas, raucherpause ;; (C) David Vajda ;; 2025-03-10 ;; Pascal LED out .include "m8def.inc" .equ PASCAL_HEIGHT = 11 .equ PASCAL_WIDTH = 2*PASCAL_HEIGHT+1 .equ PASC_FRST = ((PASCAL_WIDTH>>1)+1) .def COL_COUNTER = r17 .def ROW_COUNTER = r18 ldi r16, HIGH (RAMEND) out SPH, r16 ldi r16, LOW (RAMEND) out SPL, r16 ldi r16, 0xff out DDRD, r16 rcall pasc_run main_loop: rcall pasc_echo rjmp main_loop sleep: push r16 push r17 ldi r16, 0xff sleep_loop1: ldi r17, 0xff sleep_loop2: dec r17 brne sleep_loop2 dec r16 brne sleep_loop1 pop r17 pop r16 ret pasc_init0: ldi r19, 0x00 ldi r16, HIGH (pascal) mov XH, r16 ldi r16, LOW (pascal) mov XL, r16 ldi COL_COUNTER, 0x00 pasc_init0_loop01: ldi ROW_COUNTER, 0x00 pasc_init1_loop02: st X+, r19 inc ROW_COUNTER cpi ROW_COUNTER, PASCAL_HEIGHT brne pasc_init1_loop02 inc COL_COUNTER cpi COL_COUNTER, PASCAL_WIDTH brne pasc_init0_loop01 ldi r16, HIGH (pascal) mov YH, r16 ldi r16, LOW (pascal) mov YL, r16 ldi r19, 0x01 std Y+PASC_FRST, r19 ret pasc_echo: ldi r21, HIGH (pascal+PASCAL_WIDTH*PASCAL_HEIGHT) ldi r20, LOW (pascal+PASCAL_WIDTH*PASCAL_HEIGHT) ldi r16, HIGH (pascal) mov XH, r16 ldi r16, LOW (pascal) mov XL, r16 pasc_echo_loop01: ld r16, X+ cpi r16, 0x00 breq pasc_echo_no_out out PORTD, r16 rcall sleep pasc_echo_no_out: mov r23, XH mov r22, XL cp r20, r22 brge pasc_echo_loop01_out rjmp pasc_echo_loop01 pasc_echo_loop01_out: cp r21, r23 brge pasc_echo_loop02_out rjmp pasc_echo_loop01 pasc_echo_loop02_out: ret pasc_run: .def i = r18 .def j = r19 ldi r21, HIGH (pascal + PASCAL_HEIGHT * PASCAL_WIDTH) ldi r20, LOW (pascal + PASCAL_HEIGHT * PASCAL_WIDTH) ldi XH, HIGH (pascal) ldi XL, LOW (pascal) ldi r16, 0x00 pasc_run_loop01: ldi YH, HIGH (pascal) ldi YL, LOW (pascal) st X+, r16 mov r23, XH mov r22, XL cp r20, r22 brge pasc_run_loop01_out rjmp pasc_run_loop01 pasc_run_loop01_out: cp r21, r23 brge pasc_echo_loop02_out rjmp pasc_echo_loop01 pasc_run_loop02_out: ret .dseg pascal: .byte PASCAL_HEIGHT*PASCAL_WIDTH |
;; Damit sind wir der Sache schon mal ein Stück näher die Ausgabe funktioniert prima und obwohl ich nicht cpiw verwendet habe also vergleichen. Mit Worten funktioniert es, was ich verwendet habe. Das sehe ich, weil die Ausgabe tut, was ich nicht gemacht habe. Bisher ich habe den Unterprogramm Aufruf für das pascalsche Dreieck gemacht. Ich hab jetzt einfach Werte eingesetzt, um zu sehen, ob die Ausgabe funktioniert und es tut sie hier der Quelltext und im nächsten Schritt kommt sozusagen das befüllen des Speichers mit mit dem Pascal Dreieck ;; (C) David Vajda ;; 2025-03-10 ;; Pascal LED out .include "m8def.inc" .equ PASCAL_HEIGHT = 11 .equ PASCAL_WIDTH = 2*PASCAL_HEIGHT+1 .equ PASC_FRST = ((PASCAL_WIDTH>>1)+1) .def COL_COUNTER = r17 .def ROW_COUNTER = r18 ldi r16, HIGH (RAMEND) out SPH, r16 ldi r16, LOW (RAMEND) out SPL, r16 ldi r16, 0xff out DDRD, r16 rcall pasc_run main_loop: rcall pasc_echo rjmp main_loop sleep: push r16 push r17 ldi r16, 0xff sleep_loop1: ldi r17, 0xff sleep_loop2: dec r17 brne sleep_loop2 dec r16 brne sleep_loop1 pop r17 pop r16 ret pasc_init0: ldi r19, 0x00 ldi r16, HIGH (pascal) mov XH, r16 ldi r16, LOW (pascal) mov XL, r16 ldi COL_COUNTER, 0x00 pasc_init0_loop01: ldi ROW_COUNTER, 0x00 pasc_init1_loop02: st X+, r19 inc ROW_COUNTER cpi ROW_COUNTER, PASCAL_HEIGHT brne pasc_init1_loop02 inc COL_COUNTER cpi COL_COUNTER, PASCAL_WIDTH brne pasc_init0_loop01 ldi r16, HIGH (pascal) mov YH, r16 ldi r16, LOW (pascal) mov YL, r16 ldi r19, 0x01 std Y+PASC_FRST, r19 ret pasc_echo: ldi r21, HIGH (pascal+PASCAL_WIDTH*PASCAL_HEIGHT) ldi r20, LOW (pascal+PASCAL_WIDTH*PASCAL_HEIGHT) ldi r16, HIGH (pascal) mov XH, r16 ldi r16, LOW (pascal) mov XL, r16 pasc_echo_loop01: ld r16, X+ cpi r16, 0x00 breq pasc_echo_no_out out PORTD, r16 rcall sleep pasc_echo_no_out: mov r23, XH mov r22, XL cp r20, r22 brge pasc_echo_loop01_out rjmp pasc_echo_loop01 pasc_echo_loop01_out: cp r21, r23 brge pasc_echo_loop02_out rjmp pasc_echo_loop01 pasc_echo_loop02_out: ret pasc_run: ldi r16, HIGH (pascal) mov XH, r16 ldi r16, LOW (pascal) mov XL, r16 ldi r16, 14 st X+, r16 ldi r16, 5 st X+, r16 ldi r16, 7 st X+, r16 ldi r16, 2 st X+, r16 ldi r16, 0 st X+, r16 ldi r16, 0 st X+, r16 ldi r16, 0 st X+, r16 ldi r16, 2 st X+, r16 ldi r16, 4 st X+, r16 ldi r16, 8 st X+, r16 ldi r16, 16 st X+, r16 ldi r16, 32 st X+, r16 ret .dseg pascal: .byte PASCAL_HEIGHT*PASCAL_WIDTH |
https://www.mikrocontroller.net/articles/AVR-Tutorial:_SRAM
so weit ich mich richtig erinnere, benutzen Sie beim sram beim atmega8 LDS und sds
Sie haben Lade und Speicherinstruktion Sie haben daneben noch den Register Register Transfer d.h. Mov wie Move. Laden heißt von Speichern nach Register und speichern heißt von Register nach Speicher. Sie haben folgende Lade und Speicherbefehle.
ld, ldd, ldi st, std |
Das i an ldi dient dazu Direktwerte, also immidiate Werte in ein Register zu laden das gibt's beim Speicher nicht
Des LDS und STS sind, soweit ich weiß für den SRAM gedacht, das muss ich kurz nachgucken das benutze ich normalerweise nicht
Ja, da hatte ich wohl recht laut diesen Skript gut dann muss ich jetzt erst mal das sram deklarieren und ich mach das übliche Gerüst außen drum rum. D.h. zum Beispiel dass die LEDs eben ausgegeben werden. Das ist ne gewisse Verzögerung gibt ich mach's jetzt wieder ohne Zeit Unterbrechung also normal mit Zählschleife. Dann ist es schon mal da und darein kommt dann unser pascalsches Dreieck.