Forum: Mikrocontroller und Digitale Elektronik doppelte Endlosschleife?


von Aaron (Gast)


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

von Michael U. (amiga)


Lesenswert?

Hallo,

na welche Fehlermeldung bekommst Du denn wohl vom Assembler? :)

PS: Dein Programm hat nur eine Endlosschleife:
ende: rjmp ende

Wäre sonst ja auch ziemlich sinnlos.

Gruß aus Berlin
Michael

von Aaron (Gast)


Lesenswert?

doppeltes loop, schon klar

aber wie soll ich es sonst machen? Kann mir nicht vorstellen, dass man 
in einem assemblerprogramm nur eine endlosschleife verwenden kann

von Vorname N. (logout-name)


Lesenswert?

du hast zwei mal das gleiche Label, das geht nicht (sollte mindestens 
eine Warnung geben?!)

von Vorname N. (logout-name)


Lesenswert?

Zuuuuuu spääät

von lkmiller (Gast)


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

von Michael U. (amiga)


Lesenswert?

Hallo,

naja, ich hatte es nur nicht korrigiert, weil ich so dacht, er bemerkt 
die Fehlermeldung und tauft eins der Label selbst um...

PS: ich habe meinen AVR jetzt übertaktet.
Nun schafft er eine Endlosschleife in 10 Sekunden... ;-))

Gruß aus Berlin
Michael

von Sepp (Gast)


Lesenswert?

Dichtmaster!

von Daniel F. (df311)


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...

von Vorname N. (logout-name)


Lesenswert?

@  Daniel F. (df311): Lesen ist nicht jedermanns Stärke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>Nun schafft er eine Endlosschleife in 10 Sekunden... ;-))

Das geht aber nur mit der undokumentierten H7P3RSP33D Fuse, oder ;-)

von mitwisser (Gast)


Lesenswert?

>Nun schafft er eine Endlosschleife in 10 Sekunden... ;-))

Ich hab' mein PC übertaktet... Der wartet jetzt viel schneller auf 
Tastatureingaben.

von Aaron (Gast)


Lesenswert?

Danke lkmiller. :-)

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.