Unterkapitel zur HTML-Seitenverkleinerung


;; 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
Jetzt musst du das Ganze natürlich erstens mal müssten die geschweiften Klammern weg und durch runde ersetzt werden, weil es handelt sich um Tupel und nicht um Mengen, weil bei Mengen ist es egal in welcher Reihenfolge die stehen gut aber das ist jetzt egal. Jetzt müssen wir das Ganze für den atmega8 portieren und dazu müssen wir folgendes machen. Das erste Mal wir müssen Port D nehmen. Soweit wird es bisher dargestellt haben, geht es bis zur Zahl 252 und die ist mit 8 Bit gerade darstellbar. Unser Port B hat allerdings nur 6 Bit nach außen gut, dann machen wir jetzt folgendes das müssen wir erst mal richtig machen und dazu müssen wir die ganzen gelben Pins bei mir umtauschen, bevor wir das machen muss. Das Programm her, jetzt muss erst mal der SRAM deklariert werden.

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
Der Unterschied zwischen ldd und ld ist das eine haben Sie sozusagen mit eventuell predekrement und postinkrement auf jeden Fall indirekte Adressierung und beim ldd haben Sie dazu die Möglichkeit, aber nur für die Pointern, Y und Z oder X & Z. Jedenfalls nur für zwei von den drei Zeigern noch ein Verschiebewert einzurichten also mit Verschiebung

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.