Skip to content
Snippets Groups Projects
Commit 297595e3 authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Beispiel: Arduino in Assembler programmieren, 31.5.2023

parent 55cf3b97
Branches
No related tags found
No related merge requests found
extern "C" { extern void asm_main (void); }
void setup (void)
{
asm_main ();
}
void loop (void)
{
/* empty */
}
.text ; "Dies ist ausführbarer Code."
.global asm_main ; Label nach außen sichtbar machen
.type asm_main, @function
asm_main: ; Einsprungpunkt: Hier geht's los.
ldi r24,0xff ; Alle 8 Anschlüsse auf "Output" schalten
out 0x0a,r24 ; In DDRD schreiben (Port Nr. 0x0a, Speicherzelle 0x2a)
loop:
ldi r24,0x00 ; LED ausschalten (angeschlossen an Ausgang Nr. 2)
out 0x0b,r24 ; In PORTD schreiben (Port Nr. 0x0b, Speicherzelle 0x2b)
ldi r26,lo8(7999999) ; Warteschleife: von 7999999 rückwärts bis 0 zählen
ldi r22,hi8(7999999) ; Die 24-Bit-Zahl 7999999 in 3 8-Bit-Register
ldi r23,hlo8(7999999)
1:
subi r26,1 ; Subtrahiere 1 von den untersten 8 Bit
sbci r22,0 ; Subtrahiere 0 von den mittleren 8 Bit, berücksichtige Übertrag (carry)
sbci r23,0 ; Subtrahiere 0 von den mittleren 8 Bit, berücksichtige Übertrag (carry)
brne 1b ; branch if not equal (= not zero): bedingter Sprung zu Label 1
rjmp .
nop
ldi r24,0x04 ; LED einschalten (angeschlossen an Ausgang Nr. 2)
out 0x0b,r24 ; In PORTD schreiben (Port Nr. 0x0b, Speicherzelle 0x2b)
ldi r26,lo8(7999999) ; 1 Taktzyklus
ldi r22,hi8(7999999) ; 1 Taktzyklus
ldi r23,hlo8(7999999) ; 1 Taktzyklus --> 3 Taktzyklen vor der Schleife
1:
subi r26,1 ; 1 Taktzyklus
sbci r22,0 ; 1 Taktzyklus
sbci r23,0 ; 1 Taktzyklus
brne 1b ; 2 Taktzyklen, wenn er springt, 1 Takzyklus, wenn er nicht springt
; --> 5 Taktzyklen pro Schleifendurchlauf
rjmp . ; 2 Taktzyklen lang nichts machen
nop ; 1 Taktzyklus lang nichts machen
; --> zusätzlich zu der Schleife weitere 3 + 3 = 6 Taktzyklen warten
; --> Die Schleife wird sozusagen 8000000 mal durchlaufen
; (7999999 Durchläufe + Extra-Taktzyklen)
; und verbraucht dabei jedesmal 5 Taktzyklen.
; Bei 16000000 Taktzyklen pro Sekunde sind das insgesamt 2.5 Sekunden.
jmp loop
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment