PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : portpins abfragen und am LCD ausgeben



Dj_Beat
05.11.2007, 08:26
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

Andun
05.11.2007, 09:31
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

Dj_Beat
05.11.2007, 09:33
das problem ist eher die "UND"-verknüpfung...
also wenn PA0 und PA1 high-pegel haben, soll LCD eine "3" ausgeben.

for_ro
05.11.2007, 09:40
Da brauchst du nix zu verknüpfen.
Gib einfach

LCD pina

aus und schon haste den kompletten Port dezimal auf dem Display.

Gruß

Rolf

Dj_Beat
05.11.2007, 09:41
> LCD pina

und was wird das?
Gruss Thomas

for_ro
05.11.2007, 09:43
Was meinst du mit

"und was wird das?"

Gruß

Rolf

Dj_Beat
05.11.2007, 09:53
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

for_ro
05.11.2007, 10:38
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

Dj_Beat
05.11.2007, 10:48
@ 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.

Dj_Beat
05.11.2007, 14:05
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, 14: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

Dj_Beat
05.11.2007, 15:03
@ Christopher1
danke, es funktioniert! :)))

Sauerbruch
05.11.2007, 16: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

Dj_Beat
07.11.2007, 06:31
> 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.

Dj_Beat
07.11.2007, 07:04
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, 10: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!

Dj_Beat
07.11.2007, 10:19
Das problen ist gelöst.
aber noch ein ist da.
gibt es sowas auch für einen Grey-Code?
Danke

Sauerbruch
07.11.2007, 10: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!

Dj_Beat
07.11.2007, 10:49
und sowas wie "GRAY2DEZ" gibt es nicht?

Sauerbruch
07.11.2007, 11: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.

Dj_Beat
07.11.2007, 11:16
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.

Dj_Beat
07.11.2007, 11:43
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, 11: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...

Dj_Beat
07.11.2007, 12:48
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, 13: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~

Dj_Beat
07.11.2007, 14:16
Danke!
Super, es funktioniert!!!!!!
wie soll ich dir danken?

Sauerbruch
07.11.2007, 20:06
...super, dass es klappt!
Das ist das gute an diesem Forum: Hier werden Sie geholfen! =D>