PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATMEGA8 - mit BASCOM Status Register R6.4 und R6.5 auslesen



myrobo
10.02.2010, 12:53
Hallo,

ich möchte mit BASCOM den Status der Bits 4 und 5 von Register R6 meines ATMEGA8 auslesen. Meine Versuche mit z. B.:


dim a as bit
dim b as bit
a = 0
b = 0

if r6.4 is 1 then
a = 1
else
a = 0
endif

if r6.5 is 1 then
b = 1
else
b = 0
endif

sind natürlich gescheitert.

Geht das überhaupt mit BASCOM? Wenn ja, wie (bitte Beispielcode)?
Wenn es nur mit in BASCOM integrierten ASSEMBLER geht, wie würde das dann in BASCOM-ASSEMBLER aussehen (bitte Beispielcode)?

Hinweis:
ich habe keine Ahnung/Erfahrung mit ASSEMBLER!

Da ich an diesem Punkt festhänge, wäre ich für jeden hilfreichen Rat mit Beispielcode dankbar.

Jaecko
10.02.2010, 13:29
Versuch mal, das Register zuvor in einer Variable zu sichern. Weiss jetzt nicht genau, was Bascom mit den Registern anstellt, aber wenn es z.B. R6 für nen Vergleich braucht... dann wirds schwierig.

myrobo
10.02.2010, 19:07
Hallo Jaecko,

danke für die Antwort. Du hast u. a.gepostet:


Versuch mal, das Register zuvor in einer Variable zu sichern.

Aber wie sichere/speichere ich das Register in einer Variable? Und wie greife ich dann auf den Zustand von Bit4 und Bit5 dieser R6 Registervariable zu? Dein Vorschlag ist ja gut gemeint, aber das ich nicht weiß wie das geht ist ja genau mein Problem!

Es muß doch eine Möglichkeit geben die Zustände aller Bits (gesetzt oder nicht gesetzt, also ON/OFF) des Registers R6 mit BASCOM und/oder ASSEMBLER abfragen zu können.

Ich bin für jeden Tip dankbar.

MagicWSmoke
10.02.2010, 19:16
Dim R6_Wert as Byte
...
!STS {R6_Wert}, R6

:cheesy:

myrobo
11.02.2010, 11:32
Hallo MagicWSmoke,

danke für die Info. Aber leider verstehe ich Deinen Pseudocode


Dim R6_Wert as Byte
...
!STS {R6_Wert}, R6

nicht richtig, denn ich habe (wie geschrieben) keine Erfahrung mit ASSEMBLER. Was bewirkt !STS {R6_Wert}, R6? Ich kann Deinen guten Tip/Info aus Verständnisgründen für mich so nicht umsetzen. Könntest Du mir freundlicherweise Deinen Codeschnipsel nochmal wie folgt anpassen:


dim a as bit
dim b as bit
a = 0
b = 0

if r6.4 is 1 then
a = 1
else
a = 0
endif

if r6.5 is 1 then
b = 1
else
b = 0
endif

Also meinen ähnlich wie oben strukturierten Kurz-Beispielcode so schreiben oder anpassen, dass er mir zeigt, wie ich mit BASCOM den Zustand (ON/OFF) von BIT4 und/oder BIT5 des Registers R6 abfragen kann. Ich hoffe das ich nicht zuviel verlange. Darum jetzt schon mal:
vielen Dank im voraus an alle Helfer für die Unterstützung.

MagicWSmoke
11.02.2010, 13:12
myrobo,

das war kein Pseudocode, das war richtiger Code. Die Pünktchen sollten ggf. noch andere Deiner Anweisungen andeuten. Wobei das Sichern des Registers so früh wie möglich kommen sollte.

Aber zur Erklärung: Das Prozessorregister R6 muss in eine Variable gespeichert werden, damit Du den Inhalt einfach weiterverarbeiten kannst. Ein Prozessorregister ist 8 Bit breit, also nimmt man ein Byte dafür.

Und genau das passiert hier, ich habe eine Variable dimensioniert, und dann weise ich mit STS ... dieser Variablen das Register R6 zu. Die Variable enthält dann den Registerinhalt und kann wie jede andere Bascom Variable weiterverarbeitet werden, abfragen der Bits, also:

If R6_Wert.4 = 1 Then...

Den Rest solltest Du Dir jetzt selbst zusammendenken können. Verwende als Variablennamen keine reservierten Wörter, also auch nicht R6, R7, CLI, SEC usw., das kann eigenwillige Ergebnisse zeitigen.

myrobo
11.02.2010, 17:22
Danke MagicWSmoke,

ich habe Deinen Code jetzt verstanden, war aber mittlerweile zu diesem Thema auch fündig geworden. Letztendlich verstanden habe ich es aber nur dank Deiner Hilfe! Für alle die es interessiert:

http://www.rn-wissen.de/index.php/Assembler_Einf%C3%BChrung_f%C3%BCr_Bascom-User

In dem Artikel nach STS suchen!

Abschließend nochmal mein für mich funktionierender Beispielcode zu meiner gestellten Frage (für alle die eine ähnliche Fragestellung haben):


dim r6_byte as byte

' Zustand von Register R6(BIT4 und BIT5) ausgeben
do
!STS {r6_byte}, r6
if r6_byte.4 = 1 then
print r6_byte.4
end if
if r6_byte.5 = 1 then
print r6_byte.5
end if
loop
end

Nochmals Dank an MagicWSmoke. Hiermit schließe ich den Thread zu diesem Thema.