PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AD Port richtig anschliessen



zwanzischmark
04.01.2005, 12:36
ich hab jetz hier schon länger gesucht aber irgendwie nicht so wirklich gefunden wie ich einen AD Port richtig anschliesse. Testweise hab ich mal einfach einen taster wie unten auf dem Bild angeschlossen und mit WAIT abgefragt. Funktionieren tut das ganze, aber mir kommts komisch vor. Kann mir also mal jemand kurz sagen ob die schaltung unten richtig ist, oder wie mans richtig anschliesst?

RCO
04.01.2005, 12:48
ICh vertehe nicht ganz denn Sinn deiner Schaltung. Der AD-Wandler wird dir entweder 0 oder einen bestimmten Wert liefern, der Abhängig von der Referenz-Spannung ist. Nimm doch einfach einen Poti (5 oder 10 K) schließ ihn an MAsse, AD-Port, Vcc. Und dreh dann ein wenig rum.

MFg Moritz

zwanzischmark
04.01.2005, 13:00
es geht ja nicht um die schaltung... das ist nur ein beispiel was genau den zweck erfüllen soll den du genannt hast darum gehts ja nicht. Ich wollte ja einfach nur allgemein wissen ob das so richtig angeschlossen ist. Es geht einfach darum das ich meine Tastatur in dieser form angeschlossen hab. Habe nur das beispiel hierfür vereinfacht...

Tappi
04.01.2005, 21:28
Hallo,

mit einem Analogen Eingang kann man Spannungen messen (bei URef = 5V mit der C-Control Spannungen von 0V bis 5V mit einer Auflösung von 5V/255 = (etwa) 19,6 mV.

Der Schaltplan da oben ist ein Spannungsteiler. Normalerweise schließt man an die Analogports Sensoren, z.B. Temperatursensoren, die in Abhängigkeit der Temperatur ihren Widerstand ändern. Mit dem Spannungsteiler kann man dann über den festen Widerstand oberhalb (manchmal auch unterhalb) des Sensors die am Sensor abfallende Spannung messen und darüber den Widerstand des Sensors. Mit Hilfe von Funktionen, Listen oder Graphen kann man dann die zugehörige Messgröße (z.B. Temperatur) zum Messwert ermitteln.

Manche Tastaturen werden ebenfalls an einen AD Port angeschlossen. Dabei hat jede Taste einen eigenen Widerstand, somit lässt sich über den gemessenen Widerstand die gedrükte Taste ermitteln. Theoretisch sind so 255 Tastenerkennungen möglich, in der Praxis sollte man jedoch die Messungenauigkeiten etc. beachten.

Gruß,

Stefan

zwanzischmark
04.01.2005, 21:44
vielen dank für die ausführliche Antwort. Ihr Übertrefft mit euren Antworten aber einfach meine Frage. Wollte ja einfach nur wissen ob die Schaltung so richtig ist oder nicht. Ein einfaches ja hätte also genügt. Manche von euch sind einfach zu übereifrig ;) Ich habe einfach nur die Tastenerkennung selbst gebaut und nicht die vorlage wie z.B. beim aplicationboard genommen und wollte mich einfach nur vergewissern das ich nichts kaputt mache. Die tasteneingabe funktioniert ja fehlerlos, aber mir sahs so aus als wär in allen schaltungen die ich gesehen hab der AD-Port anders angesteuert. Das ganze ist für ein Projekt in dem ich mit der eingabe von Zahlen bis 24 die Beleuchtung für eine Bühne steuern kann. Also 24 Lampen an und aus. Desweiteren kann ich dann 10 beleuchtungseinstellungen abspeichern und laden...

mfg Paul

Tappi
04.01.2005, 21:55
Hallo,

mehr als 5 V vertragen die AD Ports nicht. Bei 5 V wird der Wert 255 angezeigt. Wenn Du den Port gegen gemeinsame Masse schließt sollte 0 stehen. Bei mir steht aber immer was zwischen 5 und 10. Du solltest also die Fehlertoleranzen nochmal checken. Bei 24 möglichen Zustände könnte es noch klappen. An jedem Widerstand sollte dann jeweils ein vielfaches von 0,208 V abfallen.

Einfacher und sicherer wäre es aber mit Digitalports. Mit einem PCF8574 kannst du die Ports über I²C Bus erweitern (auf wirklich viele Ports!). Ports ermöglichen dabei mehrere gedrückte Tasten abzufragen. Außerdem muss man bei Ports nichts mit Widerständen beachten (solange sie Eingänge sind und gegen Masse geschlossen werden).

Gruß,

Stefan

zwanzischmark
04.01.2005, 22:01
habe eine Drucktastatur von Conrad mit 12 tasten das Funktioniert schon alles wunderbar mit dem AD-Port. Habe jetzt abstände von 10 bis 25 das sollte ja als sicherheit locker ausreichen. Den PCF8574 benutze ich auch schon 2mal um auf 24 Digitalports zu kommen und ein Display anzusteuern. Also ist eigentlich alles schon perfekt und funktioniert. Die sache mit dem höheren wert als 0 wenn nur masse Dran ist hatte ich auch bis ich gemerkt hab das mein widerstand einfach zu gross ist vor masse. Den hab ich jetzt auf 1,2k verkleinert und jetzt hab ich auch wirklich die 0

meine frage war eigentlich überflüssig wollte nur sichergehen

danke nochmal


mfg Paul

Tappi
04.01.2005, 22:05
tja ich habe da gar nix bei Masse und immernoch irgendwas über 5 in AD. Aber vermutlich habe ich mir bei meinen ganzen Tests die C-Control schon richtig kaputt gemacht. An der einen C-Control hingen mal 4 Amper dran (aber eine sehr kleine Spannung). Die lebt nicht mehr.

Gruß,

Stefan

recycle
05.01.2005, 01:07
@zwanzischmark


vielen dank für die ausführliche Antwort. Ihr Übertrefft mit euren Antworten aber einfach meine Frage. Wollte ja einfach nur wissen ob die Schaltung so richtig ist oder nicht. Ein einfaches ja hätte also genügt. Manche von euch sind einfach zu übereifrig


Wenn man das Schaltbild das du gepostet hast alleine ansieht, wird die Schaltung so wohl funktionieren, aber sehr sinnvoll ist die so meiner Meinung nach nicht.

Wenn der Schalter offen ist, liegen 10k zwischen Port und Masse, dass ist keine besonders gute Ausgangslage um sauber den Wert 0 zu erfassen.

Wenn der Schalter geschlossen ist, liegen wegen dem 10k Widerstand knapp 97% von Uref am Port an.
D.h. je nach Schalterstellung liegen ungefähr 0V oder ungefähr Uref an. Diesen Messbereich kann man einfacher mit einem Digitalport erfassen.

Ob diese Schaltung im Zusammenhang mit deinem Tastaturpad sinnvoll ist, hängt davon ab wie das Pad aufgebaut ist. Aber offensichtlich war der 10k Widerstand dafür auch nicht besonders geeignet sonst hättest du ihn ja nicht ausgetauscht.

BlueNature
05.01.2005, 05:05
habe eine Drucktastatur von Conrad mit 12 tasten das Funktioniert schon alles wunderbar mit dem AD-Port. Habe jetzt abstände von 10 bis 25 das sollte ja als sicherheit locker ausreichen. Den PCF8574 benutze ich auch schon 2mal um auf 24 Digitalports zu kommen und ein Display anzusteuern. Also ist eigentlich alles schon perfekt und funktioniert. Die sache mit dem höheren wert als 0 wenn nur masse Dran ist hatte ich auch bis ich gemerkt hab das mein widerstand einfach zu gross ist vor masse. Den hab ich jetzt auf 1,2k verkleinert und jetzt hab ich auch wirklich die 0

meine frage war eigentlich überflüssig wollte nur sichergehen

danke nochmal

mfg Paul

Hallo zwanzischmark,

du musst aufpassen mit den Eingängen. Du hast deswegen mehr als 0 weil entweder deine Masse nicht sauber ist. Dann zieh eine Leitung direkt vom GND-Pin der CC zur Tastatur oder dem Widerstand. Das andere was ich auch einmal festgestellt hatte als ich diese Spannungsleiter aufgebaut hatte war das mit den der im Applikation-Board angegebenen Werten der Analog-Pin sehr sensibel reagiert auf Magnetische Störfelder. D.h. er reagiert wie eine Antenne. Du kannst dir deinen AD-Port zum einen schützen durch eine 5V1-Z-Diode mit Anode an AD-In und Kathode an GND und zum andern deine Hochfrequenz oder Netzfrequenz etwas eliminieren indem du einen 10nF - 68nF MKT-Kondensator (rotes Kästchen) noch dazu parallel schaltest. Dann wird die Antennenfunktion die ja nicht erwünscht ist etwas unterbunden und es kommt nicht zu unwillkürlichen Tasterbetätigungen. Kannst auch noch einen Test machen wie ich es getan habe. Ich habe die Schaltung euf meinen Scanner gelegt. Der produziert beim Scannen ein sehr hohes elektrisches Störfeld durch die Lampe. Wenn es da OK ist hast du schon Gewissheit das es auch recht sauber entstört ist nach aussen.

Grüsse Wolfgnang

Anbei noch einen Code den ich einmal geschrieben hatte für ein Projekt. Das kann die Taster in der Art auswerten. Das ist bisschne Code aus meinem Projekt herausgeschnippelt. Hab den speziell fr ein Projekt geschrieben und genau die Werte für die Spannungsleiter verwendet die auch im Schaltplan des Applikationn-Boards verwendet werden.



'Tastennummern definieren
'------------------------
Define KeyStern 11
Define KeyKreuz 10
Define Key1 1
Define Key2 2
Define Key3 3
Define Key4 4
Define Key5 5
Define Key6 6
Define Key7 7
Define Key8 8
Define Key9 9
Define Key0 0
Define KeyNone 99

...

Define Tastatur AD[1] 'Analog-Port der 10er-Tastatur
...

#ResetSystem
Betrieb = On
GoSub LCDReset 'Das LC-Display initialisieren im 4-Bit Modus
GoSub PotReset 'Digitales Potentiometer rücksetzen auf Minimum
GoSub GetTastatur
Buzzer = On
If KeyNr = Key1 Then Buzzer = Off
KeyLock = On
If KeyNr = Key2 Then KeyLock = Off
GoSub SignalTon3
Sys LcdCmd LcdClear
Pause 1
VarTextNr = TxtVersion1
Sys LcdCmd Z1S1
GoSub LCDWriteText
VarTextNr = TxtVersion2
Sys LcdCmd Z2S1
GoSub LCDWriteText
Pause 80
Sys LcdCmd LcdClear
Pause 1
'Hochlauf-Meldung
For ii = TxtBootUp1 + 8 To TxtBootUp1 Step -1
Sys LcdCmd Z1S5
VarTextNr = ii
GoSub LCDWriteText
Pause 4
Next ii
For ii = TxtBootUp2 + 12 To TxtBootUp2 Step -1
Sys LcdCmd Z2S3
VarTextNr = ii
GoSub LCDWriteText
Pause 4
Next ii
Pause 200
Sys PotGoPos 50

#PasswortSchutz 'Passwortschutz für das System
If KeyLock = Off Then GoTo MenuAuswahl
Sys LcdCmd LcdClear
Pause 1
Sys LcdCmd Z1S3
VarTextNr = TxtPasswort
GoSub LCDWriteText
Sys LcdCmd Z2S5
Sys LcdChar &H7E
Sys LcdCmd Z2S12
Sys LcdChar &H7F
Stelle = 0
GoSub SignalTon4

#PasswortNextOK
Stelle = Stelle + 1
#PasswortNextOKWait1 'Auf Tastendruck warten
If Tastatur < 245 Then GoTo PasswortNextOKWait1
#PasswortNextOKWait2
Sys LcdCmd Z2S5
If Second Mod 2 = 0 Then Sys LcdChar &H7E Else Sys LcdChar &H20
Sys LcdCmd Z2S12
If Second Mod 2 = 0 Then Sys LcdChar &H7F Else Sys LcdChar &H20
Pause 2
If Tastatur > 245 Then GoTo PasswortNextOKWait2
GoSub GetTastatur
Sys LcdCmd Z2S6 + Stelle 'Sternchen auf Display ausgeben
Sys LcdChar xSt
LookTab TabPasswort, Stelle, TempByte 'Pasworteingabe prüfen auf richtige Eingabe
If Stelle <= 4 And KeyNr = KeyKreuz Then GoTo PasswortSchutzError
If Stelle > 4 And KeyNr = KeyKreuz Then GoTo PasswortOK
If KeyNr = KeyStern Then GoTo PasswortSchutz
If Stelle <= 4 And KeyNr <> TempByte Then GoTo PasswortNextError
If Stelle > 4 Then GoTo PasswortOK 'Maximale Anzahl von Stellen erreicht
If TempByte = KeyNr Then GoTo PasswortNextOK 'Richtige Eingabe
GoTo PasswortNextError 'Falsche Eingabe

#PasswortNextError
Stelle = Stelle + 1
#PasswortNextErrorWait1 'Auf Tastendruck warten
If Tastatur < 245 Then GoTo PasswortNextErrorWait1
#PasswortNextErrorWait2
Sys LcdCmd Z2S5
If Second Mod 2 = 0 Then Sys LcdChar &H7E Else Sys LcdChar &H20
Sys LcdCmd Z2S12
If Second Mod 2 = 0 Then Sys LcdChar &H7F Else Sys LcdChar &H20
Pause 2
If Tastatur > 245 Then GoTo PasswortNextErrorWait2
GoSub GetTastatur
Sys LcdCmd Z2S6 + Stelle 'Sternchen auf Display ausgeben
Sys LcdChar xSt
If KeyNr = KeyKreuz Then GoTo PasswortSchutzError
If KeyNr = KeyStern Then GoTo PasswortSchutz
If Stelle <= 4 Then GoTo PasswortNextError
If Stelle > 4 Then GoTo PasswortSchutzError 'maximale Anzahl von Stellen erreicht
GoTo PasswortNextError

#PasswortSchutzError
Sys LcdCmd LcdClear
Pause 1
Sys LcdCmd Z2S3
VarTextNr = TxtPasswortErr
GoSub LCDWriteText
Sys LcdCmd Z1S1
VarTextNr = TxtSperre
GoSub LCDWriteText
Second = 0
#PasswortSchutzErrorWait
TempByte = 20 - Second 'Count-Down für die System-Sperre
Sys LcdCmd Z1S15
GoSub LCDWriteCount8Bit
Sys LcdChar x__
If Second < 20 Then GoTo PasswortSchutzErrorWait
GoTo PasswortSchutz

#PasswortOK 'Passwort wurde richtig eingegeben
Sys LcdCmd Z2S1 'Meldung anzeigen für richtige Eingabe des Passworts
VarTextNr = TxtPasswortOK
GoSub LCDWriteText
Pause 100 'Eine Sekunde warten
Sys LcdCmd LcdClear

#MenuAuswahl
ProgrammNr = 1 'Auf erstem Programm beginnen
#MenuAuswahlNeu
Sys LcdCmd Z1S1 'Auswahlmenü anzeigen
VarTextNr = TxtAuswahl
GoSub LCDWriteText

...


' Tastatur einlesen:
' ------------------
' Die 10er-Tastatur einlesen und die gedrückte Taste decodieren als Zahlenwert
' in eine Variable die nach Rückkehr aus diesem Unterprogramm direkt ausgewertet
' werden kann. Ist keine gültige Taste gedrückt oder keine Taste gedrückt, wird
' der Wert 99 zurückgeliefert

#WaitTastatur 'Auf einen Tastendruck warten
If Tastatur <= 245 Then GoTo WaitTastatur
#WaitTastaturX
If Tastatur > 245 Then GoTo WaitTastaturX

#GetTastatur 'Aktuell gedrückte Taste zurückliefern
If Tastatur > 245 Then GoTo GetTastaturNoKey
KeyNr = KeyNone
For ii = 0 To 11 'Eine Taste ist gedrückt
LookTab TabKeyCodes, ii, TempByte 'Tastencode ermitteln
If Abs(Tastatur - TempByte) < 3 Then KeyNr = ii
Next ii
If KeyNr <> KeyNone Then GoSub SignalTon1 'Signalton bei gültigem Tastendruck ausgeben
Return

#GetTastaturNoKey 'Keine Taste gedrückt
KeyNr = KeyNone
Return

...

'Tabelle mit den Tastaturwerten:
'-------------------------------
' Die Mittelwerte der einzelnen Tasten mit einer Tolleranz von +/-3 Einheiten

Table TabKeyCodes
'0 1 2 3 4 5 6 7 8 9 # *
153 173 90 0 193 111 23 215 132 46 68 236
TabEnd

'Tabelle Potiwerte
Table TabFreqPot
'0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
100 100 100 100 95 91 86 82 77 73 68 64 59 55 50 45 41 36 32 27 23 18 14 9 5 0
TabEnd

'Tabelle für das Zugangs-Passwort
Table TabPasswort
4 Key0 Key0 Key0 Key7
TabEnd

zwanzischmark
05.01.2005, 08:25
Das mit der Masse war so, weil der Widerstand einfach zu gross war das funktioniert jetzt und mehr als 5V hab ich so oder so nicht, also von daher keine gefahr. Ich hab das ganze nicht so aufgebaut wie auf dem Applikation board, sondern einfach jede Taste mit einem anderen Widerstand versehen. Vom Prinzip also gleich aber anders aufgebaut.

Das mit dem Störfeld ist ein guter Tipp, denn ich bin fast verzweifelt als das ding im Wohnzimmer immer gepiept hat und bei mir im Zimmer Problemlos lief. Lag wohl an der Fussbodenheizung. Muss mal schauen obs immernoch Probleme gibt. Hab so langsam keine Lust mehr zu conrad zu laufen ;) aber ich werds mir auf jeden Fall merken.

Was deinen Code angeht.... ich glaube ich hab schonmal gesagt das ich nich so der klasse Programierer bin, also so wird ein code bei mir nie aussehen. Solang ichs hingrieg bin ich mit meinem trotzdem recht zufrieden. kannst dir ja ma angucken was ich da verbockt hab. fehlt eigentlich nur noch die ausgabe aufs LCD.


DEFINE PCFAdresse Byte[1] 'erste sein! Bytevar $0A1
DEFINE PCFDaten Byte[2] 'zweite sein!Bytevar $0a2
DEFINE Preset02 BYTE
DEFINE Preset12 BYTE
DEFINE Preset22 BYTE
DEFINE Preset32 BYTE
DEFINE Preset42 BYTE
DEFINE Preset52 BYTE
DEFINE Preset62 BYTE
DEFINE Preset72 BYTE
DEFINE Preset82 BYTE
DEFINE Preset92 BYTE
DEFINE NR BYTE
DEFINE NR2 BYTE
DEFINE key BYTE
DEFINE Preset01 WORD
DEFINE Preset11 WORD
DEFINE Preset21 WORD
DEFINE Preset31 WORD
DEFINE Preset41 WORD
DEFINE Preset51 WORD
DEFINE Preset61 WORD
DEFINE Preset71 WORD
DEFINE Preset81 WORD
DEFINE Preset91 WORD
DEFINE Ports1 WORDPORT[1]
DEFINE key2 AD[6]
DEFINE L01 port[1]
DEFINE L02 port[2]
DEFINE L03 port[3]
DEFINE L04 port[4]
DEFINE L05 port[5]
DEFINE L06 port[6]
DEFINE L07 port[7]
DEFINE L08 port[8]
DEFINE L09 port[9]
DEFINE L10 port[10]
DEFINE L11 port[11]
DEFINE L12 port[12]
DEFINE L13 port[13]
DEFINE L14 Port[14]
DEFINE L15 Port[15]
DEFINE L16 Port[16]
DEFINE a 97
DEFINE b 98
DEFINE c 99
DEFINE d 100
DEFINE e 101
DEFINE f 102
DEFINE g 103
DEFINE h 104
DEFINE i 105
DEFINE j 106
DEFINE k 107
DEFINE l 108
DEFINE m 109
DEFINE n 110
DEFINE o 111
DEFINE p 112
DEFINE q 113
DEFINE r 114
DEFINE s 115
DEFINE t 116
DEFINE u 117
DEFINE v 118
DEFINE w 119
DEFINE x 120
DEFINE y 121
DEFINE z 122

#AllOff
Ports1 = OFF

#start
GOSUB Eingabe

if NR2 = 0 and NR = 0 then goto AllOff 'Alle ausschalten
if NR2 > 9 and NR < 10 then goto error 'Nur zweistellige Zahlen zulassen
if NR = 11 then goto menu1 'Menü Laden/Speichern aufrufen
if NR2 <> 0 And NR = 12 then goto schalten 'Bei Korrekter Eingabe schalten
if NR2 = 0 And NR = 12 then goto error 'Enter ohne Eingabe -> Error
if NR2 = 0 then goto Ziffer1 'Zwischenspeicher leer -> erste Stelle zwischenspeichern
NR2 = NR + NR2 * 10 'zweite Stelle Berechnen
goto start

#Ziffer1
NR2 = NR 'erste stelle zwischenspeichern
goto start

#reset
NR2 = 0 'zwischenspeicher löschen
goto start

#error
beep 400,25,10
goto reset

#schalten
if NR2 = 1 then TOG L01
if NR2 = 2 then TOG L02
if NR2 = 3 then TOG L03
if NR2 = 4 then TOG L04
if NR2 = 5 then TOG L05
if NR2 = 6 then TOG L06
if NR2 = 7 then TOG L07
if NR2 = 8 then TOG L08
if NR2 = 9 then TOG L09
if NR2 = 10 then TOG L10
if NR2 = 11 then TOG L11
if NR2 = 12 then TOG L12
if NR2 = 13 then TOG L13
if NR2 = 14 then TOG L14
if NR2 = 15 then TOG L15
if NR2 = 16 then TOG L16
if NR2 < 17 then goto reset

PCFadresse = 64 'Adresse PCF8574 mit a0-A2
sys &h0126 'PCF8574 Lesen, Ergebnis in PCFDaten

if NR2 = 17 AND (PCFDaten AND &B00000001) > 0 then PCFDaten = PCFDaten AND &B11111110 ELSE if NR2 = 17 AND (PCFDaten AND &B00000001) = 0 then PCFDaten = PCFDaten OR &B00000001
if NR2 = 18 AND (PCFDaten AND &B00000010) > 0 then PCFDaten = PCFDaten AND &B11111101 ELSE if NR2 = 18 AND (PCFDaten AND &B00000010) = 0 then PCFDaten = PCFDaten OR &B00000010
if NR2 = 19 AND (PCFDaten AND &B00000100) > 0 then PCFDaten = PCFDaten AND &B11111011 ELSE if NR2 = 19 AND (PCFDaten AND &B00000100) = 0 then PCFDaten = PCFDaten OR &B00000100
if NR2 = 20 AND (PCFDaten AND &B00001000) > 0 then PCFDaten = PCFDaten AND &B11110111 ELSE if NR2 = 20 AND (PCFDaten AND &B00001000) = 0 then PCFDaten = PCFDaten OR &B00001000
if NR2 = 21 AND (PCFDaten AND &B00010000) > 0 then PCFDaten = PCFDaten AND &B11101111 ELSE if NR2 = 21 AND (PCFDaten AND &B00010000) = 0 then PCFDaten = PCFDaten OR &B00010000
if NR2 = 22 AND (PCFDaten AND &B00100000) > 0 then PCFDaten = PCFDaten AND &B11011111 ELSE if NR2 = 22 AND (PCFDaten AND &B00100000) = 0 then PCFDaten = PCFDaten OR &B00100000
if NR2 = 23 AND (PCFDaten AND &B01000000) > 0 then PCFDaten = PCFDaten AND &B10111111 ELSE if NR2 = 23 AND (PCFDaten AND &B01000000) = 0 then PCFDaten = PCFDaten OR &B01000000
if NR2 = 24 AND (PCFDaten AND &B10000000) > 0 then PCFDaten = PCFDaten AND &B01111111 ELSE if NR2 = 24 AND (PCFDaten AND &B10000000) = 0 then PCFDaten = PCFDaten OR &B10000000

sys &h0101 'PCF8574 mit Daten = PCFDaten schreiben

if NR2 > 24 and NR2 < 99 then goto error
'if NR2 = 99 then goto P99
goto reset

#menu1
'abfragen ob speichern oder Laden (* | #)
GOSUB Eingabe
if NR = 11 then goto menu2
if NR = 12 then goto menu3
goto error

#menu2
GOSUB Eingabe
if NR2 = 0 and NR = 0 then goto error '0 --> error
if NR2 > 9 and NR < 10 then goto error 'Nur zweistellige Zahlen zulassen
if NR = 11 then goto error ' * -> error
if NR2 <> 0 And NR2 <= 10 And NR = 12 then goto Laden 'Laden zwischen Speicherplatz 1 und 10
if NR2 = 0 And NR = 12 then goto error 'Enter ohne Eingabe -> Error
if NR2 = 0 then goto Ziffer1 'Zwischenspeicher leer -> erste Stelle zwischenspeichern
NR2 = NR + NR2 * 10 'zweite Stelle Berechnen
goto menu2

#menu3
GOSUB Eingabe
if NR2 = 0 and NR = 0 then goto error '0 --> error
if NR2 > 9 and NR < 10 then goto error 'Nur zweistellige Zahlen zulassen
if NR = 11 then goto error ' * -> error
if NR2 <> 0 And NR2 <= 10 And NR = 12 then goto Speichern 'Speicherplatz zwischen 1 und 10
if NR2 = 0 And NR = 12 then goto error 'Enter ohne Eingabe -> Error
if NR2 = 0 then goto Ziffer1 'Zwischenspeicher leer -> erste Stelle zwischenspeichern
NR2 = NR + NR2 * 10 'zweite Stelle Berechnen
goto menu3

#Input
OPEN# FOR READ
if EOF then goto error
INPUT# Preset01
INPUT# Preset11
INPUT# Preset21
INPUT# Preset31
INPUT# Preset41
INPUT# Preset51
INPUT# Preset61
INPUT# Preset71
INPUT# Preset81
INPUT# Preset91
INPUT# Preset02
INPUT# Preset12
INPUT# Preset22
INPUT# Preset32
INPUT# Preset42
INPUT# Preset52
INPUT# Preset62
INPUT# Preset72
INPUT# Preset82
INPUT# Preset92
CLOSE#
RETURN

#Laden
gosub Input
if NR2 = 1 then Ports1 = Preset01
if NR2 = 1 then PCFDaten = Preset02
if NR2 = 2 then Ports1 = Preset11
if NR2 = 2 then PCFDaten = Preset12
if NR2 = 3 then Ports1 = Preset21
if NR2 = 3 then PCFDaten = Preset22
if NR2 = 4 then Ports1 = Preset31
if NR2 = 4 then PCFDaten = Preset32
if NR2 = 5 then Ports1 = Preset41
if NR2 = 5 then PCFDaten = Preset42
if NR2 = 6 then Ports1 = Preset51
if NR2 = 6 then PCFDaten = Preset52
if NR2 = 7 then Ports1 = Preset61
if NR2 = 7 then PCFDaten = Preset62
if NR2 = 8 then Ports1 = Preset71
if NR2 = 8 then PCFDaten = Preset72
if NR2 = 9 then Ports1 = Preset81
if NR2 = 9 then PCFDaten = Preset82
if NR2 = 10 then Ports1 = Preset91
if NR2 = 10 then PCFDaten = Preset92
PCFadresse = 64 'Adresse PCF8574 mit a0-A2
sys &h0101 'PCF8574 mit Daten = PCFDaten schreiben
goto reset

#speichern
'wirklich speichern?
gosub Input
PCFadresse = 64 'Adresse PCF8574 mit a0-A2
sys &h0126 'PCF8574 Lesen, Ergebnis in PCFDaten
if NR2 = 1 then Preset01 = Ports1
if NR2 = 1 then Preset02 = PCFDaten
if NR2 = 2 then Preset11 = Ports1
if NR2 = 2 then Preset12 = PCFDaten
if NR2 = 3 then Preset21 = Ports1
if NR2 = 3 then Preset22 = PCFDaten
if NR2 = 4 then Preset31 = Ports1
if NR2 = 4 then Preset32 = PCFDaten
if NR2 = 5 then Preset41 = Ports1
if NR2 = 5 then Preset42 = PCFDaten
if NR2 = 6 then Preset51 = Ports1
if NR2 = 6 then Preset52 = PCFDaten
if NR2 = 7 then Preset61 = Ports1
if NR2 = 7 then Preset62 = PCFDaten
if NR2 = 8 then Preset71 = Ports1
if NR2 = 8 then Preset72 = PCFDaten
if NR2 = 9 then Preset81 = Ports1
if NR2 = 9 then Preset82 = PCFDaten
if NR2 = 10 then Preset91 = Ports1
if NR2 = 10 then Preset92 = PCFDaten
OPEN# FOR WRITE
if FILEFREE < 20 then goto error
PRINT# Preset01
PRINT# Preset11
PRINT# Preset21
PRINT# Preset31
PRINT# Preset41
PRINT# Preset51
PRINT# Preset61
PRINT# Preset71
PRINT# Preset81
PRINT# Preset91
PRINT# Preset02
PRINT# Preset12
PRINT# Preset22
PRINT# Preset32
PRINT# Preset42
PRINT# Preset52
PRINT# Preset62
PRINT# Preset72
PRINT# Preset82
PRINT# Preset92
CLOSE#
goto reset

#Eingabe
wait key2 > 10
key = key2
pause 20
if key >=0 and key <=70 then NR=0 ' 0
if key >=111 and key <=111 then NR=1 ' 1
if key >=111 and key <=111 then NR=2 ' 2
if key >=89 and key <=94 then NR=3 ' 3
if key >=95 and key <=109 then NR=4 ' 4
if key >=110 and key <=128 then NR=5 ' 5
if key >=129 and key <=149 then NR=6 ' 6
if key >=150 and key <=172 then NR=7 ' 7
if key >=273 and key <=193 then NR=8 ' 8
if key >=194 and key <=219 then NR=9 ' 9
if key >=220 and key <=244 then NR=11 ' *
if key >=245 and key <=255 then NR=12 ' #
RETURN

END
syscode "I2C_M.obj"

das schwierigste war für mich den TOG befehl auf PORTS des PCF8574 umzusetzen. Ich löse sowas immer auf eine komische Art die dann recht undurchschaubar aussieht.... hoffe es ist nich all zu doof Programiert 8-[

das ist der Befehl für um Port 17 umzuschalten:

if NR2 = 17 AND (PCFDaten AND &B00000001) > 0 then PCFDaten = PCFDaten AND &B11111110 ELSE if NR2 = 17 AND (PCFDaten AND &B00000001) = 0 then PCFDaten = PCFDaten OR &B00000001

Tappi
06.01.2005, 12:13
Was deinen Code angeht.... ich glaube ich hab schonmal gesagt das ich nich so der klasse Programierer bin, also so wird ein code bei mir nie aussehen. Solang ichs hingrieg bin ich mit meinem trotzdem recht zufrieden. kannst dir ja ma angucken was ich da verbockt hab. fehlt eigentlich nur noch die ausgabe aufs LCD.

Mit den neuen Basic Dialekten gehts eh schöner und strukturierter.

Gruß,

Stefan