Stimmt!
und wie lautet der Befehl für "Ausgabe"?
Macht nix
Du kannst doch ein ganzes byte in den PortC schreiben, auch wenn nur die bits 4-0 von Interesse sind. Die übrigen bits (7-5) hast Du ja ohnehin gelöscht (mit dem AND &B00011111 - Befehl). Und wenn Du ganz sicher gehen willst, kannst Du die Pins C5-C7 ja als Eingänge konfigurieren - dann kommt garantiert nur der relevante Teil vom byte raus (DDRC = &B00011111).
Stimmt!
und wie lautet der Befehl für "Ausgabe"?
Dafür braucht man keinen Befehl (und deshalb gibt´s ihn auch nicht )
Wenn ein Anschluss als Ausgang konfiguriert ist (DDR-Register), wird das dazugehörige Bit des Port-Registers immer und ohne weiteres Zutun auf den Ausgang gegeben. Das kannst Du für ganze Ports "am Stück" machen, aber auch für jede beliebige Kombination von Bits eines Port-Registers.
So einfach ist das...
achsooooo
dann ist meine Zeile:
Endhighbyte = Pac
sogar richtig?? weil Endhighbyte ist ja portA und portC zusammen und Pac ist ja der Umgerechneter Code.
ich habe das ganze nach gefühl geschrieben, weil ich mit dem Syntax von basic nicht so vertraut bin.
Was muss ich also in meinem Code oben verändern? ich werde mal bald den Schaltplan zeichnen.
so, und nun kommt der Schaltplan.. MAN BEACHTE DIE BELEGUNG DES PORTCs
...mit der Bascom-Syntax vertraut zu sein schadet aber nicht - das macht vieles einfacher!
Jetzt mal ganz allgemein:
Du kannst Ports als ganzes ansprechen, z.B.
PortA = &B10101010 (=binär) oder
PortA = 170 (=dezimal) oder
PortA = &HAA (=hexadezimal)
oder auch über eine Variable, z.B. so
Dim Zahl as Byte
Zahl = 170
PortA = Zahl
alles das gleiche: Die 8 Pins des PortA werden 10101010 nach außen führen.
Und wie verschiedene dezimale Zahlen im Binär- oder Hexydezimalsystem aussehen (was uns ja meistens nicht ganz so vertraut ist wie das dezimale), kann man sich mit Hilfe des Rechners im Wndows-Zubehör sehr einfach ansehen. Einfach mal ausprobieren, das schafft schneller Klarheit als hunderte von Seiten zu lesen.
Du kannst aber auch einzelne bits des Ports setzen:
PortA.0 = 0
PortA.1 = 1
PortA.2 = 0
...
Aber zwei Ports in einem Aufwasch (PortAC oder sowas), das geht nicht. Gar nicht. Niemals. Du musst Deinen Ausgangs-Ports A und C getrennt zuweisen, welche Werte sie haben sollen.
Für PortA ist das einfach, da er die untern 8 bits Deines 16bit-Words Endhighbyte haben soll. Das geht mit dem Befehl LOW( ). Ich kann die Bascom-Hilfe hierzu nur wärmstens empfehlen, aber es ist wirklich nur dieses hier:
PortA = LOW(Endhighbyte)
Fertig.
Bei PortC wird´s schwieriger, weil die bits "über Kreuz" zugeordnet werden. Da müsstest Du dann in die Trickkiste mit dem Ansprechen bzw. zuweisen einzelner bits greifen:
PortC.7 = Endhighbyte.8
PortC.6 = Endhighbyte.9
PortC.5 = Endhighbyte.10
PortC.4 = Endhighbyte.11
PortC.3 = Endhighbyte.12
Und auch fertig.
Es gibt 3 gute Methoden, ein "Gefühl" für die Bascom-Syntax zu bekommen:
1. Probieren, 2. probieren und 3. probieren.
Der Compiler lässt nur Code durch, der o.k. ist. Und eine wirklich ganz unglaublich gute Hilfe ist die "Help"-Funktion in Bascom, die für jeden, aber auch wirklich jeden Befehl die genaue Syntax beschreibt, und nicht nur das: Für viele Befehle sind sogar auch noch Code-Beispiele dabei, von denen man sich sehr viel abschauen kann. So haben das die meisten hier irgendwann mal gelernt
hm, sorry das ich so blöd bin.
habe schon alles auspobiert, was ich probiern könnte.
nun wolte ich erst nur mit einem PORT (8 bit) machen und schauen, ob es überhaupt funktioniert.
habe sowas geschrieben:
es funktioniert aber nicht. kommt am PORTA nichts raus.Code:$regfile = "m32def.dat" $crystal = 1000000 Dim Pac As Byte Portb = Pac Do Pac = Gray2bin(pac) Porta = Pac Wait 1 Loop end
Der µC ist ok...
"PORTA = 3" funktioniert. Gibt er 11000000 raus.
Wo ist mein Fehler?
Danke
Wenn Du mit der ZeileWo ist mein Fehler?
Portb = Pac
erreichen möchtest, dass die Variable Pac mit dem Eingangs-Wert gleichgesetzt wird (und davon gehe ich mal aus), stecken drei Fehlerchen drin:
1. Die Reihenfolge muss andersrum sein: Pac = PortB. Als erstes steht immer die Variable um die es geht, und als zweites der Wert, den diese Variable annehemen soll.
(Ganz analog zur deutschen Sprache: Fritz = doof weist einer bestimmten Person eine Eigenschaft zu, heißt aber mitnichten, dass alle doofen Menschen Fritz heißen )
2. Statt PortB musst Du PinB nehmen. Ist etwas verwirrend, aber zu jedem Ein-/Ausgangsbeinchen des Controllers gehören 3 Register:
-DDRX.Y legt fest, ob´s ein Ein- oder Ausgang sein soll
-PORTX.Y ist das bit, das ausgegeben wird, wenn der Anschluss als Ausgang konfiguriert ist
-PINX.Y enthält das bit, das an dem Anschluss anliegt, wenn er als Eingang konfiguriert ist. Eingänge also immer über das PIN-Register abfragen!!!
Um diese Verwirrung noch zu komplettieren: Auch wenn ein Anschluss als Eingang konfiguriert ist (DDRX.Y = 0), hat das dazugeörige PORT-Bit auch eine Bedeutung: Ist es 1, ist der interne PullUp-Widerstand aktiviert. Das ist wichtig, wenn der Eingang ansonsten "offen" ist.
3. Die somit korrigierte Zeile
Pac = PinB
gehört hinter das "do" - sonst wird sie genau ein einziges mal ausgeführt, und Änderungen an Deinem Eingang werden nicht mehr auf Pac übertragen.
Alles klar??
oh man...
aber mit dem Code hierlege ich 5V an PB0. Alle anderen Eingänge sind auf LOW-PEGEL.Code:$regfile = "m32def.dat" $crystal = 1000000 Dim Pac As Byte Do Pac = PinB Pac = Gray2bin(pac) Porta = Pac Wait 1 Loop End
Am PORTA gibt er mir aber sowas raus. Pa0 bis Pa7 : 01010101
warum denn sowas? es sollen doch 10000000 sein.
Also, erstmal müsste es 00000001 sein, wenn Du PB0 auf 5V legst (die Bits werden immer in der Reihenfolge 7-6-5-4...-0 gezählt). Aber das nur am Rande
Wie legst Du denn technisch gesehen die Anschlüsse auf +5 bzw. 0 Volt? Hängen die Anschlüsse vielleicht "in der Luft", wenn sie nicht auf +5V sind?
Lesezeichen