doppelte Endlosschleife?

Gast #936942
Lesenswert?
• ▲
▼
Hallo,

Ich schau mir eben das AVR-Tutorial an und habe ein Programm getestet, 
das beim drücken des ersten Tasters die 2., 4., 6. und 8. LED leuchten 
lässt.
Nun wollte ich es etwas modifizieren, so dass das Programm danach noch 
weiter läuft, und man, wenn man nun den Taster 2 drückt, die 3. LED 
leuchtet.

Warum funktioniert das folgende Programm nicht?


.include "m8515def.inc"

ldi r16, 0b11111111
out DDRB, r16

ldi r16, 0b00000000
out DDRD, r16

ldi r16, 0xFF
out PORTB, r16

loop: sbic PIND, 0
rjmp loop

cbi PORTB, 3
cbi PORTB, 1
cbi PORTB, 5
cbi PORTB, 7

loop: sbic PIND, 1
rjmp loop

cbi PORTB, 4

ende: rjmp ende
Gast #937025
Lesenswert?
• ▲
▼
Die loop1 und loop2 sind keine Endlosschleifen, sondern Warteschleifen.
Die warten, bis ein Taster gedrückt ist.....
1
.include "m8515def.inc"
2

3
ldi r16, 0b11111111
4
out DDRB, r16
5

6
ldi r16, 0b00000000
7
out DDRD, r16
8

9
ldi r16, 0xFF
10
out PORTB, r16
11

12
loop1: sbic PIND, 0
13
rjmp loop1
14

15
cbi PORTB, 3
16
cbi PORTB, 1
17
cbi PORTB, 5
18
cbi PORTB, 7
19

20
loop2: sbic PIND, 1
21
rjmp loop2
22

23
ldi r16, 0xFF    ; erst mal alle led aus
24
out PORTB, r16
25

26
cbi PORTB, 4     ; dann die led 3 an
27

28
ende: rjmp ende
#937053
Lesenswert?
• ▲
▼
für die loops (warteschleifen) musst du eine abbruchbedingung einbauen.
im moment hast du insgesamt drei endlosschleifen (loop1, loop2, ende), 
wobei es schon aus der ersten kein "entkommen" gibt.

als tipp nenne ich die sbis/sbic (bzw. sbrs/sbrc) befehle. wenn du diese 
passend in die warteschleifen einbaust, kannst du diese ganz einfach 
beenden...

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