Forum: Mikrocontroller und Digitale Elektronik brne funktioniert auf Atmega8 nicht, aber im AVRStudio


von Martin K. (spyro07)


Angehängte Dateien:

Lesenswert?

Hallo,
ich bins wieder. Und ich habe dummerweise immer noch das gleiche Problem 
mit meinem copy-paste-Programm, wenn man es mal so sagt.

Und zwar zeigt mir meine Uhr immer noch zum Beispiel 50:86 an.
Obwohl ich ja die cpi´s und brne drinne habe:
1
loop:
2
  
3
  clr    temp
4
  clr    temp1
5
  cpi    second, 60
6
  brne  loop2
7
8
  clr    second          
9
  inc   minute          ; Minute +1
10
  cpi    minute, 60
11
  brne  loop2
12
13
  clr    minute
14
  inc   hour          ; Stunde +1
15
  cpi    hour, 24
16
  brne  loop2
17
  rjmp  clear
18
19
loop2:
20
  mov    temp, minute
21
  mov   temp1, hour
22
   rcall   out_number
23
 
24
  rjmp    loop

Ich habe jetzt schon immer wieder rumprobiert, aber rausgekommen ist 
einfach nichts.
Das komische ist ja das es in der Simulation perfekt funktioniert, nur 
in der Realität nicht, zumindest die Minuten und Stunden. Denn die 
Sekunden werden offensichtlich nur bis 60 gezählt, da die Minute immer 
nach ca. 59 Sek. (nach richtiger Uhr) hochgezählt.

Ich finde einfach keinen Fehler, ich hoffe mir kann jemand sagen woran 
es liegt, denn ich bin nämlich total am verzweifeln :( .

P.S.: Im Anhang habe ich nochmal die ganze datei.

von Martin K. (spyro07)


Lesenswert?

Hat keiner eine Ahnung woran es liegt oder mal ein ähnliches Problem 
gehabt?
Könnte mir jemand wenigstens bestätigen, ob der Code funktionieren 
müsste oder nicht?

mfg

von Sven P. (Gast)


Lesenswert?

Ist das das ganze Programm? Weil, damit würde die Zeit ziemlich schnell 
vergehen.

von Martin K. (spyro07)


Lesenswert?

Das ganze Programm ist im Anhang. Das ist der Teil der nicht 
funktioniert.

von TK (Gast)


Lesenswert?

Hallo,

wenn angeblich der brne nicht geht, wieso probierst Du dann nicht
mal den brlo?
Der brne hat nämlich den Nachteil, dass vordergründig der Code zwar OK
ist, was ist aber, wenn das Programm aus irgendwelchen Gründen die
Register an einer anderen Stelle manipuliert? (Ich hab jetzt den Code 
nicht durchgesehen)
Aber bei dem brlo kann man eigentlich davon ausgehen, dass die 
nachfolgende Routine bearbeitet wird, wenn die Zeit - so wie es hier ja 
scheint - zu groß ist.
Ist nur mal so ein Vorschlag.

Gruß
TK

von Martin K. (spyro07)


Lesenswert?

Danke für den Tip, daran hatte ich jetzt noch nicht gedacht. Ich hatte 
es zwar auch schon mit brsh und breq und umprogrammiert das es gehen 
müsste, aber es ging trotzdem nicht. Mit dem brlo gehts aber leider auch 
nicht.
Hab jetzt den Thread gefunden:
Beitrag "Assembler Befehl BRLO"

Ich habe es so versucht wie es dort ist, das bringt aber auch nichts. 
Ich weiß überhaupt nicht mehr was ich noch machen soll. Register 
manipulieren ist eigentlich ausgeschlossen, habe jetzt es auch noch mit 
anderen Register probiert, die von nichts anderem verwendet werden, das 
bringt aber auch nichts.

mfg

von Martin K. (spyro07)


Lesenswert?

Durch die Binär-BCD Routine (UP out_number) werden die Minuten und 
Stunden doch eigentlich nicht beeinträchtigt, oder?

von senex24 (Gast)


Lesenswert?

Routine out_number, die Schleifen _out_irgendetwas: ist doch kompletter 
Unfug, oder? Sie vermischen dezimal und dual.

von senex24 (Gast)


Lesenswert?

Angenommen, Ihre Uhr steht auf hh:mm = 19:38

In der _out_tausend-Schleife betrachten Sie dies als Doppelregister, da 
steht also mitnichten 19*100 + 38 = 1938 drin, sondern 19*256 + 38 = 
4902; und davon ziehen Sie nun fortgesetzt 1000 ab.

von senex24 (Gast)


Lesenswert?

Oder um P. Watzlawick zu zitieren:

Unter einer Straßenlaterne steht ein Betrunkener und sucht und sucht. 
Ein Polizist kommt daher, fragt ihn, was er verloren habe, und der Mann 
antwortet: "Meinen Schlüssel." Nun suchen beide. Schließlich will der 
Polizist wissen, ob der Mann sicher ist, den Schlüssel gerade hier 
verloren zu haben, und jener antwortet: "Nein, nicht hier, sondern dort 
hinten, aber dort ist es viel zu finster zum Suchen."

von Otto (Gast)


Lesenswert?

Mit "brne" klappt es u. a. nicht, weil die Sekunden im Interrupt 
hochgezählt werden....... davon abgesehen: was sollen die 3 ineinander 
verschachtelten Schleifen in den Timerinterrupts ?

Otto

von Martin K. (spyro07)


Lesenswert?

Also das Problem ist jetzt gelöst. Mit dem UP kann es nicht 
funktionieren, daran hatte ich aber nie gezweifelt. Das Problem ist eben 
das die beiden Register einzeln abgehandelt werden müssen und nicht als 
16bit.

Vielen Dank für die Hilfen.

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.