PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pproblem mit Schalter und Displayansteuerung



fofi1
11.02.2009, 15:28
Hi,
ich will einen Atmega an ein Display und 2 schaltern anschließen.
Wenn beide Schalter an sind gibt der atmega einen Text übers Display aus.Programmiersprache ist Bascom.
Hardwaretechnisch ist alles fertig, aber ich hab keine Ahnung wie ich die beiden Taster ansteuern soll.
ich bräuchte für die roten Unterstriche einen Befehl beide Taster zu verknüpfen:

If Portb.4__Portb.3 = 0 Then
Cls
Locate 1 , 1
Lcd "Test"
End If

Außerdem hab ich als Display ein LCD 161A von Reichelt mit 1x16 Zeichen.
Ich steuere es wie im RN-Wiki beschrieben an, es kann aber nur 8 Zeichen anzeigen.
Hier der Code:

Config Lcd = 16 * 1
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Config Lcdbus = 4

Hoffe ihr könnt mir helfen.

Sauerbruch
11.02.2009, 18:13
Moin,

klar können wir helfen O:)

Zum Thema Display: Manche 16-stelligen Displays sind in Wahrheit 2*8-stellig, d.h. man muss so tun, als ob alles ab der 9. Stelle in die "zweite Zeile" geschrieben wird. Bascom erledigt das ganz automatisch, wenn Du

Config LCD = 16*1a
schreibst. Probier´s mal aus - wahrscheinlich geht´s dann.

Vorher solltest Du Dir aber nochmal in´s Gedächtnis rufen, dass man
Eingänge mit PINX.Y abfragt! Die Zeile mit den roten Strichen muss also heißen

If Pinb.4__Pinb.3 = 0 Then

Und mit welchem Befehl man die beiden Bedingungen verknüpfen kann, das findest Du in der Bascom-Hilfe an folgender Stelle:
Kapitel: Bascom Language fundamentals
Unterkapitel: Language Fundamentals
Überschrift: Logical Operators

Gutes Gelingen - und viel Spaß beim Stöbern in der Bascom-Hilfe! Kaum wo anders kann man soooo viel lernen!!

Daniel

Bauteiltöter
11.02.2009, 18:14
du musst PINX.x schreiben!

Und zum verknüpfen musst du schreiben


If PINB.4=PINB.3 then 'gleich

oder

If PINB.4<PINB.3 then 'PINB.4 kleiner

oder

If PINB.4>PINB.3 then 'PINB.4 größer



Zum LCD: Versuch mal


Config Lcd =8*2
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Config Lcdbus = 4


Dann must du für die letzten acht zeichen in die 2te Zeile springen ;)

MfG

fofi1
11.02.2009, 20:53
So hab jetzt einen neuen code. das display zeigt nur schwarze Balken und manchmal Wortfetzen. mit der hardware stimmt alles.

Der Code

'Pinb.4= Anschalter ( Immer auf 0 )
'Pinb.3= handbetriebsschalter
'Pinb.2= testschalter
'Pinb.1= Automatikschalter



$regfile = "m8def.dat"
$crystal = 1000000

Config Lcd = 16 * 1a

Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Config Lcdbus = 4

Config Pinb.1 = Input
Config Pinb.2 = Input
Config Pinb.3 = Input
Config Pinb.4 = Input
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
If Pinb.4 = 0 Then
Cls
Locate 1 , 1
Lcd "Power on"
End If

If Pinb.4 = Pinb.2 Then
Cls
Locate 1 , 1
Lcd "Test"
End If

If Pinb.4 = Pinb.3 Then
Cls
Locate 1 , 1
Lcd "Handbetrieb"

End If

If Pinb.4 = Pinb.1 Then
Cls
Locate 1 , 1
Lcd "Automatik"


End If

Jon
11.02.2009, 21:17
Ist das dein vollständiges Programm?
Wenn ja, dann fehlt da auf jeden Fall noch eine Do-Loop-Schleife.

So dem Problem mit den Balken:
Füge mal nach dem

Config Lcd = 16 * 1a

Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Config Lcdbus = 4

noch ein initLCD ein. Dann kann schon mal helfen.
Des Weiteren; verwendest du wirklich einen 1MHz Quarz? Ist diese Einstellung falsch, kann es auch zu Fhelern kommen.

Mehr fällt mir gerade nicht ein.
Trotzdem will ich noch etwas allgemeines los werden: Es macht Sinn, dem Programm auch oprisch eine Struktur zu verpassen. Dann ist es deutlich leichter zu lesen.
Ein Vorschlag von mir (samt oben genannten Verbesserungsvorschlägen, Kommentierungen wird BASCOM dir automatisch nach rechts rücken):

$regfile = "m8def.dat"
$crystal = 1000000 '1MHz Quarz

Config Lcd = 16 * 1a

Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Config Lcdbus = 4
InitLCD

Config Pinb.1 = Input 'Pinb.1= Automatikschalter
Portb.1 = 1 'Pull-Up an
Config Pinb.2 = Input 'Pinb.3= handbetriebsschalter
Portb.2 = 1 'Pull-Up an
Config Pinb.3 = Input 'Pinb.2= testschalter
Portb.3 = 1 'Pull-Up an
Config Pinb.4 = Input 'Pinb.4= Anschalter ( Immer auf 0 )
Portb.4 = 1 'Pull-Up an

'---Start_Main-Program---
Do

If Pinb.4 = 0 Then
Cls
Locate 1 , 1
Lcd "Power on"
End If

If Pinb.4 = Pinb.2 Then
Cls
Locate 1 , 1
Lcd "Test"
End If

If Pinb.4 = Pinb.3 Then
Cls
Locate 1 , 1
Lcd "Handbetrieb"
End If

If Pinb.4 = Pinb.1 Then
Cls
Locate 1 , 1
Lcd "Automatik"
End if

Loop
'---End_Main-Program---

End


Viele Grüße,
jon

fofi1
12.02.2009, 06:03
@ john: Danke jetzt funktionierts.
@ all:Find ich echt super, dass man in diesem forum präzise, schnelle und hilfreiche Antworten bekommt. Schade dass das Forum wegen meinem langsamen Internet so lange zum Laden braucht.

Jon
12.02.2009, 15:53
Das langsame Laden liegt nur bedingt an deinem Netz-Anschluss.
Der Server ist momentan etwas überbelastet. Dies wird sich aber in absehbarer Zeit durch einen Umzug und der Verwendung eines anderen Systems ändern.
Wird aber leider noch etwas dauern...

jon

fofi1
12.02.2009, 19:52
Hi,
es geht doch ned. Das Display flackert wild zwischen automatik und Power on. an den Eingangspins für die Schalter sind 4,7 V Spannung (normal? ). Werde die nächsten tage noch einen Schaltplan hochladen. Wie kann man übrigens die Fusbits für den Atmega 8 in Ponyprog so verändern, dass man einen externen Quarz dranhängen kann ( hatte es mal aufgeschrieben, finds aber nirgendwo. ) ? In dem Gehäuse, in dem die Displayansteuerung und das Display verbaut sind, hat ungefähr 50 Kabel( Durchmesser 1,5mm) durch die 12V von einem Bleiakku fließen. Kann es sein, dass in dem Gehäuse solch ein Elektromagnetisches Chaos herrscht, dass der Atmega nicht richtig arbeitet?

mfg,
Florian

fofi1
12.02.2009, 20:13
Hi,
hab grad nochmal nur die Displayansteuerung + Display mit strom versorgt, die Schalter alle abgesteckt und..... er zeigt ohne eingang von Signalen immer diesen schnellen wechsel an. K.a. warum. Mit Hello world geht das Display, an dem liegts ned.

Mfg,
Flo

Jon
12.02.2009, 20:31
Ich kann es gerade nicht testen, würde aber mal tippen, dass die logische Verknüpfung mit dem if pinx.y = pinx.y nicht stimmt, was zu der blöden Anzeige führt.
Versuch das mal nach diesem Prinzip:

If Pinb.4 = 0 AND Pinb.2 = 0 Then

Theoretisch müsste das klappen.

jon

Sauerbruch
12.02.2009, 20:43
wenn ich das richtig verstanden habe, liegt an PINB.4 der "An"-Schalter, der den Eingang immer auf 0 legt.

Damit ist die Bedingung "If PINB.4 = 0" immer gegeben, d.h. er schreibt immer als erstes in der Do-Loop-Schleife "Power On", und dann als zweites z.B. "Automatik". Und dann fängt er wieder von vorne an. Und das führt zum "Flackern" zwischen den beiden Anzeigen.

Ich würde das z.B. so machen:





Do

CLS
Locate 1,1

If Pinb.4 = 0 then

If Pinb.2 = 0 then
LCD "Test"
End if

If Pinb.3 = 0 then
LCD "Handbetrieb"
End if

If Pinb.1 = 0 then
LCD "Automatik"
End if

Else
LCD "Power On"
End if
Loop


Wahrscheinlich musst Du vor das CLS noch ein paar wait-Millisekunden (z.B. 100) tun - sonst flackert´s nämlich auch ziemlich, weil das Programm ein paar hundert mal pro Sekunde den "CLS"-Befehl abarbeitet.