Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[16f877a][asm] SPI nie dziala.

AnnaWesolaLat23 30 Cze 2009 16:42 2009 6
  • #1 30 Cze 2009 16:42
    AnnaWesolaLat23
    Poziom 15  

    Witam.

    Za pomoca picdem 2 plus demo board probuje sie dogadac z pickit serial spi demo board.

    Konkretniej to 16f877a gada do 12 bitowego dac mcp4822.

    Program probuje liczyc od 0 do wartosci maxymalnej i inkrementacja +1 co kazdy cykl, liczenie odbywa sie na 1.5 zmiennej (12 bitach).
    Po osiagnieciu maximum zmienne sa zerowane.
    Dzieki temu powinien byc ksztalt pily widoczny na wyjsciu DAC.

    +5V i gnd sa zapewnione.
    na cs widze zeby
    na clk widze zeby
    na mosi cos tam widze co mniej wiecej wyglada jak powinno
    na miso o dziwo tez cos widze

    Gain = 1
    Shutdown jest wylaczony. (opcja wylaczona, czyli dac wlaczony).
    Niestety na wyjsciach tego DAC mam ciagle 0V.

    Pomocy!!!!!

    Code:
       list p=16F877a
    
       #include "p16F877a.inc"

    ;   _CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

    ; zmienne zadeklarowalam w mplabie

    ;VARIABLE DEFINITION
    A_      EQU      0X20
    B_      EQU      0X21
    C_      EQU      0X22
    D_      EQU      0X23


    ;BANKING DEFINITION
    BANK0   MACRO
            BCF     STATUS,RP0   ; select register bank 0
            BCF     STATUS,RP1
       ENDM

    BANK1   MACRO
            BSF     STATUS,RP0   ; select register bank 1
            BCF      STATUS,RP1
       ENDM

    BANK2   MACRO
            BCF     STATUS,RP0   ; select register bank 0
            BSF     STATUS,RP1
       ENDM
    BANK3   MACRO
            BSF     STATUS,RP0   ; select register bank 0
            BSF     STATUS,RP1
       ENDM




    ;**********************************************************************
       ORG     0x000             ; processor reset vector
       goto    main              ; go to beginning of program
       
    ;- - - - - - - - - INTERRUPT - - - - - - - - - - - - - -

          ORG     0x004             ; interrupt vector location
          NOP   
          
    main   NOP




          BANKSEL   TRISC
          MOVLW   B'11010101'
          MOVWF   TRISC


          movlw   b'00000000'
          movwf   A_
          MOVLW   B'00000000'
          MOVWF   B_


    LOOP   MOVF   A_,W         ;COPYING DATA FROM WORKING REGISTERS INTO TO-SPI REGISTERS
          MOVWF   C_
          MOVF   B_,W
          MOVWF   D_

          BTFSS   A_,0            ;CHECKING IF A = MAX?
          GOTO   CHKB_AM         ;NO A IN NOT MAX
          BTFSS   A_,1
          GOTO   CHKB_AM
          BTFSS   A_,2
          GOTO   CHKB_AM
          BTFSS   A_,3
          GOTO   CHKB_AM
          
          MOVF   B_,W            ;YES, A = MAX, NOW CHECKI IF B = MAX AS WELL?
          MOVWF   C_
          INCF   C_
          MOVF   C_,C_
          BTFSS   STATUS,Z
          GOTO   AMB_         ;GOTO A MAX B SMALL
          GOTO   AMBM

    CHKB_AM MOVF   B_,W            ;
          MOVWF   C_
          INCF   C_
          MOVF   C_,C_
          BTFSS   STATUS,Z
          GOTO   A_B_         ;GOTO A MAX B SMALL
          GOTO   A_BM

    ;-----------------------------

    A_B_   INCF   B_            ;A SMALL, B SMALL - INREMENT VALUES
          GOTO   SPI

    A_BM   INCF   A_            ;A SMALL, B MAX - INCREMENT VALUES
          CLRF   B_
          GOTO   SPI

    AMB_   INCF   B_            ;A MAX, B SMALL - INCREMENT VALUES
          GOTO   SPI

    AMBM   CLRF   A_            ;A MAX, B MAX - INCREMENT VALUES
          CLRF   B_
          GOTO   SPI

    ;------------------------------

    SPI    BANK0
          BSF      C_,5            ;GAIN = 1
          BSF      C_,4            ;NO SHUTDOWN

          BANKSEL TRISA ; BANK 1
          movlw 0x00 ; Set PORTA as
          movwf TRISA ; all Outputs
          movlw 0x06 ; Turn off A/D
          movwf ADCON1 ; so PORTA can be used
                      ; Set up the SPI Port
          BANKSEL TRISC ; BANK 1
          movlw 0x10 ; SCK is output (Master), SDI is input,
          movwf TRISC ; SDO is output, all others output
          movlw 0x40 ; Mode 1,1 SPI, middle of output
          movwf SSPSTAT ; time sampling
          BANKSEL SSPCON ; BANK 0
          movlw 0x31 ; Mode 1,1 SPI Master Mode, 1/16 Tosc bit time

          movwf SSPCON ; SSP is on
    Send_DT bcf PORTC,1 ; Enable Chip Select Output (low)
          MOVF C,W          ;C -> W
          MOVWF SSPBUF       ; put in SSPBUF
          BANKSEL SSPSTAT ; BANK 1
    CHAR1    BTFSS SSPSTAT,BF ; Data transfer complete? (Buffer Full?)
          GOTO CHAR1 ; if not, check again
          BANKSEL SSPBUF ; BANK0
          movf SSPBUF,W ; Get Data from SSPBUF
          ; ; Throw it away

          MOVF   D_,W
          MOVWF   SSPBUF
          BANKSEL   SSPSTAT
    CHAR2   BTFSS   SSPSTAT,BF
          GOTO CHAR2
          BANKSEL   SSPBUF
          MOVF   SSPBUF,W
                ;THROW AWAY


          bsf PORTC,1 ; Disable Chip Select Output (high)
          Update_Test_Counter
       
           goto LOOP
          
          END


    Build all nie widzi zadnego bledu.

    0 6
  • #2 30 Cze 2009 18:27
    Dr_DEAD
    Poziom 28  

    A linię LDAC masz na stałe do masy? czy coś z nią robisz programowo?

    0
  • #3 30 Cze 2009 20:31
    AnnaWesolaLat23
    Poziom 15  

    Avss i LDAC sa na stale podlaczone do masy juz na PCB.

    Link

    0
  • Pomocny post
    #4 01 Lip 2009 07:23
    adamwesola
    Poziom 24  

    W tym miejscu jest pomyłka , w drugiej linii :

    Code:
    Send_DT bcf PORTC,1 ; Enable Chip Select Output (low)
    
          MOVF C,W          ;C -> W


    powinno byc :
    Code:
    Send_DT bcf PORTC,1 ; Enable Chip Select Output (low)
    
          MOVF C_,W          ;C -> W

    0
  • #5 01 Lip 2009 19:24
    AnnaWesolaLat23
    Poziom 15  

    adamwesola napisał:
    W tym miejscu jest pomyłka , w drugiej linii :
    Code:
    Send_DT bcf PORTC,1 ; Enable Chip Select Output (low)
    
          MOVF C,W          ;C -> W


    powinno byc :
    Code:
    Send_DT bcf PORTC,1 ; Enable Chip Select Output (low)
    
          MOVF C_,W          ;C -> W

    No kolego, szacunek i podziw.
    Zobaczej jutro co dac produkuje jak dojade do domu.

    btw. Dlaczego mplab nei zglosil bledu?

    0
  • Pomocny post
    #6 01 Lip 2009 21:47
    adamwesola
    Poziom 24  

    Mplab zinterpretował C jako adres zerowy, jedyna mu znana nazwa C, to bit carry w statusie, jak zajrzysz to pliku p16f877a.inc to wszystko stanie się jasne.

    0
  • #7 02 Lip 2009 10:43
    AnnaWesolaLat23
    Poziom 15  

    adamwesola napisał:
    Mplab zinterpretował C jako adres zerowy, jedyna mu znana nazwa C, to bit carry w statusie, jak zajrzysz to pliku p16f877a.inc to wszystko stanie się jasne.

    Pila na oscyloskopie!!!!!!
    Dziala.
    Dzieki.

    C w statusie jest bitem, movf przemieszcza tylko bajty.

    0