PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eingänge in Zahl umwandeln



guenter1604
09.06.2008, 22:39
Hallo,

3 Eingänge stehen auf 0 oder 1. Diese sollen zusammen eine Zahl zwischen 0 und 7 ergeben.
Pin 1 = einser Stelle
Pin 2 = zweier Stelle
Pin 3 = vierer Stelle

wie frage ich die 3 Pins jetzt am schönsten ab, um die Zahl zu erhalten ?

Martin.
09.06.2008, 22:46
naja ich würde sagen:



zahl = 0
if pin*.1 = 0 then
zahl = zahl + 1
end if
if pin*.2 = 0 then
zahl = zahl + 2
end if
if pin*.3 = 0
zahl = zahl +4
end if


Kann gut sein, dass es auch einfacher geht, aber das wäre für mich die einfachste lösung!

Sauerbruch
09.06.2008, 23:33
Kann gut sein, dass es auch einfacher geht
...korrekt:



Dim Zahl as byte
Zahl = PinA 'oder PinB, C oder D, je nach verwendetem Port
Zahl = Zahl AND &B00001110 'Löscht die Bits 7,6,5,4 und 0 des Bytes durch UND-Verknüpfung mit 0
Shift Zahl, Right, 1



...fertich =P~


Und wenn Du nicht die Pins 1, 2 und 3 verwendest sondern 0, 1 und 2, kannst Du Dir den Shift-Befehl sogar auch noch sparen!

python_rocks
10.06.2008, 08:08
wie frage ich die 3 Pins jetzt am schönsten ab, um die Zahl zu erhalten ?
Hallo guenter1604!

z.B. so:

$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600


Dim My_bytevar As Byte


My_bytevar.0 = Pind.5
My_bytevar.1 = Pinb.7
My_bytevar.2 = Pinb.2


Print My_bytevar


End
mfg
Gerold
:-)

guenter1604
10.06.2008, 10:18
Hallo Gerold,

das sieht ja richtig hübsch aus.

Wo kann ich den Punkt noch einsetzten, gibts eine gute Dokumentation ?

python_rocks
10.06.2008, 11:33
Wo kann ich den Punkt noch einsetzten
Hallo guenter1604!

Das funktioniert so gut wie immer, wenn du auf ein einzelnes Bit zugreifen musst.

Z.B. beim Zugriff auf einen IO-Register (PORT/PIN), wenn du nur den Status eines einzelnen Pins brauchst oder setzen möchtest.

Oder wenn du ein einzelnes Bit eines Registers setzen oder auslesen möchtest. Du kannst dieses Bit sogar dynamisch, also über eine Variable ansprechen.

Sinnloses Beispiel, aber es demonstriert was ich damit meine:

FOR I = 0 to 7
PORTD.I = 1
NEXT I
Du kannst auch Konstanten verwenden um darauf zuzugreifen:

ACSR.ACBG = 1 'Bandgap-Referenzspannung einschalten
SFIOR.ACME = 1 'Multiplexer einschalten
Led1 = ACSR.ACO 'Wert des Analog-Comparators abfragen
Wie ich es in diesen Beispielen zeige: http://halvar.at/elektronik/kleiner_bascom_avr_kurs/038_analog_comparator/

Welche Konstanten es gibt, steht im jeweiligen AVR-Datenblatt. Und die Konstanten stehen in den zum µC gehörenden DAT-Dateien definiert. Die Konstanten für den ATmega8 stehen in der Datei *m8def.dat* im Bascom-Verzeichnis.

mfg
Gerold
:-)

Jaecko
10.06.2008, 11:36
Der Punkt zeigt AFAIK nur an, dass man ein bestimmtes Byte haben will.
Also var.n gibt bei Variable var das Bit n an.

var = var AND &b00100000 ist das gleiche wie var.5 = 1

EDIT: Druckfehler ausgebessert; thx für den Hinweis python_rocks.

MeckPommER
10.06.2008, 13:17
var = var AND &b00100000 ist das gleiche wie var.5 = 1


äh ... ist das Folgende nicht "etwas richtiger"? :
var = var OR &b00100000 ist das gleiche wie var.5 = 1

var = var AND &b00100000 läßt nur bit 5 unverändert, während alle anderen bits gelöscht werden.

möchte man hingegen nur bit 5 löschen, so geht das mit
var = var AND &b11011111.

Bitte um ein "dudu", wenn ich mich irre ... es ist warm draussen und meine kopfinterne Lüftersteuerung haut nicht so ganz hin ... ;-)

Gruß MeckPommER

Jaecko
10.06.2008, 13:23
ärgs...mist...2 Fehler in 1 Beitrag... stimmt, is wirklich warm draussen.
Klar muss es OR sein...

guenter1604
10.06.2008, 21:36
Danke für eure Hilfe!