MyAVR Port Expander Ansteuerung

OP #4612403
Lesenswert?

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.
Gast #4612423
Lesenswert?

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 ...
(Firma: Vescomp) #4612484
Lesenswert?

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
#4612489
Lesenswert?

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
[...]
OP #4612496
Lesenswert?

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.
OP #4612558
Lesenswert?

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
(Firma: Vescomp) #4612604
Lesenswert?

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
  }

 ???
(Firma: Vescomp) #4612616
Lesenswert?

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).
OP #4612730
Lesenswert?

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...
(Firma: Vescomp) #4612756
Lesenswert?

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.
(Firma: Vescomp) #4612816
Lesenswert?

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.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren