Archiv verlassen und diese Seite im Standarddesign anzeigen : Lauflicht mit 8051
Hallo bin Neu Hier und hab ne Frage
und zwar versuche ich für mein 8051 Board mit 8 Dioden (P0.1, P0.2, ... usw.)ein Lauflicht in Assembler zu Programmieren mein Problem ist dabei dass es soo schnell läuft dass man es nicht als Lauflicht identifizieren kann.
Mein Code:
#include 8051.h
.org 0000h
main:
mov A, #00000001b
sjmp lauf
lauf:
rr A
mov P0, A
sjmp lauf
.end
nun meine Frage:
Was mache ich Falsch?
falsch ist nix. Baue eine Warteschleife ins Unterprogramm ein...dann kommen Deine Augen mit..:)
ch.ruder
18.01.2006, 16:57
Der 8051 wird "zu schnell" getaktet. Ich weiss nicht was für einen Quarz du dran hast aber du kannst mit Hilfe des Datenblattes ausrechnen wie lange er für die jeweiligen Befehle hat. Um den Prozi zu bremsen kannst du noch eine Warteschleife programmieren.
Und zwar springst du vom Hauptprogramm in ein Unterprogramm das vom 1 bis 100 zählt und bei jedem Zählschritt wird nochmals von 1 bis 255 gezählt. D.h. dass du in dem Unterprogramm 100 mal von 1 nach 255 zählst. Wenn du damit fertig bist springst du zurück in dein Hauptprogramm.
Die Zahlen sind nur Beispielwerte. Vieleicht muss du das auch auch 3 oder 4 mal ineinander verschachteln (nicht nur 2 mal wie im Beispiel).
Kann dir leider das nicht als Assembler Code geben. Hab ich schon zulange nicht mehr gemacht und die Befehle vergessen...
Gruss
Christian
wie Programmiere ich denn etwas dass von 100 nach null runterzählt
ch.ruder
18.01.2006, 17:07
Unterprogramm:
Setze "Variable" auf 0
Schlaufe Anfang
Addiere zu "Variable" 1 hinzu
Überprüfe ob die "Variable" = 100 ist wenn nein springe zu Schlaufe Anfang
Es gibt einen Befehl der das (letzte Zeile) kann aber eben...
Gruss
Christian
ch.ruder
18.01.2006, 17:11
Schau mal hier (http://www.mcls-modular.de/deutsch/helpsys/t_as2.htm) unter DJNZ (Sprung Befehle).
Gruss
Christian
www.erikbuchmann.de (http://www.erikbuchmann.de)
Codegenerator ...
Ich vergesse es immer wieder..... hier ( HIER ) findest Du uebrigens alles...
ich habs jetzt so gmacht und es funzt danke fr die Hilfe
#include 8051.h
.org 0000h
main:
mov A, #01111111b
sjmp lauf
lauf:
rr A
mov P0, A
loop1:
mov r1, #255
mov r2, #255
loop2:
djnz r1, loop2
djnz r2, loop2
sjmp lauf
.end
ch.ruder
18.01.2006, 17:48
Müstest du das nicht eher so machen?
#include 8051.h
;main:
.org 0000h
mov A, #01111111b
;sjmp lauf:
lauf:
rr A
mov P0, A
mov r2, #255
loop2:
mov r1, #255
loop1:
djnz r1, loop1
djnz r2, loop2
sjmp lauf
.end
ch.ruder
18.01.2006, 17:51
Übrigens kannst du aus der Zeitschleife auch ein "Unterprogramm" machen denn vielleicht brauchst du später einmal diese Zeitschleife mehrmals:
main:
[code]
call delay
[code]
call delay
[code]
jmp main
delay:
[warteschlaufe]
ret
Gruss
Christian
Peter Dannegger
18.01.2006, 17:56
Müstest du das nicht eher so machen?
Ne, das ist schon richtig so.
Wie Du es machst, würde nur den Zählbereich unnötig einschränken.
Den maximalen Zählbereich erhält man so:
delay:
mov r7, #0
mov r6, #0
delayloop:
djnz r6, delayloop
djnz r7, delayloop
Fürs Rechnen nehme ich von r7 abwärts, da man ja r0 und r1 als Pointer benötigen könnte.
Peter
ch.ruder
18.01.2006, 20:26
Kann man mit meiner Variante die Warteschlaufe nicht genauer einstellen? Bei eurem Code wird ja immer von 0 auf 0 runtergezählt. Bei meinem Code könnte man doch die Zeit der Warteschlaufe relativ genau errechnen.
Überseh ich da was?
Gruss
Christian
.....in R6 und R7 kannst Du jeden Wert reinschreiben.
Mit 0 hast Du eben maximale Zeit
ch.ruder
18.01.2006, 22:02
@ Edgar: Ja so hast du die maximal erreichbare Zeit, aber wenn du nun z.B. 150 in R6 schreibst, ist der nach "einem" Durchgang auf 0. Anschliessen zählst du immer von 0 wieder runter auf 0. Damit du R6 immer von 150 nach 0 zählen lassen kannst, musst du R6 immer wieder setzten, oder? Was denkst du?
Gruss
Christian
Hi Ruder,
genaues Timing erreicht man mit Hilfe von Timerinterrupts.
Die obige DJNZ Methode ist nur gut um grob Zeit zu verheizen,da nebenher ja nichts anderes abgearbeitet werden kann.:)
Ciao
ch.ruder
18.01.2006, 22:38
Ja da hast du recht. Was machst du wenn du mehr "Pausen" brauchst als du Interrupts hast?
Wenn man die Zeit nicht braucht kann man auch so nicht schlecht die Zeit "verbraten". Muss halt ein "bisschen" rechnen.:)
Gruss
Christian
ein Interrupt.... und mehrere Zaehler einsetzen.
Powered by vBulletin® Version 4.1.12 Copyright ©2012 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.