Problem bei Assembler Programm

Also hier noch mal *gg*

Moin zusammen :smile:

Ich muß für eine Seminararbeit in Microcontrollerprogrammierung eine
Digitaluhr mit Datumsanzeige programmieren.

Jetzt ist die Uhr soweit fertig und sie funktioniert auch, fast
zumindest.

Nach dem ersten Durchlauf der Sekunden sollten ja eigentlich die
Minuten erhöht werden, dieses passiert aber erst nach dem zweiten
Durchlauf der Sekunden, danach aber immer richtig nach jedem
Durchlauf. Das selbe passiert mit den Stunden, und ich nehme mal an
auch mit den Tagen, Monaten und Jahren. (Soweit hab ichs jetzt nicht
getestet)

Vielleicht kann sich ja mal jemand den Quelltext anschauen und
erkennt den Fehler?

Zu den Rahmenbedingungen:

Wir programmieren für den Prozessor 80537 und nutzen ein Programm,
das sich F+R MCS51 Simulator nennt.

Dort sollen die Speicherplätze $30-$36 für die Anzeige von Uhrzeit
und Datum benutzt werden.

Ich hab es jetzt so programmiert, das ich die Uhrzeit und das Datum
per Hand in die Speicherplätze eingebe, in 30-36 dezimal und in 20-26
hexadezimal.

In den Speicherplätzen 40-46 stehen die „Maximal“-Werte der Daten,
also z.B. 60 Sek, 24 Std etc.

Dann gibt es noch ein Unterprogramm SEKUNDE, das die Sekunden zählt,
ein Unterprogramm HEXDEZ für die Umwandlung von Hex nach Dez und
Unterprogramme für die Anzeige von Sek, Min, Std etc.

Dann würde mich noch interessieren, ob jemand weiss, ob man in
Assembler Kommentare in den Quellcode einfügen kann.

Ach ja, mein Unterprogramm Sekunde zählt einfach zwei Werte runter,
um so die Zeit (1 Sekunde) zu überbrücken. Allerdings ist das ganze
noch ein wenig schnell, weiss jemand, mit welchen Werten man an die
Sekunde herankommt?

Soo, jetzt fehlt eigentlich nur noch der Quelltext :wink:

Zu finden hier:

http://home.arcor.de/diemaus29/UHRNEU.ASM

Danke und Gruß
diemaus

Hallo.

Ohne dir die Hausaufgaben machen zu wollen und ohne den Quelltext länger betrachtet zu haben würde ich sagen, du initialiesiert deine Minuten nicht/nicht richtig. Gleiches wird wohl auch für alles andere gelten. Soweit ich das sehe werden in start nur Maximalwerte gesetzt.

Oder aber dein Speicher und/oder deine Register werden nicht in der richtigen Reihenfolge geladen.

Viel Erfolg,

Günther

Hallo diemaus,

so schnell blicke ich jetzt nicht durch bei dem Quelltext (was den Umstand betrifft, daß die Minuten, Stunden usw. erst ab dem zweiten Durchlauf der Sekunden, Minuten usw. hochgezählt werden, ich glaube, es handelt sich um unzureichende Initialisierung von Variablen), aber um die richtige Ganggeschwindigkeit zu wissen, müßtest Du als erstes die Taktfrequenz wissen, mit dem der Mikrocontroller betrieben wird.

Sodann ist die einzig vernünftige Methode, eine Uhr zu programmieren, mit Hilfe des Timer-Interrupts:

Der Mikrocontroller hat Timer eingebaut, die man so programmierien, kann, daß sie in regelmäßigen Abständen einen Interrupt auslösen. Dann muß es eine Interrupt-Routine (gleich wie ein Subroutine, aber mit RETI am Schluß anstatt RET), die die Sekunden usw. inkrementiert und anzeigt, und Du brauchst Dich dort nicht um Timing-Probleme kümmern, das macht alles der Timer (sollte sich nur zeitlich zwischen zwei Timer-Interrupt-Aufrufen ausgehen, dürfte aber kein Problem sein).

Das Hauptprogramm besteht dann nur noch aus Initialisierung der Variablen und der Timer, und einer Endlosschleife (im einfachsten Fall rjmp @).

Zur Not ist es auch auf Deine Methode möglich, aber es ist schwieriger, eine genaue Uhr zu bekommen, da Du sehr auf das genaue Timing aller Abläufe achten mußt, und es muß gleich viel Zeit verbraucht werden, egal ob z. B. die Minute gerade inkrementiert wird, oder nicht (siehe benötigte Taktzyklen der einzelnen Befehle).

Verfügst Du über Literatur? - Dort findest Du sicher die nötige Information über die Timer und den Timer-Interrupt. Z. B. Andreas Roth , Das Mikrocontroller-Kochbuch

In der Sequenz

call ANZSEK
mov a,#00h
mov a,MaxSek

und allen ähnlichen folgenden ist der Befehl

mov a,#00h

überflüssig.

Kommentare leitest Du mit einem Semikolon ein.

Grüße,

I.

Hi,

müsste das nicht

inc MinH
mov Hex, MinH

heissen?

Sonst bist doch immer ne Minute hinterher? Ich glaube bei Stunden und Sekunden ists auch so…

mfg
Matze

eine Frage…
Hallo,

zu deinem Code kann ich nix sagen, aber was mir da auffällt…

http://home.arcor.de/diemaus29/UHRNEU.ASM

Ich habe in dem Text keine einzige Kommentarzeile gesehen.
Hast Du die extra rausgelöscht? Oder gibts noch keine?
Du solltest dein Programm ausreichend kommentieren, denn wenn ich das als Lehrer benoten sollte, dann würde mein Urteil vewrnichtend ausfallen so ganz ohne Kommentarzeilen.

Ein weiterer Vorteil von einer guten Kommentierung ist die Lesbarkeit auch nach Monaten bzw. Jahren ohne sich groß in den Code reinzulesen.

Viele Grüße

Stefan

Hi diemaus,

Dann würde mich noch interessieren, ob jemand weiss, ob man in
Assembler Kommentare in den Quellcode einfügen kann.

das sollte das Handbuch zu Deinem Assemblierer verraten - ich kennen keinen, der Kommentare nicht zulässt. Oft ist das ein * oder ein # in der ersten Spalte.

Gruß Ralf

Hallo

Ohne dir die Hausaufgaben machen zu wollen und ohne den

Das hab ich ja auch gar nicht verlangt.

Quelltext länger betrachtet zu haben würde ich sagen, du
initialiesiert deine Minuten nicht/nicht richtig. Gleiches
wird wohl auch für alles andere gelten. Soweit ich das sehe
werden in start nur Maximalwerte gesetzt.

Ja, die dezimalen und hexadezimalen Werte für die Uhrzeit trage ich per Hand ins Programm ein. So kann ich am einfachsten mehrere Fälle testen ohne jedes mal das Programm umschreiben zu müssen.

Siehe:

_Ich hab es jetzt so programmiert, das ich die Uhrzeit und das Datum
per Hand in die Speicherplätze eingebe, in 30-36 dezimal und in 20-26 hexadezimal.

In den Speicherplätzen 40-46 stehen die „Maximal“-Werte der Daten,
also z.B. 60 Sek, 24 Std etc._

Oder aber dein Speicher und/oder deine Register werden nicht
in der richtigen Reihenfolge geladen.

Hmm, keine Ahnung, aber ein Tipp von oben hat geholfen.

Gruß
diemaus

Hallo

Puhh, ich fürchte, das mit den Interrups überfordert meinen Wissenstand dann doch etwas, und in der Vorlesung war da auch nie die Rede von. Ich werde also bei meiner Methode bleiben :smile:

Zur Not ist es auch auf Deine Methode möglich, aber es ist
schwieriger, eine genaue Uhr zu bekommen, da Du sehr auf das
genaue Timing aller Abläufe achten mußt, und es muß gleich
viel Zeit verbraucht werden, egal ob z. B. die Minute gerade
inkrementiert wird, oder nicht (siehe benötigte Taktzyklen der
einzelnen Befehle).

Na ja, sie muss jetzt nicht nach der Atomuhr funktionieren :smile:, aber ein wenig langsamer dürfte sie schon laufen…
Ich werde noch mal ein wenig mit den Werten rumspielen.

Verfügst Du über Literatur? - Dort findest Du sicher die
nötige Information über die Timer und den Timer-Interrupt. Z.
B. Andreas Roth , Das Mikrocontroller-Kochbuch

Hab ich mir aus der Bücherei geholt, mal sehen, ob ich da was finde.

In der Sequenz

call ANZSEK
mov a,#00h
mov a,MaxSek

und allen ähnlichen folgenden ist der Befehl

mov a,#00h

überflüssig.

Ich weiss *gg*. Wir haben das bis jetzt immer als „Sicherung“ benutzt, um zu verhindern, das sich falsche Werte im Akku befinden und es zu Fehlern kommt.

Kommentare leitest Du mit einem Semikolon ein.

Ahh, danke.

Gruß
diemaus

Hi

müsste das nicht

inc MinH
mov Hex, MinH

heissen?

Sonst bist doch immer ne Minute hinterher? Ich glaube bei
Stunden und Sekunden ists auch so…

Jaa, das scheints gewesen zu sein! Jetzt funktioniert sie und ich muss nur noch die Maximalwerte anpassen.

Danke und Gruß

diemaus

Hallo

Ich habe in dem Text keine einzige Kommentarzeile
gesehen.
Hast Du die extra rausgelöscht? Oder gibts noch keine?

Wer lesen kann ist klar im Vorteil. Darf ich meinen eigenen Artikel zitieren?

Dann würde mich noch interessieren, ob jemand weiss, ob man in
Assembler Kommentare in den Quellcode einfügen kann.

Du solltest dein Programm ausreichend kommentieren, denn wenn
ich das als Lehrer benoten sollte, dann würde mein Urteil
vewrnichtend ausfallen so ganz ohne Kommentarzeilen.

Ich weiss, wird auch verlangt, nur Mittels nicht vorhandener Ahnung, wie man Kommentare einfügt bis jetzt noch nicht eingefügt.

Gruß
diemaus

Hi

Dann würde mich noch interessieren, ob jemand weiss, ob man in
Assembler Kommentare in den Quellcode einfügen kann.

das sollte das Handbuch zu Deinem Assemblierer verraten - ich
kennen keinen, der Kommentare nicht zulässt. Oft ist das ein *
oder ein # in der ersten Spalte.

Hmm werd ich mich mal bei Google auf die Suche machen, wir haben nur ne Befehlsreferenz bekommen; und ich werde es mal mit Semikolon versuchen (Tip von Idomeneo)

Gruß
diemaus