Hallo, vielleicht kann mir jemand weiter helfen. Ich möchte über den SPI den MCP23S09 ansteuern. Wäre die Initialisierung soweit richtig? Und wie steuer ich zB. eine Led über den MCP an. init_SPI BANKSEL SSPCON movlw B'00110000' movwf SSPCON BANKSEL SSPSTAT movlw B'10000000' movwf SSPSTAT BANKSEL INTCON bsf INTCON,7 bsf INTCON,6 Gruß Hansi
Du möchtest wahrscheinlich wissen, ob deine SPI-Initialisierung für "deinen" Mikrocontroller ok ist. Kannst du uns diesen Controller auch nennen? Andernfalls ist es nicht ratsam, Hinweise zu geben bzw. auf diese zu hören. Im Datenblatt steht eigentlich alles notwendige für den MCP23S09 drin. - GPIO-Port als Ausgang definieren (per default sind alle als Input) - Register "IODIR" - GPIO-Port mit gewünschter Bitbelegung beschreiben - Register "OLAT" Da keiner weiß, ob wie du die LED an den Expander angeschlossen hast, kann nicht gesagt werden, ob du sie mit einer 1 oder einer 0 anbekommst. and GO!
Also ich würde dir zum SPI-Mode 1,1 raten (Data transmitted on falling edge of SCK + SCK high in IDLE) Im MCP23S09-Datenblatt wird auch Mode 0,0 oder 1,1 empfohlen. Quasi: SSPSTAT: 0b11000000 SSPCON: 0b00110000 [EDIT] Wenn du mit den Interrupts die LED Togglen möchtest, musst du noch etwas mehr einstellen, als GIE und PIE ;)
:
Bearbeitet durch User
Es will immer noch nicht so richtig, ich hab jetzt genau das geschrieben: ;init_SPI BANKSEL SSPCON movlw B'00110000' movwf SSPCON BANKSEL SSPSTAT movlw B'11000000' movwf SSPSTAT Programm ; bcf PORTC,2 BANKSEL PIE1 bsf PIE1,SSPIE BANKSEL PORTA bcf PORTA,0 BANKSEL SSPBUF movlw B'00101000' movwf SSPBUF movlw SSPBUF movwf Leer BANKSEL PORTA bsf PORTA,0 BANKSEL PIE1 bcf PIE1,SSPIE BANKSEL PIR1 ; bcf PIR1,SSPIF
Kannst du mal bitte in Worte fassen, was du mit diesen Zeilen genau machen möchtest?
1 | BANKSEL SSPBUF |
2 | movlw B'00101000' |
3 | movwf SSPBUF |
Ich möchte nur prüfen, ob du die Funktionsweise des MCP23S09 verstanden hast.
Ich wähle durch BANKSEL SSPBUF das Register aus, dann speicher ich den Wert, den ich senden möchte ins SSPBUF Register. Dieser soll dann LEDs auf einer Platine ansteuern.
Hm, ok du hast den MCP23S09 noch nicht verstanden. Schau dir mal im Datenblatt Fig.1-9 an (Seite 13). Des Weiteren: was bezweckst du mit folgenden Zeilen?
1 | BANKSEL PORTA |
2 | bcf PORTA,0 |
Ja, ich guck mal rein. Ok, das kannst du leider nicht wissen. Ich setze CS auf low, damit es auf Empfangen gestellt ist.
Hm, genau das habe ich mir gedacht, allerdings wird das mit dem PORT-Register nicht funktionieren. 1. Du hast den Port noch nicht als Output definiert (TRISA-Register) 2. PORTx-Register sind nur zum LESEN des Ports da, wohingegen LATx-Register zum SCHREIBEN verwendet werden! PIC18-Grundlagen! Was du da machst, geht nur bei der PIC10-, PIC12- und PIC16-Familie.
Ich habe den TRISA oben direkt schon als OUTPUT definiert. Hier nur nicht reingesetllt. Ich benutze den PIC16F886, dann müsste das doch eigentlich klappen.
Sry, ich war grad mit den Gedanken in einem anderen Thread^^ Da ging es um einen PIC18F2550^^ Für den PIC16 ist das Beschreiben von PORTA ok. Dann schau dir bitte die Kommunikation mit dem MCP23S09 an. Du musst ihn via SPI korrekt adressieren! D.h. fallende Falnke CS + Opcode(inkl.R/W) + Register (+ zu schreibendes Byte, wenn im Write-Mode) + steigende Flanke CS steht doch alles im Datenblatt^^ Wenn du einfach nur ein Byte via SPI raus schickst, weiss doch der IO-Expander nicht, was er damit machen soll. Das Teil hat keine integrierte Intelligenz. [EDIT] Des Weiteren: Wozu aktivierst du SSPIE vor dem Senden? Wozu brauchst du den Interrupt "während" der Operation als Master?
:
Bearbeitet durch User
BANKSEL TRISA movlw B'00000000' movwf TRISA movlw B'00010000' ; SDI (RC4) movwf TRISC ;init_SPI BANKSEL SSPSTAT movlw B'11000000' movwf SSPSTAT BANKSEL SSPCON movlw B'00110000' movwf SSPCON Programm BANKSEL PORTA bcf PORTA,0 BANKSEL SSPBUF movlw B'0010000110101011' movwf SSPBUF BANKSEL SSPSTAT Flagabfrage btfss SSPSTAT,BF goto Flagabfrage BANKSEL SSPBUF movf SSPBUF, W BANKSEL PORTA bsf PORTA,0 goto Programm end Ich habe das soweit fertig.Ist das richtig mit den 16 Bit am SSPBUF?
Hansi Müller schrieb: > Ich habe das soweit fertig.Ist das richtig mit den 16 Bit am SSPBUF? Was sagt denn dein Verstand, wenn du 16Bit in ein 8Bit-Buffer schieben möchtest? Du musst das schon nacheinander machen. 1. Byte1 ins SSPBUF 2. warten bis rausgesendet (Stichwort: SSPIF) 3. Byte2 ins SSPBUF 4. warten bis rausgesendet (Stichwort: SSPIF) und so weiter... Kannst du mal bitte erklären, was das für ein 16Bit-Wort ist? Bzw. warum du genau diese Bitbelegung verwendet hast.
Ich bin verzweifelt. Muss das in das OALT Register reingeschrieben werden?
:
Bearbeitet durch User
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.