Schleife

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 29 11 2024  09:43:05      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( 1 | 2 Nächste Seite )      


Autor
Schleife

    







BID = 34354

mfd2004

Neu hier



Beiträge: 42
Wohnort: Duderstadt
ICQ Status  
 

  


Moin!
Ich brauche mal wieder eure Hilfe! :)
Es geht um ne Schleife. In einem Buch, wo ich mir versuche Assempler beizubringen habe ich folgende befehle entnehmen können:

clr a
mov r0, #60h
mov r2, #16
Schleife:
mov @r0, a
inc r0
djnz r2, Schleife

CLR A ist glaub ich das 0 setzten des Akkumulators.
mov r0, #60h ist das speichern der Zahl 60 (hex) in register0
mov r2, #16 ist das schreiben der zahl 16 (dez) in register2
Die Variable Schleife setzt quasi einfach nur ein "Lesezeichen" so, mein verständniss problem ist hier auch mov @r0, a ... was heißt das denn? wofür steht das @??
inc setzt den wert in register0 immer um 1 weiter, wenn der prozess mov @r0,a durch ist ..... das dauert dann einen maschinentakt. glob i doch! :-)
djnz r2, schleife das heißt, wenn r2 0 ist, springt der Mc zur schleife!?!
Waren diese aussagen halbwegs richtig?
Ach ja, wie ist das eigentlich .... arbeitet der Mc alles nacheinander ab? oder liest er erstmal alle zeilen? ich frage wegen der variablen oder labels, die man setzt kann ....
Das macht mir alles irgendwie Kopfschmerzen!!! Es ist nicht einfach sich selbst was versuchen beizubringen!!!!!!
Wäre echt nett, wenn mir hier wer helfen könnte!!!!

Vielen Dank!
mfd2004

BID = 34584

dabfreaks

Gerade angekommen


Beiträge: 2
Wohnort: Stuttgart

 

  

Also Das @ ist eine Zeichen um den Wert in R0 zu dereferenzieren. Also es ist das gleiche wie ein Zeiger in einer Hoch sprache. Anstelle von
mov #BBh, R0
der ja den Wert in das Register schreibt
schreibt der Befehl
mov #BBh, @R0
an die Speicherstelle auf die R0 zeigt,
wenn also zum Beispiel in R0 60 steht
dann schreibt er #BBh nicht in das Register R0 sondern an die Stelle im Speicher (meistens der RAM) der die Adresse 60 hat.

Zeiger sind die schönsten Dinge der Welt, was wären wir doch ohne sie.

MfG von Padde (one of dabfreaks)
und er springt so lange bis R2 gleich Null ist
DJNZ = decrement Jump if not Zero
Also ziehen von r2 eins ab und springe wenn r2 noch nicht null ist zu Schleife!

BID = 34604

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

dabfreaks hat das alles korrekt beschrieben.
Das Programm initialisiert den Speicherbereich 60h...6Fh mit 0.

Wenn es fertig ist, enthält r0 den Wert 70h und r2 ist 0.




Zitat :
Ach ja, wie ist das eigentlich .... arbeitet der Mc alles nacheinander ab? oder liest er erstmal alle zeilen? ich frage wegen der variablen oder labels, die man setzt kann ....


Er holt, vom Programmzähler gesteuert, jede Instruktion einzeln aus dem Programmspeicher und arbeitet sie dann sofort ab.
Normalerweise haben µPs keine Ahnung davon, was vor und hinter dem aktuellen Befehl steht.

Das können erst größere Chips wie etwa Pentiums. Die holen sich schonmal mehrere Befehle auf Vorrat, oder sie lesen für eine Schleife wie oben den Code nur einmal aus dem Programmspeicher.

_________________
Haftungsausschluß:

Bei obigem Beitrag handelt es sich um meine private Meinung.

Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.

Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

[ Diese Nachricht wurde geändert von: perl am 10 Okt 2003  4:03 ]

BID = 34643

mfd2004

Neu hier



Beiträge: 42
Wohnort: Duderstadt
ICQ Status  

Es beschämt mich jetzt ehrlich das sagen zu müssen .... aber ich habe das immer noch nicht so wirklich verstanden
Ist das nicht so, bei dem mov-befehl: mov [Ziel],[Quelle] ?!?!? Denn du hast

Zitat :

mov #BBh, R0
der ja den Wert in das Register schreibt

geschrieben. Dann würde das, was ich bis jetzt gelernt habe nicht stimmen .... denn man kann dohc kein register in eine Zahl schreiben!?!? Oder irre ich!?
Das mit dem @ hab ihc gut verstanden!
(obwohl ich bis jetzt noch keine Zeiger hatte ..... )
Mein Problem liegt im moment noch darin, das ich den ganzen Zusammenhang nicht rausbekomme.
Z.B.:
Wieso setzt man den Akkumulator auf 0??

Zitat :

Also ziehen von r2 eins ab und springe wenn r2 noch nicht null ist zu Schleife

Wieso zieht er von r2 was ab? Der Befehl heißt doch eindeutig incR0 und nicht incR2!?

Danke schonmal ...

BID = 34645

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Zitat :
denn man kann dohc kein register in eine Zahl schreiben!?!? Oder irre ich!?


Du hast Recht.
Leider unterscheidet sich die Assemblersyntax bei ein einigen Firmen und dann steht auch schon mal das Ziel rechts vom Komma.




Zitat :
Wieso setzt man den Akkumulator auf 0??

CLR A ; in Deinem Code. kannst auch XOR A,A nehmem wenn Dein µ das kann.
wieso: Dieser Wert wird anschließend in die 16 Speicherstellen geschrieben.


Zitat :
Wieso zieht er von r2 was ab? Der Befehl heißt doch eindeutig incR0 und nicht incR2!?


Da liegt ein Mißverständnis vor.
INC R0 ; bewegt den Zeiger zur nächsten Speicherstelle und tut sonst garnix.

DJNZ R2,Schleife ist der nächste Befehl, der mehreres beeinhalte:
1) Decrementiere R2 ( zu Deutsch Eins abziehen)
2) Prüfe ob R2 gleich Null.
3) Jump if Not Zero : Falls R2 nicht gleich Null, dann springe zu Schleife
4) Falls R2 gleich Null, dann mach nix besonderes sondern mit der nächsten Instruktion weiter.


_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 34653

mfd2004

Neu hier



Beiträge: 42
Wohnort: Duderstadt
ICQ Status  

Danke für die Antwort!
Ich will letztenendlich ein Lauflicht bauen .... Das Lauflicht soll 10 LEDs haben. Es soll von einem uC angesteuert werden (habe nur einen AT89C52) Es sollen aber kein einfaches Lauflicht sein. Sondern die lichter sollen nachziehen/nachdimmen. So das man einen "Wurm" hat, der hinten immer dunkler wird .... Wenn eine LED leuchtet, sollen zwei LEDs (die beiden, die vor der jetzt leuchtenden LED geleuchtet haben) unterschiedlich abdimmen.
Ich habe mir das so als kleines Projekt ausgedacht, um ein wenig mit uClern zu machen. Das dimmen ist mein problem! Ich habe eine kl. schaltung entworfen, wo ich je nach dam welche LED leuchtet der uC Kondensatoren sich auflädt und dann über ein Transistor umgepolt wird, so das er sich über die LED wieder entlädt.
Kann ich das auch ohne Elkos machen? Quasi sagen, das man eine bestimmte frequenz aus dem uC rausgibt, das es so aussieht, als dimme die LED ab?
Das wäre nämlcih fein! Es würde zumindest die Schaltung verkleinern!
Naja, die Schleife brauche ich ja erstmal um überhaupt ein Lauflicht aufzubauen!

Vielen Danke schonmal!!!!!
mfd2004

BID = 34656

mfd2004

Neu hier



Beiträge: 42
Wohnort: Duderstadt
ICQ Status  

Ach so ... hätte ich beinahe vergessen ....
Wie kommt denn R2 auf 0??? Ich verändere doch in keiner Weise irgendwas an R2? R2 hat den Wert 16 und der bleibt doch .... !? Was ich ständig verringere ist R0.
Hat das vielleicht damit was zu tun, das R0 irgendwann auf 10h (16) kommt und dann irgendwas mit R2 passiert? Aber die beiden Register haben doch gar nichts miteinander zu tun!?!?!?
Bitte erklät mir das noch mal ....
DANKE!!!!!!!!!!!!!!!!!

mfd2004

BID = 34657

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Zitat :
Kann ich das auch ohne Elkos machen? Quasi sagen, das man eine bestimmte frequenz aus dem uC rausgibt, das es so aussieht, als dimme die LED ab?


Selbstverständlich. Und das wird in der Praxis auch gemacht, da man dabei Teile sparen kann und u.U. auch elektrische Leistung sparen kann.
Wenn man schonmal einen µP eingebaut hat, wird man versuchen ihn auch auszulasten und verlagert viele Hardwarefunktionen in die Software.
Du brauchst Die LEDs nur schnell genug, z.B. mit 100Hz oder mehr ein- und ausschalten. Über das Tastverhältnis kannsz Du die Helligkeit steuern.
Aber das ist keine Anfängerübung mehr. Deshalb bau erst einmal dein Lauflicht in der einfachsten Version, damit Du etwas Übung in der Programmierung und im Debuggen bekommst.
Wenn Du Dich dann fit genug fühlst, kanns Du ja später noch das Nachleuchten programmieren.
Das Schöne an der Softwarelösung ist, daß Du dazu Deine Hardware nicht ändern brauchst.



P.S:

Zitat :
Wie kommt denn R2 auf 0??? Ich verändere doch in keiner Weise irgendwas an R2? R2 hat den Wert 16 und der bleibt doch .... !?

Der DJNZ Befehl verringert R2 bei jeder Ausführung um 1. Am Schluß ist R2 dann 0 und die Schleife ist beendet.

_________________
Haftungsausschluß:

Bei obigem Beitrag handelt es sich um meine private Meinung.

Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.

Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

[ Diese Nachricht wurde geändert von: perl am 10 Okt 2003 16:47 ]

BID = 34667

mfd2004

Neu hier



Beiträge: 42
Wohnort: Duderstadt
ICQ Status  

Ey!!! GEIL!!!!!!!
Ich habs jetzt verstanden! Das war der Schlüssel zum Verständniss!!!!!!
Das Register 0 ist letzenendlich nur für die Zeit zuständig. Da man ja sonst nur in 17 Maschienenzüklen fertig wäre und das nicht unbedingt merkbar wäre ....
Cool! Jetzt macht das alles Sinn!!!!!!! Wunderbar!!!!

Das ist auch gut, das man das alles nur im uC machen kann!!!! Hab mir nämlcih shcon ne Schaltung aufgebaut, wo man das mit Elkos macht, die sich immer über die Led entladen .... ist natürlich komplex und umständlich! Aber nach den Befehlen frage ich dich erst, wenn ich mit dem Lauflicht fertig bin (das kann dauern, da ich kaum zeit habe) Denke, das du recht hast!!! Schritt für schritt ....
uCer sind doch ne wunderbare sache!!!!!!
VIELEN DANK, das du mir die Augen geöffnet hast!!!!!!
mfd2004

BID = 34675

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Zitat :
as Register 0 ist letzenendlich nur für die Zeit zuständig.

Ich glaube jetzt hast Du Dich verschreiben.
Im Beispiel regelte R2 die Anzahl der zeitfressenden Durchläufe.

_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 34704

mfd2004

Neu hier



Beiträge: 42
Wohnort: Duderstadt
ICQ Status  

Hm ... ich glaube nicht, das ich mich verschrieben habe ....! Ich meinte eigentlich, das R2 als zähler verwendet wird. Richtig. Er zählt bis 0 und lässt dann die nächste Aktion durchführen. Man könnte quasi vom schleifentechnischen die ganze Sache um R0 weglassen. Die Schleife würde zwar funktionieren, aber man würde es nicht äußerlich merken. Quasi, die Zeit ist so kurz, das man nicht merkt, das eine Schleife eingebunden war. Man berechnet die Zeit dann einfach über den Maschinentackt. Dann zählt man die einzelnen Operationen und deren Dauer und so käme man dann zur länge der Dauer. Quasi, wenn ich eine Led 3sec leuchten lassen will kann ich das so machen ....
Das ist so ein teil meines neu erworbenen Wissensstandes! Kann sein, das da was falsch ist.... dazu fehlt mir die Erfahrung ..... ! Bitte berichtige mich!!!!!!! Will ja schließlig lernen! Letzenenlich wollte ich so meine Abstände des Lauflichts durchsetzen. Fällt dir eine bessere Idee ein? Oder jemand anderes? Das ist doch quasi ein Timer beim uC oder?

Vielen Dank
mfd2004

BID = 34712

mfd2004

Neu hier



Beiträge: 42
Wohnort: Duderstadt
ICQ Status  

Habe das Lauflicht gerade mal versucht zu schreiben!

Bitte berichtigt mich,wenn ich fehler gemacht habe oder wenn ihr verbesserungen habt, denn ich finde, um nur ein paar LEDs zu betreiben ist das viel text.
Man hätte auf die ganzen Dinge wie NSignal, NSignal verzichten können .... aber ich denke, wenn ich später das ganze irgendwie abdimmen will ... wird das sicherlich notwendig sein, bei jedem befehl auch alle ausgänge zu beschreiben. Oder nicht?
Ich habe da noch ne frage ....
Die Variablen wie z.B LED1 oder NSignal kann man doch als Lesezeichen sehen!? oder?

Danke
mfd2004


Hochgeladene Datei : Lauflicht.txt

BID = 34744

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

Ob Du Fehler gemacht hast, kann ich auf die schnelle nicht beurteilen, zumal ich diesen µP nicht genau kenne und programmiere.
Ich glaube aber, daß Du mindestens vergessen hast die Datenrichtungsregister zu initialisieren.
Meist sind nch dem Einschalten alle Pins Eingänge und damit wirst Du keine LED anzünden können.


Sonst ist das schon ein bischen umständlich geschrieben.
Schau Dir mal die Rotier- und Schiebe- Befehle des µP an.
Da kannst Du die ganze Hauptschleife mit vielleicht sechs Befehlen plus die Verzögerung machen.

In der vorliegenden Form wird der Lichtwechsel auch viel zu schnell gehen, etwa im Tonfrequenzbereich.
Dem kanns Du abhelfen, indem Du zwei verzögerungsschleifen verschachtelst. etwa so:

mov r4, #delayValue ; 1(am kürzesten)über 2, 3,... bis 0 (am längsten)

dloop:
djnz r5,dloop
djnz r4,dloop

; nach dieser geschichte enthält r5 stets 0 = maximale verzögerung und deshalb habe ich auf die initialisierung verzichtet.


PS:
Doch da Programm enthält zwei gravierende Fehler:
1) Der Sprung nach Start.
Das Label gibt es nicht und eigentlich sollte der Assembler Dir diesen Fehler anmeckern. Tut er's nicht, dann taugt er nichts: Besorg Dir einen besseren oder nimm nen anderen µP für den es umsonst vernünftige Entwickluungssysteme gibt (PIC oder AVR).

2.) Dein Programmm hat keine Hauptschleife. Dann wird es genau einmal ausgeführt, bei END verliert sich der Prozessor im unprogrammierten Speicher und stürzt ab. Mit viel Glück kommt er irgendwann wieder an den Programmanfang weil der PC überläuft, aber das ist wirklich unvorhersehbar.


_________________
Haftungsausschluß:

Bei obigem Beitrag handelt es sich um meine private Meinung.

Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.

Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

[ Diese Nachricht wurde geändert von: perl am 11 Okt 2003  0:02 ]

BID = 34788

mfd2004

Neu hier



Beiträge: 42
Wohnort: Duderstadt
ICQ Status  

Ja richtig! Die Fehler habe ich auch bemerkt, als ich es on gestellt hab. Ich hatte da nämlich einen anderen Fehler drin, den ich rausgemacht habe aber ich habe vergessen, das das Lauflicht ja nicht wieder zurückläuft geschweige denn bei Start anläuft, da kein Start vorhanden ist ....
Ich wollte dann das jetzige programm assemblieren ... aber irgendwie geht das nciht! es sagt, das ich irgendeinen include fehler hätte. dabei habe ich das doch richtig mit dem prozessor angegeben!?!? oder nicht?

Zitat :

Ich glaube aber, daß Du mindestens vergessen hast die Datenrichtungsregister zu initialisieren

Wie jetzt? Wie mach ich das und warum??? In meinem Buch steht da auch nichts von Datenrichtungsregistern ... was ist das und was machen die? Meinst du, das ich die Ausgänge letztenendlich erstmal auf "Ausgang schalten sollte/muss? und das im Datenrichtungsregister gemacht wird?
Das mit der Schleife, die du vorschlägst ... muss ich nochmal überdenken, wie du das meinst! ich kann jetzt nicht mehr denken ... bin kaputt .... *gähn*

Auf jedenfall schonmal danke für die Hilfe!
mfd2004

Hochgeladene Datei : Lauflicht.txt

BID = 34799

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Zitat :
In meinem Buch steht da auch nichts von Datenrichtungsregistern ...

Hast Recht, Dein µP hat tatsächlich kein DDR.
Die meisten anderen µP haben solche Datenrichtungsregister, aber das zugrundeliegende Design des Intel 8051 ist ja auch schon 25 Jahre alt.

Dadurch kann Deiner aber auch nur sehr geringe Ströme (50µA) ausgeben, die nicht einmal ausreichen einen npn-Transistor vernünftig anzusteuern.
Du wirst also Pull-Up Widerstände von ca. 10kOhm verwenden müssen, oder pnp-Transistoren.


Was hast Du denn da für ein Buch ?
Du solltest Dir mindestens von Atmel die für die 8051 Familie relevanten Applikationsschriften sowie das Datenblatt des 89C52 geholt haben.
Nur was im Datenblatt steht ist verbindlich.
Besonders bei deutschsprachiger Sekundärliteratur habe schon viele Grausamkeiten gesehen.



Zitat :
es sagt, das ich irgendeinen include fehler hätte. dabei habe ich das doch richtig mit dem prozessor angegeben!?!? oder nicht?

Weiß ich nicht, da ich diesen Assembler nicht benutze.
Die häufigsten Fehlerquellen in diesem Zusammenhang sind:
1) Syntaxfehler. Daran glaube ich nicht, da Du die $INCLUDE Anweisung vermutlich genau abgeschrieben hast.

2) Die betreffende Datei existiert nicht.

3) Die Datei existiert, aber der Assembler kann sie nicht finden, weil sie nicht im Suchpfad liegt.


Ansonsten hat Dein Programm immer noch keine Haupsschleife sondern endet nach einmaliger Ausführung mit dem Absturz.
Außerdem sind die Delay-Schleifen immer noch zu schnell. Wenn die übrigen Fehler raus sind, dan schließ mal anstelle der schwach glimmenden LEDS einen Kopfhörer an, dann wirst Du es pfeifen hören.

Außerdem wimmelt es in dem Programm von unsinnigen Anweisungen.
Zum einen sind da die
MOV @R0, A
INC R0
Sequenzen, die nichts sinvolles bewirken. Wenn Du unbedingt dummy Befehle brauchst, dann nimm NOPs.


Und was sollen die vielen
JB R1,led8
u.ä. bewirken ?
Soweit mir die Syntax des 8051 bekannt ist, sollte da ein Bit, nicht ein Register angegeben sein.

Außerdem wird, soweit ich sehe, mit R1 nichts gemacht, außer das es am Programmanfang auf 0 und am Programmende auf 1 gesetzt wird.


Zitat :
Das macht mir alles irgendwie Kopfschmerzen!!! Es ist nicht einfach sich selbst was versuchen beizubringen!!!!!!


Nicht verzagen, , das erlebe ich auch immer wieder. Leider gibts bei mir nicht so viele, die ich fragen könnte.


_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !


      Nächste Seite
Gehe zu Seite ( 1 | 2 Nächste Seite )
Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag       heute wurden bisher 3 Beiträge verfasst
© x sparkkelsputz        Besucher : 182422143   Heute : 1183    Gestern : 5459    Online : 312        29.11.2024    9:43
4 Besucher in den letzten 60 Sekunden        alle 15.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0648150444031