Hallo Forum, ich habe ein kleines Problem:
Ich programmiere zur Zeit eine AVR ATMEGE 8535 und weis nicht wehr
weiter. Ich möchte eine 16-Bit-Zähler realisieren. Wenn ich folgendes UP
benutze funktioniert alles
rc5_zeit_messung:
lds tmp2,rc5_dauer_low
inc tmp2
sts rc5_dauer_low,tmp2
breq zeitg_0_ueberlauf1
zeitg_0_ueberlauf2:
ret
zeitg_0_ueberlauf1:
lds tmp2,rc5_dauer_high
inc tmp2
sts rc5_dauer_high,tmp2
rjmp zeitg_0_ueberlauf2
Benutze ich dagegen diese UP, funktioniert fast gar nichts mehr
rc5_zeit_messung:
lds tmp2,rc5_dauer_low
inc tmp2
sts rc5_dauer_low,tmp2
brne zeitg_0_ueberlauf2
lds tmp2,rc5_dauer_high
inc tmp2
sts rc5_dauer_high,tmp2
zeitg_0_ueberlauf2:
ret
Der einzige Unterschied ist, einmal nehme ich breq und das andere mal
brne. Kann mir jemand helfen und mir sagen warum es einmal funktioniert
und das andere mal nicht?
Hallo,
die Befehle "breq" -> Springe bei gleich
"brne" -> Springe bei ungleich
werden nach einem test auf 0 "tst" oder nach einem Vergleich "cp..."
geschrieben.
In deinem Prog sehe ich solche codezeilen nicht !!!
gruss Marc
Hallo,
Marc B. schrieb:
> Hallo,>> die Befehle "breq" -> Springe bei gleich> "brne" -> Springe bei ungleich>> werden nach einem test auf 0 "tst" oder nach einem Vergleich "cp..."> geschrieben.
Auch, ja...
>> In deinem Prog sehe ich solche codezeilen nicht !!!
dafür gibt es inc und das beeinflußt Z ebenfalls und ein paar andere
befehle auch...
Ach ja: wenn Du da platz hast vielleicht auch über
lds XH,rc5_dauer_high
lds XL,rc5_dauer_low
adiw X,1
sts rc5_dauer_high,XH
sts rc5_dauer_high,XL
hätte da dann immer die gleiche Laufzeit.
Geht auch mit anderen Registerpaaren, siehe ASM-Befehle.
Gruß aus Berlin
Michael
Marc B. schrieb:
> die Befehle "breq" -> Springe bei gleich> "brne" -> Springe bei ungleich>> werden nach einem test auf 0 "tst" oder nach einem Vergleich "cp..."> geschrieben.>> In deinem Prog sehe ich solche codezeilen nicht !!!
Das ist auch gar nicht nötig: brne und breq beziehen sich einfach auf
den letzten Operator, der das Z-Flag verändert, in diesem Fall den inc.
Ein tst oder cp muss nicht vorangegangen sein.
Die unterschiedliche Ausführungszeit für BRQE/BRNE für den zutreffenden
Fall/nicht zutreffenden Fall könnte man auch noch berücksichtigen. Kann
mein Beispiel oben leider nicht mehr editieren.
Ihr seit ja super schnell, hier noch eine Kleinigkeit. Ich löse alle 100
uS einen Timer1-Int aus, zähle dann mit vier Zählern, jeweils bis 10, so
habe kann ich dann ms-, 10ms-, 100ms- und s-weise zählen. Das ist das
Einzige was in der Routine erledigt wird. Im HP springe ich dann immer
zu folgende Auswertroutine:
Hi
>Wenn ich jetzt den 16-Bit-Zähler mit brne realisiere funktioniert die>ganze Geschichte nicht. Mit breq dagegen super.
Und wie sieht die Interruptroutine aus?
MfG Spess
Hi!
>Wenn ich jetzt den 16-Bit-Zähler mit brne realisiere funktioniert die>ganze Geschichte nicht. Mit breq dagegen super.
Ist ja auch normal.
inc lowbyte setzt bei 0(Überlauf) das Z-Flag->breq wird ausgelöst
also wird lowbyte bis 255 gezählt und dann highbyte +1
Wenn du brne benutzt wird bei jedem inc das Highbyte mit erhöht.
Viel Erfolg, Uwe
linuxdxs schrieb:
> Bei brne und breq mache ich ja verschiedene Programmschritt (siehe> oben). Kann es sein, daß meine AVR-Version veraltet ist?
Unwahrscheinlich, dass sich das so auswirkt. Bist du dem
unterschiedlichen Zeitverhalten schon nachgegangen?
In diesem Falle sollte das Zeitverhalten, so denke ich, doch gar nichts
ausmachen. Der AVR rennt mit 16 MHz. Im Datenblatt steht für beide
Befehle 1/2 Clocks. Wie soll ich das unterschieliche Zeitverhalten
verstehen. Gehe ich richtig in der Annahme, daß bei einer Frequenz von
16 MHz, der AVR 16000000 1-Clock Befehle in der Sekunde durchführt?
Ja, einmal habe ich dir Rotine gesendet, von der, der Zähler aufgerufen
wird. Der Zweitecodeteil ist dafür verantwortlich, wird durch Int
angesprungen, daß das Bit gesetzt wird, welches dafür sorgt, dem zuvor
erwähnten Programm mitzuteilen, das es soweit ist den Zähler
anzuspringen.
Karl heinz Buchegger schrieb:
> Vielleicht hab ich Tomaten auf den Augen.> Aber in den beiden zuletzt geposteten Codestpücken kommt kein einziger> breq, brne vor!
Naja, wie soll man denn sonst auf ne hohe Anzahl von Antworten kommen?
Wenn er sich mal aufgerafft hätte, nen kompletten, realen, getesteten,
compilierbaren Code als Dateianhang zu posten, wäre die Sache bestimmt
schon längst gegessen.
Peter
Hallo hier bin ich wieder. Also das ganze bis jetzt geschriebene
Programm. Tut mir leid, habe gedacht, daß es vielleicht ein ganz
einfaher Fehler wäre, nach dem Motto, hei da war doch was. Ich sende
morgen in einem Anhang das Programm, wenn es denn noch jemanden
interessiert.
Hallo ich habe es geschafft. Im Anhang eine lauffähige Version meines
Programmes. Im unteren Teil sieht man folgende auskommendierten Zeilen
;brne zeitgeber_0_ueberlauf1
;lds tmp2,rc5_dauer_high
;inc tmp2
;sts rc5_dauer_high,tmp2
wieder einkommendiert. Funktioniert die ganze Sache nicht mehr ganz
richtig. Ich muß noch dazu sagen, daß die UP test150 und test160 im
Sekundentakt( oder zumindest gleichmäßig) angesprungen werden müssen,
und wenn man die Änderung gemacht hat funktioniert das eben zumindest
mit test150 nicht mehr.
Also ich seh da überhaupt nicht durch, das ist ja ne wilde Hin- und
Herspringerei.
Mach mal nen großen Strich, darüber alles im Main-Kontext und darunter
alles im Interrupt.
Was willst Du außerdem mit der ewigen SREG-Pusherei?
Nimm Dir ein Register, z.B. R2, und darin wird SREG einmal zu
Interruptanfang gesichert und vor dem RETI wieder geladen, aus, fertig.
Peter