PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ERLEDIGT:Atmega644 und MCP23S17



stekohl
06.04.2008, 14:47
Ich bekomme einfach keine Signale vom Portexpander. Raus gar kein Problem. Irgendwie erschließt sich mir die Logik des Registerwarterloo nicht ganz so. Können die nicht einen Kippschalter oben an des DIP gehäuse dranmachen. =P~ Da würde ich mir das schreiben von endlosen Registern sparen. Kleiner Witz.

Also wer von Euch Spitzenkräften kann mir bei meinem Problem helfen?

Nich alle auf einmal ;-)

Hier erstmal der Code. (Ist das BASCOM Beispielprogramm ein wenig in die länge gezogen. Ich teste erst alle Einzelschnittstellen bevor ich den Hauptcode schreibe.)



Dim B As Word
Dim A(10) As Byte
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.5 = Output
Config Pinb.6 = Input
Config Pinb.7 = Output

Open "com1:" For Binary As #1
Spiinit

' MCP23S17 Register RO=ReadOnly
' Adresse 00 01 IODIR Richtung Port a/b 0=Output 1=Input
' Adresse 02 03 IPOL Polarität 1=umgekehrt
' Adresse 04 05 GPINTEN Interrupt aktivieren 1=an 0=aus
' Adresse 06 07 DEFVAL Vergleichsregister für Interrupt
' Adresse 08 09 INTCON 1=PIN<->DEFVAL 0=PIN neu <->PIN alt
' Adresse 0A 0B IOCON Configuration
' Adresse 0C 0D GPPU PullUp 1=aktiv 0= aus
' Adresse 0E 0F INRF Interrupt Flag register RO
' Adresse 10 11 INTCAP Interrupt Capture Register RO
' Adresse 12 13 GPIO Port Werte RW
' Adresse 14 14 OLAT Output Latch Register

' Ausgabe klappt wie Teufel
Portb.0 = 0 'Reset
Waitus 100
Portb.0 = 1

A(1) = &B01000000 'Richtung Porta
A(2) = $00
A(3) = $0
A(4) = $00
Spiout A(1) , 4
A(1) = &B01000000 'PullUp
A(2) = $0c
A(3) = $00
A(4) = $00

For B = 0 To &B1111111111111111
A(1) = &B01000000 'Ausgänge ansteuern
A(2) = $12
A(3) = High(b) ' Port A gleich MSB von B
A(4) = Low(b)
' Port B gleich LSB von B
Spiout A(1) , 4
Next B


Portb.0 = 0 'Reset
Waitus 100
Portb.0 = 1





'Ab hier still ruht der See!!
Test:
A(1) = &B01000000 'Richtung Porta
A(2) = $00
A(3) = $ff
A(4) = $ff
Spiout A(1) , 4
A(1) = &B01000000 'Polarität umkehren
A(2) = $02
A(3) = $ff
A(4) = $ff
Spiout A(1) , 4
A(1) = &B01000000 'PullUp
A(2) = $0c
A(3) = $ff
A(4) = $ff
Spiout A(1) , 4
A(1) = &B01000001 'Ausgang PORTA/B lesen
A(2) = $12
Spiout A(1) , 2
Spiin A(1) , 2

Print #1 , A(1) ; A(2)

Goto Test
Waitus 100
End


Danke für Eure Hilfe. Kommentieren ist nicht so meine stärke bin eher Küchenprogrammierer. Erst den Code haben dann strukturieren, da bekommt jeder Informatiker einen Mittelschweren Ausraster.

Gruß,

Stephan

stekohl
08.04.2008, 19:08
Hallo Leute,

ich nehme an, dass der von mir verwendete Portexpander wohl eher ein Nischenprodukt ist.

Ich bekomme es irgendwie nicht auf die Kette, die Portereignisse zu empfangen. Da hampel ich seit Samstag mit rum.

Nach meiner Meinung Schreibe ich per SPI die Daten in den Expander mit dem Readbit und lese direkt danach die angeforderten Daten aus! Ab dem Auslesen werden vom MCP23S17 auch Daten gesendet, nur mein Atmega will davon nix wissen.
Ich habe die Sendbytes geändert Pausen von µ bis m Sekunden eingefügt. Mehrer Byte ausgelesen. Verwende ich die gleiche Schaltung und hänge eine SD Karte dran und nehme die MMC Lib, no Problem. Also kommt über die Ports auch alles rein.

Leider ist in der PDF von Microchip nur der Befehlablauf per i²c erklärt und da wird mit Ack zwischen den Befehlen gearbeitet. Ob der Portexpander jedoch ein Dummybyte benötigt ?????

Wenn ich denn SPI Eingang am ATMEGA auf HIGH legen werden auch schön 255 pro Abfrage angezeigt. Also ist das Problem ein Softwareseitiges.

Ich bekomme langsam eine Krise, da ich einfach nicht weiter komme.

Und das mit den Spitzenkräften war ernst gemeint. Ich ziehe wirklich meinen Hut vor so mancher innovativen Idee hier im Forum. ](*,)

Gruß,

Stephan

stekohl
09.04.2008, 20:53
Sieht ein wenig schizophren aus, aber ich lerner ja täglich dazu.

Dank meiner Firma habe ich ein trag. Ozilloskop immer zur Hand. (hät ich mal schon am Samstag zur Hand nehmen sollen.)

Nun ist der Signalverlauf so:

Ich schreibe laut Manual für den MCP23S17 2 byte und lese das dritte Byte aus. Nur leider mit dem kleinen Problem, das Bascom den CS dazwischen auf LOW legt, damit ist für den Portexpander wieder alles beim alten.

Schreibe ich 3 Byte kommt über die SO Leitung auch mein gewünschtes Signal. (je nach GND geschalteten Input die ensprechenden Signal. Ja super nur mit einem folgenden SPIIN ist der Zug wieder abgefahren.

Ich denke ich nutze die SPI Routine von BASCOM schalten den CS jedoch über einen separaten Port.

Ich werde berichten ob es funktioniert.

Wenn der Portexpander läuft ist es ein geiles Teil, da relativ easy zu nutzen.

a.) Saubillig bei Farnell 1,55€ ab 10 Stüch 0,99€
b.) 16 bit oder 2 x 8 bit nach eigenem Gusto konfigurierbar
c.) 2 getrennte Interrupt Ausgänge. Per Steuerregiste konfigurierbar. ( Interrupt bei Wertänderung zum letzten Wert oder Wertänderung zum hinterlegten Referenzwert)
d.) Beschaltung recht einfach.
e.) Per Register zuschaltbare PULLUP's
f.) 25mA pro Ausgang
g.) Adressierbar 3 Adressbit, demnach bis zu 8 Portexpander a 16 BIT möglich (denk nach ach ja = 128)

Wenn das Sch**ding jetzt noch läuft tanz ich erstmal einen Lambada.

Auch wenn es mittlerweile wie ein Selbstgespräch aussieht, ich bin immer noch auf der Suche mit den reinen BASCOM mitteln das Teil anzusteuern.


Gruß, Stephan

stekohl
09.04.2008, 21:34
Ich hab's, es liegt wirklich am CS Signal.

Wenn ich den Portexpander per sep. CS Leitung vor und nach aktivieres funktioniert es. Bascom erzeugt ja logischerweise zwischen den Befehlen einen neuen CS.

Ein ein Codeausschnitt:


Portb.0 = 0
Waitms 100
Portb.0 = 1

A(1) = &B01000000 'Beide Ports auf Eingang
A(2) = $00
A(3) = $ff
A(4) = $ff
Cs = 0 'ChipSelect auf low

Spiout A(1) , 4
Cs = 1

A(1) = &B01000000 'PullUp aktiviert
A(2) = $0c
A(3) = $ff
A(4) = $ff
Cs = 0
Spiout A(1) , 4
Cs = 1

Test:


A(1) = &B01000001 'Ausgang PORTA/B lesen
A(2) = $12


Cs = 0
Spiout A(1) , 2

Spiin A(1) , 2
Cs = 1
Porta = A(1)
Portd = A(2)

Goto Test

Ich gehe mal eben Lambada tanzen.

Gruß,

Stephan