mikrocontroller.net

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


Autor: matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Guido (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Wenske (matze_wms)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.