Hallo, ich bin neu hier und habe ein paar Grundkenntnisse in Microcontrollerprogrammierung, aber ich habe einige Probleme einen Port Expander anzusteuern. Meine Hardware ist folgende: -MyAVR MK2 Board mit Atmega8 -MyTWI Port Expander -MYAVR LCD Ich kann leider nur den ganzen A-Port bzw. den ganzen B-Port ansteuern, aber nicht die einzelnen Bits. Des Weiteren habe ich versucht einen Eingang des Port Expanders mit einem "normalen" Eingang an der Hauptplatine mittels einer IF Funtion zu verknüpfen, auch das funktionerte nicht. Selbst eine simple Ansteuerung durch einen Ausgang direkt an der Hauptplatine mit einem externen Eingang funktionierte nicht. Habe früher schon mit dem Teil gearbeitet, aber bin da noch schlechter durchgestiegen als jetzt.
Rene P. schrieb: > Ich kann leider nur den ganzen A-Port bzw. den ganzen B-Port ansteuern, > aber nicht die einzelnen Bits. Das ist sehr bedauerlich. > Habe früher schon mit dem Teil gearbeitet, aber bin da noch schlechter > durchgestiegen als jetzt. Dann besteht doch Hoffnung. Nur Mut ...
Das Problem hierdran ist, das es sich hier um ein Projekt handelt, welches relativ schnell abgearbeitet werden muss und ich nur als Unterstützung helfe
Rene P. schrieb: > Das Problem hierdran ist, das es sich hier um ein Projekt handelt, > welches relativ schnell abgearbeitet werden muss und ich nur als > Unterstützung helfe Rene P. schrieb: > Ich kann leider nur den ganzen A-Port bzw. den ganzen B-Port ansteuern, > aber nicht die einzelnen Bits. Des Weiteren habe ich versucht einen Natürlich kann man nur den ganzen Port ansteuern, man kann aber vorher einzelne bits setzen, bzw. löschen. Hier ein Beispiel wie man Werte ausgibt (in Pseudo Sprache), da du nicht geschrieben hast, welche Sprache benutzt wird:
1 | Do
|
2 | I2C_Start() |
3 | I2C_Write(Adress) |
4 | I2C_Write(6) // PortA CONFIG |
5 | I2C_Write(0b00001111) // bits 7-4 AUSGANG, 3-0 EINGANG |
6 | I2C_Stop() |
7 | |
8 | Wert = 0x70 // Setze bits 4-6 |
9 | I2C_Start() |
10 | I2C_Write(Adress) |
11 | I2C_Write(2) // PORTA |
12 | I2C_Write(Wert) |
13 | I2C_Stop() |
14 | |
15 | Delay(1000) // 1000ms (1sec) warten |
16 | |
17 | Wert = Wert AND 0x30 // Jetzt wird bit 6 geloscht |
18 | I2C_Start() |
19 | I2C_Write(Adress) |
20 | I2C_Write(2) // PORTA |
21 | I2C_Write(Wert) |
22 | I2C_Stop() |
23 | |
24 | Delay(1000) // 1000ms (1sec) warten |
25 | Loop
|
:
Bearbeitet durch User
http://www.myavr.info/download/produkte/mytwi/techb_mytwi-portexpander_de_en.pdf [...] void outPorts(uint8_t data, uint8_t ackn) zur Übermittlung der gewünschten Pinbelegung (=data). [...] Liest sich zumindest beim Durchblättern der PDF ein wenig komisch. Hast du den Code aus der oben genannten Quelle genutzt? Wenn ja sollte es genügen das 0xFF aus der Funktion outPorts(1,0xFF) mit dem entsprechenden Hexwert zu ersetzen. z.B. 0x81 für das erste und letzte Bit an PortB.
1 | [...]
|
2 | data=readPorts(0); // Abfrage Pins an PortA |
3 | if(data == 0xFE) // Taster gedrückt |
4 | {
|
5 | outPorts(1,0xFF); // alle Pins an PortB geschalten |
6 | }
|
7 | else
|
8 | {
|
9 | outPorts(1,0x00); // kein Pin an PortB geschalten |
10 | }
|
11 | [...]
|
Oh sorry, in C sind wir da dran. Versuche grade einige andere Programme zusammen zusetzen, aber ich habe ständig Fehlermeldungen bezüglich fehlender Libs, obwohl ich diese auch im Projektordner abgelegt habe. Weder <> noch"" hilft mir da, habe auch schon den ganzen Pfad mit angegeben, aber das bringt auch nichts.
Ja den Code habe ich genutzt, habe auch schon die ganzen Eingänge A0-A7 / B0-B7 per Hex Wert rausgefunden.Nur sehe ich da das Problem, wenn ich einige Eingänge durch die Hauptplatine mit dem Port Expander nutzen möchte, dann passiert am µC nix,und wenn ich einige Eingänge des Port Expanders auslese und ein anderer wird betätigt, der eigentlich nichts damit zu tun haben sollte, dann wird die Funktion nicht TRUE
Rene P. schrieb: > Nur sehe ich da das Problem, wenn ich > einige Eingänge durch die Hauptplatine mit dem Port Expander nutzen Und ich sehe da das Problem im fehlendem Code.
:
Bearbeitet durch User
Im ANhang habe ich das gestrige, gesamte Programm. Wie gesagt, momentan bin ich dabei es aufzustückeln um Fehler auszmärzen, aber da bin ich noch nicht so weit gekommen. Danke im Voraus!
Rene P. schrieb: > Danke im Voraus!
1 | if (data == 0xFE) // Taster gedrückt |
2 | {
|
3 | outPorts(1,0xFF); // alle Pins an PortB geschalten |
4 | }
|
5 | else
|
6 | {
|
7 | outPorts(1,0x00); // kein Pin an PortB geschalten |
8 | }
|
Da werden (meiner Meinung nach) Pins in PINB entweder auf 0 oder 1 gesetzt, aber das ist Eingang. Sollte das nicht so sein:
1 | if (data == 0xFE) // Taster gedrückt |
2 | {
|
3 | outPorts(2,0xFF); //*** alle Pins an PortB auf Log.1 |
4 | }
|
5 | else
|
6 | {
|
7 | outPorts(2,0x00); //*** alle Pins an PortB auf Log.0 |
8 | }
|
???
:
Bearbeitet durch User
Also laut MyTWI Port Expander PDF wäre 0,0xFE Eingang A0 und 1,0xFF alle Ausgänge auf der B Seite
Rene P. schrieb: > Also laut MyTWI Port Expander PDF wäre 0,0xFE Eingang A0 und 1,0xFF alle > Ausgänge auf der B Seite Edit ging nicht mehr, also: Adresse PinA = 0 // Eingang, Wert lesen Adresse PinB = 1 // Eingang, Wert lesen Adresse PortA = 2 // Ausgang, Wert schreiben Adresse PortB = 3 // Ausgang, Wert schreiben Ich habe die Adresse im vorigem Beitrag auch falsch geschrieben,es sollte 3 sein (fur PortB - Wert AUSGEBEN).
:
Bearbeitet durch User
OK Danke ich versuchs gleich mal. Wie sieht es eigentlich mit der Verbindung mit den normalen Ein- und Ausgängen aus? z.B.: if ( PC0 AND (!(1<<PC1) && 0,0xFE) { PB0 // schalte Ausgang B0 }
Habe es jetzt mla probiert, geht aber mal wieder nix :-/ habe jetzt mal das aktuelle Prog hier im Anhang vielleicht hilft das weiter
Rene P. schrieb: > !(1<<PC1) Was soll das werden? https://en.wikibooks.org/wiki/C_Programming/Reference_Tables#Table_of_Operators
Da kamen wohl ein paar Fehler auf einmal rein, war eigentlich auch nur so als Beispiel gedacht. if ( (!(data==1,0xFB)) && Endschalter_eingefahren && Regensensor ) So in etwa sollte das Aussehen
Rene P. schrieb: > So in etwa sollte das Aussehen Hast du es überhaupt geschafft, irgendetwas zu senden oder zu empfangen ? Hast du einen LogicAnalyzer ?
Mit dem Code nicht, habe aber vorher meine Taster usw. direk aufs Board verdrahtet, und den Code angepasst, dann ging es. Aber mit dem Port Expander und die LCD Anstuerung machen mir noch zu schaffen. Nen LogicAnalyzer habe und kenne ich nicht, wollte über AVR Studio 5 oder 7 versuchen zu simulieren, aber das ist auch noch ne Baustelle. Sobald dieses Projekt durch ist, werde ich mich da weiter vertiefen, nur momentan habe ich kaum noch Zeit für etwas anderes...
Rene P. schrieb: > So in etwa sollte das Aussehen Ich hatte hauptsächlich Bedenken bei dem "!". Guck dir mal den Unterschied zwischen den Operatoren "!" und "~" an.
Rene P. schrieb: > Mit dem Code nicht, habe aber vorher meine Taster usw. direk aufs Board > verdrahtet, und den Code angepasst, dann ging es. Aber mit dem Port Ohne Ausgabe (und wenn es nur LEDs sind) wirst du ganz einfach nicht weiterkommen. Übersetze den Beitrag "Re: MyAVR Port Expander Ansteuerung" verbinde PortB.4-PB.6 über entsprechende Widerstände mit LEDs und lass es laufen, dann weisst du wenigstens ob die Ausgabe funktioniert.
Komme aus der SPS Technik, deshalb denke ich da mehr an negation eines Pins / Eingangs als an eine komplette Bitnegierung
Marc V. schrieb: > Übersetze den Beitrag "Re: MyAVR Port Expander Ansteuerung" > verbinde PortB.4-PB.6 über entsprechende Widerstände mit LEDs und lass > es laufen, dann weisst du wenigstens ob die Ausgabe funktioniert. Edit ging nicht mehr, es ist PortA.4 - PortA.6
Rene P. schrieb: > Das geht nicht :-/ hast Du den Code auch in c? Nein. Flashe mal das angehängte HEX. PA.0-PA.3 sind Eingänge, PortA.4-PA.7 sind Ausgänge. PA.4 und PA.7 gehen auf 1, PA.5 und PA.6 auf 0 1sec. Pause PA.5 und PA.6 gehen auf 1, PA.4 und PA.7 auf 0 1sec. Pause und wieder von vorne. Probiere es mal, dann sehen wir weiter.
Habe das Programm jetzt drauf. Die Leds leuchten abwechselnd, das passt. Die Eingänge werden bei dem Programm aber nicht abgefragt oder sehe ich das falsch? Habe leider nur 2 Taster grade zur Verfügung und habe diese doppelt ausgegeben
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.