Archiv verlassen und diese Seite im Standarddesign anzeigen : portpins abfragen und am LCD ausgeben
Hallo!
ich habe ein problem.
ich möchte die portpins abfragen, und den ergebnis als dezimalzahl auf dem LCD ausgeben.
wenn zum Beispiel am PA0 high pegel anliegt, soll das LCD "1" ausgeben.
PA1 - 2 ; PA0+PA1 - "3" ; PA2 - 4.....
wie man merkt ist das ein Binäncode.
kann mir einer ein Programmausschnitt posten?
also nur das, was mein prob. betrifft. alles zum LCD weiss ich schon :)
Danke
Wo ist das Problem? Ich sprech zwar kein Basic, aber wenn du weißt, wie man Zahlen ans LCD schreibt, dann musst du doch lediglich das Register für den Port nehmen und in die entsprechenden Ascii Zeichen umwandeln, oder?
(Also, dass ist doch deine Frage, oder?)
In C gibts ne Einfache Funktion die Zahlen in ihre Ascii-Pendants umwandelt. Mal danach Googlen und oder warten, bis das hier jmd postet. Das müsste es ja auch in Basic geben.
mfg
Andun
das problem ist eher die "UND"-verknüpfung...
also wenn PA0 und PA1 high-pegel haben, soll LCD eine "3" ausgeben.
Da brauchst du nix zu verknüpfen.
Gib einfach
LCD pina
aus und schon haste den kompletten Port dezimal auf dem Display.
Gruß
Rolf
> LCD pina
und was wird das?
Gruss Thomas
Was meinst du mit
"und was wird das?"
Gruß
Rolf
so, ich baue mal die Schaltung auf.
probiere die mal aus, dann melde ich mich noch mal.
@ Rolf
was bekomme ich denn genau angezeigt?
Danke
Na ja, der Port ist 8 bit breit was dezimal von 0 bis 255 geht.
Diese Zahl wird ausgegeben.
Wenn du nicht alle Pins des Ports brauchst, dann musst du dir die gefragten erst über
Dim Pa_dez As Byte
Pa_dez=Pina And &B00110011
LCD Pa_dez
besorgen. Hier würde Pina.0, Pina.1, Pina.4 und Pina.5 dezimal ausgegeben.
Gruß
Rolf
@ Rolf
Das ist eine grosse Hilfe von dir!!!
was bedeutet denn genau diese Zeile : Pa_dez=Pina And &B00110011?
also ich möchte 3 Ports benutzen, jeweils 4 erste Pins. z.B. Pina.0 bis Pina.3 ; Pinc.0 bis Pinc.3 und Pind.0 bis Pind.3
µC ist ein AtMega16. am Port B ist lcd.
Hallo!
also ich bin ein Stück weiter gekommen.
Jetzt stecke ich leider fest.
Das problem liegt wahrscheinlich an Syntax.
alle wissen wahrscheinlich, was dieser Code machen soll, aber ich bekomme ein Paar Fehler von dem Compiler.
was mache ich falsch?
Schalter1 Alias Pina.0
Schalter2 Alias Pina.1
Schalter3 Alias Pina.2
Schalter4 Alias Pina.3
Config Pina.0 = Input
Config Pina.1 = Input
Config Pina.2 = Input
Config Pina.3 = Input
Do
Cls
If Schalter1 = 1
And
Schalter2 = 1 Then
Lcd "3"
Else
Lcd "0"
End If
Waitms 100
Loop
Christopher1
05.11.2007, 15:46
Hi,
du musst dafür natürlich das Config machen, also µC auswählen und so.
Du musst das mit AND in einer Zeile schreiben, außerdem musst du das mit END abschießen.
Schreib das Programm das nächste mal bitte in Code Tags.
Hier der Code (hab ihn nicht getestet):
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000
Schalter1 Alias Pina.0
Schalter2 Alias Pina.1
Schalter3 Alias Pina.2
Schalter4 Alias Pina.3
Config Pina.0 = Input
Config Pina.1 = Input
Config Pina.2 = Input
Config Pina.3 = Input
Do
Cls
If Pina.0 = 1 Then
Lcd "3"
Else
Lcd "0"
End If
Waitms 100
Loop
End
@ Christopher1
danke, es funktioniert! :)))
Sauerbruch
05.11.2007, 17:28
wie man merkt ist das ein Binäncode.
...genau - und damit kannst Du die Sache ziemlich vereinfachen. Du definierst eine Variable als Byte, setzt die Variable gleich PinA und setzt die ersten 4 Bits auf 0 (falls pinA.4 bis PinA.7 anderweitig besetzt sind). Damit hat Deine Variable genau den Wert, der auf den Ports A.0 bis A.3 in binärer Form anliegt. D.h. sind alle 4 Pins high, wäre die Variable 15, sind A.0, A.1 und A.3 high wäre die Variable 11 usw - ganz ohne UND-Verknüpfung. Den Wert der Variablen kannst Du dann direkt via LCD ausgeben!
Als Code könnte das so aussehen:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000
Config LCD....
Dim Zahl as byte
Do
Zahl = Pina
Zahl = Zahl AND &B00001111
LCD Zahl
Loop
Die Geschichte mit "Zahl = Zahl AND &B00001111 setzt die bits 7-4 der Variablen Zahl auf 0 (x UND 0 ergibt immer 0), während sie die bits 3-0 unbeinflusst lässt (x UND 1 ergibt immer x).
Alles klar? =P~
Daniel
> Alles klar?
nicht alles! :)))
ich verwende Port A.
und davon nur 4 pins. Also pa0, pa1, pa2, pa3.
es soll immer nur eine einstellige Zahl sein.
also nur 0-9.
pa0 =1 lcd-1
pa1 =1 Lcd-2
pa0+1 =1 Lcd-3
pa2=1 Lcd-4
pa2+0 =1 Lcd-5
u.s.w. bis 9.
Wenns dir nichts ausmacht, kannst du den code ausschnitt posten?
Währe sehr dankbar.
sorry für mein letzten post :)))))
also es funktioniert :)
Danke
PortA ist fertig.
wollte jetzt selbstständig weiter machen mit portD.
es gibt aber ein problem.
so sieht mein Quellcome aus:
$regfile = "m16def.dat"
$crystal = 8000000
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
Initlcd
Dim Zahl As Byte
Dim Zahl1 As Byte
Cls
Cursor Off
Do
Cls
Zahl = Pina
Zahl = Zahl And &B00001111
Zahl1 = Pind
Zahl1 = Zahl1 And &B00001111
Locate 1 , 1
Lcd Zahl
Locate 1 , 2
Lcd Zahl1
Waitms 50
Loop
End
was habe ich nun falsch gemacht?
Sauerbruch
07.11.2007, 11:16
was habe ich nun falsch gemacht?
Auf den ersten Blick gar nichts =P~
Was passiert denn genau? Oder was passiert nicht?
Vielleicht sind die 50 Millisekunden zu kurz - LCD-Displays brauchen verhältnismäßig viel Zeit, bis sie sichtbar (!) anzeigen. Hattest Du diese kurze Verzögerung auch drin, als es mit Port A funktionierte?
Ansonsten verlängere das doch mal auf mindestens 200ms. Und wenn´s dann noch nicht klappt, schreib doch mal was passiert!
Das problen ist gelöst.
aber noch ein ist da.
gibt es sowas auch für einen Grey-Code?
Danke
Sauerbruch
07.11.2007, 11:29
Auch wenn ich ihn noch nie benutzt habe: Der Befehl "GRAY2BIN" könnte Dir weiterhelfen. Ist in der Bascom-Hilfe in gewohnter Qualität beschrieben!
und sowas wie "GRAY2DEZ" gibt es nicht?
Sauerbruch
07.11.2007, 12:04
Nö - weil Mikrocontroller ausschließlich im Binärsystem rechnen und arbeiten =P~
Am Beispiel der Zahl 4 (im Gray-Code 0110):
PinA.2 und A.1 sind 1, der Rest ist 0.
Zahl = Pina
Zahl = Zahl AND &B00001111
LCD Zahl würde jetzt "6" auf das Display bringen.
Zahl = GRAY2BIN(Zahl) macht aus der Gray-4 (00000110) die Binär-4 (00000100)
LCD Zahl bringt jetzt "4" auf´s Display.
Nochmal: Dezimalzahlen kennt nur das Display! Im Controller wird immer mit Bytes gerechnet.
DANKE!!!! :)))))wie machst du das bloß? :))))))))
kann man das aber so noch einstellen, dass er nur von 0 bis 9 geht und dann wieder auf 0 springt?
Also ich habe hier einen Geber, der Gray-Code ausgibt.
also mein Code sieht jetzt so aus:
$regfile = "m16def.dat"
$crystal = 8000000
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
Initlcd
Dim Zahl As Byte
Dim Zahl1 As Byte
Dim Zahl2 As Byte
Cls
Cursor Off
Do
Cls
Zahl = Pina
Zahl = Zahl AND &B00001111
Zahl = Gray2bin(zahl)
Zahl1 = Pind
Zahl1 = Zahl1 And &B00001111
Zahl1 = Gray2bin(zahl1)
Zahl2 = Pinc
Zahl2 = Zahl2 And &B00001111
Zahl2 = Gray2bin(zahl2)
Locate 1 , 3
Lcd Zahl
Locate 1 , 2
Lcd Zahl1
Locate 1 , 1
Lcd Zahl2
Waitms 70
Loop
End
es sollen nur 3 Stellen angezeigt werden.
also hunderter, zehner und einer stellen.
zur Zeit ist es so, wenn ich den Geber drehe, zeigt das LCD von 0 bis 15 an. und zwar so: 0015.
wenn ich weiter drehe, zeigt das Lcd das an: 0114, 0113.... 015, 011, 020... 021, 0214, 0215, 030...
verstehst du den zusammenhang?
ich brauche es nur 3 stellig. 999.
Sauerbruch
07.11.2007, 12:59
wie machst du das bloß?
ICH?? 8-[ (*lach)
Mit dem "locate"-Befehl kann es passieren, dass es Überschreibungen gibt, wenn die Zahl der Stellen nicht immer konstant ist. Um das zu vermeiden, kannst Du stattdessen auch alle Zahlen in einem LCD-Befehl ausgeben lassen:
LCD Zahl2; Zahl1; Zahl
Dann stehen sie immer schön nebeneinander - egal, ob sie 1- oder 2-stellig sind. Vielleicht ist das System dahinter dann einfacher zu durchschauen - denn ehrlich gesagt, ist mir dies auf die Schnelle nicht gelungen.
Mit 16-stufigen Schaltern nur 10 Ziffern zu erzeugen - das führt zwangsläufig dazu, dass 6 Schalterpositionen ohne Funktion sind, d.h. keine Änderung, wenn Du diesen Bereich überfährst. Wenn Du mit diesem Schönheitsfehler leben kannst, würde ich das einfach so machen:
Zahl = Pina
Zahl = Zahl AND &B00001111
Zahl = Gray2bin(zahl)
If Zahl > 9 then
Zahl = 9
End if
(und das natürlich für alle 3 Stellen).
Hoffe, es hilft...
oder es könnte man auch so machen:
ich muss einen 12bit Gray code auswerten.
der Port von Mega16 hat nur 8 bit. (8 pins)
kann man den noch erweitern?
also noch 4 pins von dem anderen Port nehmen, so dass ich 12bit habe?
geht das softwaremässig?
Danke sehr!
Sauerbruch
07.11.2007, 14:47
Puh - Du hast ja Probleme :shock:
Ich hab´ das gerade mal am Simulator durchgespielt - und so kann auch das klappen:
(Für dieses Beispiel :Alle 8 Bits von Port A sowie Bit 0-3 von Port B als Eingänge)
Dim Gray as Word '(Endvariable mit 16 Bit Breite)
Dim LoByte as Word '(Untere 8 Bit)
Dim HiByte as Word '(obere 4 Bit)
LoByte = PinA
HiByte = PinB
HiByte = HiByte AND &B0000000000001111 '(Das kennen wir ja schon...)
Rotate HiByte, left, 8 '(Verschiebt die Bits von PortB um 8 Stellen nach links!)
Gray = LoByte + HiByte '(zusammenzählen...)
Gray = Gray2Min(Gray) '(...und in Binärformat umwandeln!!)
Sowas kann man übrigens PEFEKT im Simulator durchspielen. Da kannst Du alle Variablen im Dezimal-und Binärfomat sehen. Erste Gehversuche lohnen sich!!
Gruß,
Daniel
P.S.: Vielleicht geht´s auch eleganter - keine Ahnung. Bin auch noch nicht soooo der Bascom-Checker =P~
Danke!
Super, es funktioniert!!!!!!
wie soll ich dir danken?
Sauerbruch
07.11.2007, 21:06
...super, dass es klappt!
Das ist das gute an diesem Forum: Hier werden Sie geholfen! =D>
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.