Forum: Mikrocontroller und Digitale Elektronik 8051 stürzt plözlich ab


von matthias (Gast)


Lesenswert?

Hallo miteinander

ich arbeite schon seit einigen Monaten an meinem Funkwecker.
Dieser empfängt, hinterlegt und gibt die uhrzeit, das datum, den 
wochentag und eine Weckfunktion aus.
Diese ganzen Funktionen laufen fast ohne Probleme.
Ich sage fast weil mein controller immer wieder abstürzt mal nach 2 
stunden mal nach 3 stunden aber auch mal nach 15 min das ist immer 
unterschiedlich und ich hab so gut wie keine ahung woran das liegen 
könnte..
ich vermute aber start das es an meinen adressierten speicherzellen lieg 
welche sehr viele sind (von 08h bis 62h) das musste ich allerdings 
machen da meine 7 Register mir nicht ausreichend waren.

hier könnt ihr mal in mein Programm reinschauen:
http://uc.pastebin.com/EREpGpXA

unter speicherzellen zuordnung sehr ihr was ich meine...

würde mich über hilfe echt freuen

danke schonmal fürs lesen

gruß

matze

von Guido (Gast)


Lesenswert?

Prüfe mal Bitoperationen, deine Variablen erstrecken sich doch
über den bitadressierbaren Bereich, oder?

von Peter D. (peda)


Lesenswert?

Du solltest Dir vielleicht das Prinzip von Unterfunktionen und lokalen 
Variablen verinnerlichen.
So ein Code- und Variablenmonster ist unverstehbar.

Und natürlich mußt Du Kommentare verwenden.
Sonst sieht da eh keiner durch und Du nach ein paar Monaten auch nicht 
mehr.

Wozu sind denn die vielen Delayloops drin?
Man muß für Delayloops auch nicht jedesmal andere Register verwenden. 
Register nutzen sich nämlich nicht ab.


Peter

von matthias (Gast)


Lesenswert?

Ja du hast recht,
meine Variablen erstrecken sich über Bitadressierbaren bereich aber ich 
verstehe nicht warum ich das nicht machen darf.
ich dachte ich habe meine Variablen im Bitadressierbaren bereich als 
Byte adressiert...
oder etwa nicht?

Beschäftige mich erst seit wenigen Monaten mit Assembler dacher das 
bisschen unterständliche ausdrücken.

danke deine hilfe

gruß

matze

von matthias (Gast)


Lesenswert?

hallo Peter Dannegger,

also die ganzen schleifen sind da um mein Signal abzufragen d.h. läuft 
eine zeitschleife einmal inerhalb eines kurzen bits (vom DCF Signal) ab 
so wird ein eine null ins entsprechende Register geschrieben schafft es 
die zeitschleife 2 mal inerhalb eines dcf Bits durchzulaufen wars ein 
langes bit und es wird eine 1 ins entsprechende Register geschrieben.

Danke fürs durchschauen

gruß
Matze

von Stephan H. (stephan-)


Lesenswert?

Du solltest über BCD Zahlen nachdenken.
Damit sparst Du einiges an RAM für Deine Variablen.
Damit kannst Du dann in 3 Bytes die komplette Zeit unterbringen.
08:33:00
Dabei ist das erste Nibble der Std Zehner das 2 der Std einer usw.
Das Gute daran: für ne LCd Ausgabe braucht man nur noch 30h dazu 
addieren.

Warteschleifen sind SCH*.. dafür nimmt man Timer mit entsprechenden 
Flags.
Die Flags in der Main abfragen und entsprechend handeln.

Erkläre uns doch mal wofür man Minuten 1er, 2er 4er usw benötigt.
Das machst du ja mit Stunden, Tagen Monaten usw.
Irgendwie denke ich hast Du noch ein grundlegendes Verständnisproblem.
Vieles wird sich wohl besser mit Tabellen machen lassen.

von Matthias W. (matze_wms)


Lesenswert?

Danke ersteinmal für den Tipp ich werde über die BCD Zahlen nachdenken.

Das mit den Stunden 1er usw. sind meine einzelnen bits om dcf signal 
z.b. ist das stunden1 bit das erste bit welches im stunden signal 
übertragen wird dann kommt das stunden2 bit und hier wird wieder 
geschrieben ob dieses gesetzt oder nicht gesetzt ist...

kann mir denn einer sagen ob es falsch oder gefählich ist mit so vielen 
variablen zu arbeiten??
habe den bereich für den stackpointer extra frei gelassen.
Normalerweiße dürfte dort nichts im Weg sein oder??


gruß

matze

von Peter D. (peda)


Lesenswert?

Matthias Wenske schrieb:
> kann mir denn einer sagen ob es falsch oder gefählich ist mit so vielen
> variablen zu arbeiten??

Es ist ineffizient und man verliert den Überblick.


> habe den bereich für den stackpointer extra frei gelassen.

Ich sehe nirgends, daß Du den Stack initialisierst. Der er aufwärts 
wächst, setzt man ihn üblicher Weise hinter das letzte Datenbyte.

Was machst Du überhaupt mit den Timerinterrupts?
Da Du zu Adressen springst, weiß niemand, wo das ist.
Adressen zu verwenden ist ganz böse, deshalb gibt es Sprungmarken.
Ohne Kommentare ist Dein Code eh nutzlos.
Z.B. niemand weiß, wie oft die Interrupts aufgerufen werden.


Peter

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.