8051 stürzt plözlich ab

Gast #1677850
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
#1678109
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
Gast #1678111
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
Gast #1678113
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
#1678200
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.
#1678215
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
#1678226
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.