naja ich würde sagen:
Kann gut sein, dass es auch einfacher geht, aber das wäre für mich die einfachste lösung!Code: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
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 ?
naja ich würde sagen:
Kann gut sein, dass es auch einfacher geht, aber das wäre für mich die einfachste lösung!Code: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
...korrekt:Kann gut sein, dass es auch einfacher geht
...fertichCode: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
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!
Hallo guenter1604!Zitat von guenter1604
z.B. so:
mfgCode:$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
Gerold
:-)
Hallo Gerold,
das sieht ja richtig hübsch aus.
Wo kann ich den Punkt noch einsetzten, gibts eine gute Dokumentation ?
Hallo guenter1604!Zitat von 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:
Du kannst auch Konstanten verwenden um darauf zuzugreifen:Code:FOR I = 0 to 7 PORTD.I = 1 NEXT I
Wie ich es in diesen Beispielen zeige: http://halvar.at/elektronik/kleiner_...og_comparator/Code:ACSR.ACBG = 1 'Bandgap-Referenzspannung einschalten SFIOR.ACME = 1 'Multiplexer einschalten Led1 = ACSR.ACO 'Wert des Analog-Comparators abfragen
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
:-)
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.
#ifndef MfG
#define MfG
äh ... ist das Folgende nicht "etwas richtiger"? :Zitat von Jaecko
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
Mein Hexapod im Detail auf www.vreal.de
ärgs...mist...2 Fehler in 1 Beitrag... stimmt, is wirklich warm draussen.
Klar muss es OR sein...
#ifndef MfG
#define MfG
Danke für eure Hilfe!
Lesezeichen