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
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
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
du hast zwei mal das gleiche Label, das geht nicht (sollte mindestens eine Warnung geben?!)
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 |
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
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...
>Nun schafft er eine Endlosschleife in 10 Sekunden... ;-))
Das geht aber nur mit der undokumentierten H7P3RSP33D Fuse, oder ;-)
>Nun schafft er eine Endlosschleife in 10 Sekunden... ;-))
Ich hab' mein PC übertaktet... Der wartet jetzt viel schneller auf
Tastatureingaben.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.