Hallo ich brauche Hilfe bei der Ansteuerung von einem Maxim Max 6952 .
Also Laufen soll das alles mit einem Pic 16f877a den ich mit dem SPI Bus
an den Max verbinde. Die Assembler source Habe ich schon geschrieben
aber nachdem ich alles verbunden hab tut sich nichts ich weiß nun nicht
so recht ob mein Programm den Fehler hat (ob der max die daten überhaupt
so wie ich sie im vorgebe empfangen kann) wenn sich also jemand schon
mit diesem thema auseinandergesetzt hat bitte ich um Hilfe
Übrigens es würde probeweise die Zahl 1 auf der 1 Matrize ausgegeben
wenn es funktionieren würde
Mein Source file
list p=16f877a
;**************************************************************
; Includedatei für den 16F877a einbinden
;
; #include <P16f877A.INC>
;
; Configuration festlegen
;
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator
; __CONFIG _BODEN_OFF & _PWRTE_OFF & _CP_OFF & _WDT_OFF & _XT_OSC
;
;**************************************************************
; Variablennamen vergeben
#define SS PORTA,2 ; Slave Select an PortA RA2
CONFIGU Equ 0x21
CONFIGL Equ 0x22
INTENSIU10 Equ 0x23
INTENSIL10 Equ 0x24
INTENSIU32 Equ 0x25
INTENSIL32 Equ 0x26
DISPLU Equ 0x27
DISPLL Equ 0x28
TRISA Equ 0x85
TRISC Equ 0x87
STATUS Equ 0x03
RP0 Equ 5
PORTA Equ 0x05
PCLATH Equ 0x0A
INTCON Equ 0x0B
SSPCON Equ 0x14
SSPBUF Equ 0x13
SSPSTAT Equ 0x94
BF Equ 0
ADCON1 Equ 0x9F
ORG 0x00
;**************************************************************
;
;
; Ausgaenge einstellen
Init
; Set up für SPI
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw b'00000000' ; Porta und c alle output
movwf TRISA
movlw 0x06 ;A/D ausschalten
movwf ADCON1
;Set up für SPI Ports
movlw 0x10 ;SCK ist output (Master), SDI is input,
movwf TRISC ;SDO ist output,Alle anderen auch
movlw b'01000000' ;Mode 1,1 SPI, middle of output
movwf SSPSTAT ;Ins Abfrage Register
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
movlw b'0011001' ;Mode 1,1 SPI Master Mode, 1/16 Tosc bit
movwf SSPCON ;SSP Aktiv
;set up für alle Ausgehenden Daten
movlw 0x04 ;Config Adressbyte für Max 6952
movwf CONFIGL ;zwischen speichern in Register
movlw 0x01 ;Config Steuerbyte für Max 6952
movwf CONFIGU ;zwischen speichern in Register
movlw 0x01 ;Intensität 1 und 2 Matrize Adressbyte
movwf INTENSIL10 ;zwischen speichern in Register
movlw 0xFF ;Intensität 1 und 2 Matrize Steuerbyte
movwf INTENSIU10 ;zwischen speichern in Register
movlw 0x02 ;Intensität 3 und 4 Matrize Adressbyte
movwf INTENSIL32 ;zwischen speichern in Register
movlw 0xFF ;Intensität 3 und 4 Matrize Steuerbyte
movwf INTENSIU32 ;zwischen speichern in Register
movlw 0x20 ;Adressbyte für 1 Matrize
movwf DISPLU ;zwischen speichern in Register
movlw 0x31 ;Steuerbyte für Muster Zahl 1 auf Matrize 1
movwf DISPLL ;zwischen speichern in Register
;*************************************************************
Hauptrogramm
bcf SS ;Setze Slave Select Low zum Schreiben
movf CONFIGL,0 ;Schreibe Adressbyte config ins work
call Transmit ;Übertragung in SSPBUF
movf CONFIGU,0 ;Schreibe Steuerbyte config ins work
call Transmit ;Übertragung in SSPBUF
bsf SS ;Setze Slave Select auf High
bcf SS ;Setze Slave Select Low zum Schreiben
movf INTENSIL10,0 ;Schreibe Adressbyte Intensität ins work
call Transmit ;Übertragung in SSPBUF
movf INTENSIU10,0 ;Schreibe Steuerbyte Intensität ins work
call Transmit ;Übertragung in SSPBUF
bsf SS ;Setze Slave Select auf High
bcf SS ;Setze Slave Select Low zum Schreiben
movf INTENSIL32,0 ;Schreibe Adressbyte Intensität ins work
call Transmit ;Übertragung in SSPBUF
movf INTENSIU32,0 ;Schreibe Steuerbyte Intensität ins work
call Transmit ;Übertragung in SSPBUF
bsf SS ;Setze Slave Select auf High
bcf SS ;Setze Slave Select Low zum Schreiben
movf DISPLL,0 ;Schreibe Adressbyte für Zahl 1 ins work
call Transmit ;Übertragung in SSPBUF
movf DISPLU,0 ;Schreibe Steuerbyte für Zahl 1 ins work
call Transmit ;Übertragung in SSPBUF
bsf SS ;Setze Slave Select auf High
Finish
goto Finish ;Alles Übertragen tue nichts mehr
Transmit
movwf SSPBUF ;Schreibe aufs SSPBUF die Daten
bsf STATUS,RP0
LOOP btfss SSPSTAT, BF ;Teste ob Übertagung erfolgreich
goto LOOP ;Wenn Nein Teste nochmal
bcf STATUS, RP0 ;Wenn ja dann sende die Nächsten daten
return
end
> ; #include <P16f877A.INC> > ; __CONFIG _BODEN_OFF & _PWRTE_OFF & _CP_OFF & _WDT_OFF & _XT_OSC soweit ich mich entsinnen kann ist alles was in einer zeile nach dem semikolon steheht doch ein kommentar? an sonsten bin ich nicht fit in sachen asm aber ein fehler der gerne gemacht wird bei pic und spi ist das nach dem senden das register nichtmehr ausgelesen wird und dadurch keine weiteren übertragungen stattfinden ich poste mal nen stück c-code vieleicht kannste damit was anfangen das is von der kommunikation mit nem mcp4822 (DA-Wandler von microchip)
1 | void send_spi_contrast(char data) |
2 | {
|
3 | GIE = 0; // interrups ausschalten (hatte probleme bei mir gemacht |
4 | cs = 0; // chipselect auf 0 setzen (meist auch solange wie du mit dem device kommunizieren möchtest |
5 | SSPBUF = 0b00010001; // was auch immer du senden möchtest ins sspbuf register schreiben |
6 | while(BF == 0); // warten bis er fertig damit ist |
7 | spi_dummy = SSPBUF; // SSPBUF REGISTER AUSLESEN !!! |
8 | BF = 0; // bf wieder auf 0 setzen |
9 | SSPBUF = data; //das 2te byte ins sspbuf register schreiben |
10 | while(BF == 0); // warten bis er fertig damit ist |
11 | spi_dummy = SSPBUF; // SSPBUF REGISTER AUSLESEN !!! |
12 | BF = 0; // bf wieder auf 0 setzen |
13 | cs = 1; // chipselect wieder auf 1 (kommunikation beendet |
14 | GIE = 1; // interrupts wieder einschalten |
15 | }
|
Oh das mit dem Semicolon in der config ist wohl beim kopieren verrutscht ich versuch mal das In C geschriebene zu verwerten danke aufjeden fall
ich wollt noch was Fragen (Weil ich es immer noch nicht zum laufen gebracht hab) kann es sein das es an dem 16 bit register vom Max liegt ich sende ja immer 2mal 8 bit pakete bitte um Hilfe
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.