Forum: Mikrocontroller und Digitale Elektronik Bitte Hilfe Max 6952 mit Pic 16f877a ansteuern (SPI BUS)


von christian (Gast)


Lesenswert?

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

von Thomas M. (thomas1123) Benutzerseite


Lesenswert?

> ;        #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
}

von christian (Gast)


Lesenswert?

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

von christian (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.