Forum: Mikrocontroller und Digitale Elektronik AVR C Inline Assembler Blink Programm


von Martin F. (martin_f70)


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?

von der alte Hanns (Gast)


Lesenswert?

Und wo ist das 'ret' vom 'delay'?

von Martin F. (martin_f70)


Lesenswert?

ret? Sorry, kenne mich Assembler nicht so perfekt aus, wollte es damit 
jetzt auch üben, aber was ist ret?

von Martin F. (martin_f70)


Lesenswert?

EDIT!!
DAS RETURN !!!

NAtürlich, sry^^

von der alte Hanns (Gast)


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.

von der alte Hanns (Gast)


Lesenswert?

Noch ein Tipp: in der innersten Schleife macht sich das 'cpi' noch ganz 
hübsch, soll heißen, trägt zur Zeitkonstante bei, ansonsten aber ist es 
unnütz, 'dec' setzt das Z-Flag bereits.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.