AVR C Inline Assembler Blink Programm

OP #3642722
Lesenswert?

Hallo!
Ich wollte mich mal mit inline-assembler beschäftigen und ein kleines 
blink-Programm schreiben.
Code:
1
#include <avr/io.h>
2

3
int main(void){
4
    
5
    asm volatile(//".equ F_CPU = 8000000  \n\t"                 
6
                 "ldi r16, 0xff         \n\t"
7
                 "out %[reg], r16       \n\t"
8
                 "loop:                 \n\t"
9
                 "  ldi r16, 0xff       \n\t"
10
                 "  out %[port], r16    \n\t"
11
                 "  rcall delay         \n\t"
12
                 "  ldi r16, 0x00       \n\t"
13
                 "  out %[port], r16    \n\t"
14
                 "  rcall delay         \n\t"
15
                 "  rjmp loop           \n\t" 
16
                 "delay:                \n\t"
17
                 "  ldi r19, 0x64       \n\t"
18
                 "  loop0:              \n\t" 
19
                 "    ldi r18, 0xff     \n\t"
20
                 "    loop1:            \n\t"
21
                 "      ldi r17, 0xff   \n\t"
22
                 "      loop2:          \n\t"
23
                 "        nop           \n\t"
24
                 "        dec r17       \n\t"
25
                 "        cpi r17, 0    \n\t"
26
                 "        brne loop2    \n\t"
27
                 "      dec r18         \n\t"                 
28
                 "      cpi r18, 0      \n\t"
29
                 "      brne loop1      \n\t"
30
                 "    dec r19           \n\t"
31
                 "    cpi r19, 0        \n\t"
32
                 "    brne loop0        \n\t"                
33
                 ::[reg] "I" (_SFR_IO_ADDR(DDRB)),
34
                 [port] "I" (_SFR_IO_ADDR(PORTB)));
35
}

Aber wieso Blinkt die LED nicht sondern leuchtet nur?
Gast #3642735
Lesenswert?

Wenn man ein Unterprogramm aufruft, muss man auch zurückkehren:
der Programmteil, der mit rcall, call oder icall aufgerufen wird, muss 
(normalerweise) mit ret (return) abgeschlossen werden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren