Pomoc s programem na PIC16F877

hukalik

Pomoc s programem na PIC16F877
« kdy: 19. 02. 2015, 20:48:50 »
Zdravím,
pracuji na maturitní práci kde programuji LED kostku 5x5x5 s PIC16f877 a vnějším oscilátorem o frekvenci 4MHz.
Bohužel programuju to poprvé a poprvé se ocitám v MPLAB a docela se ztrácim, proto bych chtěl požádat o pomoc.
Potřebuju to nějak přepsat, aby mi to stíhalo se zobrazovat na kostce, mam tam zadané adresy na postupne zvetseni a zmenseni kostky, akorat mi to vubec nestiha a je to na to moc rychle, proto zadam o pomoct, jak to predelat, aby se mi to stihalo zobrazovat.
Tady je můj program:
   list      p=16f877            ; list directive to define processor
   #include <p16f877.inc>        ; processor specific variable definitions

   __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF

; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.

;***** VARIABLE DEFINITIONS
w_temp        EQU     0x7E        ; variable used for context saving
status_temp   EQU     0x7F        ; variable used for context saving
PROGRAM         EQU     0x20

#define opakovani   0x04            ;pocet opakovani
;**********************************************************************
      ORG     0x000             ; processor reset vector
      clrf    PCLATH            ; ensure page bits are cleared
        goto    nastaveni              ; go to beginning of program


      ORG     0x004             ; interrupt vector location
      movwf   w_temp            ; save off current W register contents
      movf   STATUS,w          ; move status register into W register
      movwf   status_temp       ; save off contents of STATUS register

; isr code can go here or be located as a call subroutine elsewhere

        movf    status_temp,w     ; retrieve copy of STATUS register
      movwf   STATUS            ; restore pre-isr STATUS register contents
      swapf   w_temp,f
      swapf   w_temp,w          ; restore pre-isr W register contents
      retfie                    ; return from interrupt

;***************************************************************************

nastaveni
      movlw   0xFF   ; Nastaveni jednicek na PORTY
      movwf   PORTA   ; -//-
      movwf   PORTB   ; -//-
      movwf   PORTC   ; -//-
      movwf   PORTD   ; -//-
      movwf   PORTE   ; -//-

        BANKSEL TRISA   ;prepnuti do banky 1
        movlw   0x07    ;nastaveni portu na digital
        movwf   ADCON1   ;-//-
        clrf    TRISA   ;nastaveni portu na vystupy
        clrf    TRISB   ;-//-
        clrf    TRISC   ;-//-
        clrf    TRISD   ;-//-
        clrf    TRISE   ;-//-
        movlw   0xD8            ;nastaveni TMR0 Fosc, nepridelena preddelicka
        movwf   OPTION_REG

        BANKSEL   PIR1            ;prepnuti do banky 0
      movlw   0x01            ;nastav preddel 1:8, vnitrni osc a povoleni
      movwf   T1CON            ;-//-
      clrf   TMR1L            ;vynulovani TMR1
      clrf   TMR1H            ;-//-
      clrf   PIR1            ;vynulovani priznaku od TMR1
      clrf   TMR0

;*********************************************************************************
program
      movlw   0x05
      movwf   PROGRAM
program_1
      call   kostka1
      call   kostka2
      call   kostka3
      call   kostka2
      decfsz   PROGRAM,f
      goto   program_1
      movlw   opakovani
      movwf   PROGRAM

        goto    program
;*********************************************************************************
kostka1
        bsf     PORTA,0
        bcf     PORTD,4
        bcf     PORTA,2
      clrf   TMR1L            ; vynulovani TMR1
      clrf   TMR1H            ; vynulovani TMR1
      clrf   PIR1            ; vynulovani priznaku od TMR1
      btfss   PIR1,0            ; dotas na přetečení TMR1
      goto   $-1               ; nepřetekl   TMR1
      bsf      PORTA,2            ; vypnutí patra 3
      bsf      PORTD,4            ; vypnutí D13
      clrf   PIR1            ; vynulovani priznaku od TMR1
      return

kostka2
      movlw   b'11111000'
      movwf   PORTB
      movlw   b'01101111'
      movwf   PORTC
      movlw   b'11000011'
      movwf   PORTD
        bcf      PORTA,1            ; zapnutí patra 4
      bcf      PORTA,3            ; zapnutí patra 2
      call   svit
      bsf      PORTA,2            ; vypnutí patra 4
      bsf      PORTA,3            ; vypnutí patra 2
      movlw   b'11010011'
      movwf   PORTD
      bcf      PORTA,2            ; zapnutí patra 3
      call   svit
      bsf      PORTA,2            ; vypnutí patra 3
      btfss   PIR1,0            ; dotas na přetečení TMR1
      goto   kostka2         ; nepřetekl   TMR1
      clrf   PIR1            ; vynulovani priznaku od TMR1

kostka3
        movlw   b'00000111'
      movwf   PORTB
      movlw   b'10010000'
      movwf   PORTC
      movlw   b'00111100'
      movwf   PORTD
      bcf      PORTE,0
      bcf      PORTA,1            ; zapnutí patra 4
      bcf      PORTA,2            ; zapnutí patra 3
      bcf      PORTA,3            ; zapnutí patra 2
      call   svit
      bsf      PORTA,1            ; vypnutí patra 4
      bsf      PORTA,2            ; vypnutí patra 3
      bsf      PORTE,3            ; vypnutí patra 2
      clrf   PORTB
      clrf   PORTC
      clrf   PORTD
      bcf      PORTA,0            ; zapnutí patra 5
      bcf      PORTA,5            ; zapnutí patra 1
      call   svit
      bsf      PORTA,0            ; vypnutí patra 5
      bsf      PORTA,5            ; vypnutí patra 1
      btfss   PIR1,0            ; dotas na přetečení TMR1
      goto   kostka3         ; nepřetekl   TMR1
      clrf   PIR1            ; vynulovani priznaku od TMR1
      movlw   0xFF            ; zapisem na vystupy jednicky aby nic nesvitilo
      movwf   PORTA            ; -//-
      movwf   PORTB            ; -//-
      movwf   PORTC            ; -//-
      movwf   PORTD            ; -//-
      movwf   PORTE            ; -//-
      return

svit
      clrf   TMR0
      bcf      INTCON,2
      btfss   INTCON,2
      goto   $-1
      return


      movlw   b'11111111'



        END


czberg

Re:Pomoc s programem na PIC16F877
« Odpověď #1 kdy: 19. 02. 2015, 21:01:54 »
Tam musíš přidat nějaký delay.

hukalik

Re:Pomoc s programem na PIC16F877
« Odpověď #2 kdy: 19. 02. 2015, 21:11:14 »
To už jsem se také dozvěděl, akorát je problém mezi žídlí a počítačem :/ Dělám v tom poprvé a nikdy předtím jsem neprogramoval, proto se ptam na radu, jestli nevíte jak přesně to předělat.

vlastik

Re:Pomoc s programem na PIC16F877
« Odpověď #3 kdy: 19. 02. 2015, 21:12:44 »
Zkus zvetsit preddelicku u timeru. Podle programu se zda, ze to jede plnou frekvenci. Da se urcite zapnout aspon od 2x do 16x.

hukalik

Re:Pomoc s programem na PIC16F877
« Odpověď #4 kdy: 19. 02. 2015, 21:55:51 »
Podle toho co jsem našel v datasheetu tak tam jde tenhle timer nastavit na 1:8, víc mi to tam nenabízí. Na další spůsoby jsem zatim nepřišel.


Kolemjdoucí

Re:Pomoc s programem na PIC16F877
« Odpověď #5 kdy: 20. 02. 2015, 09:36:56 »
Jestli přerušení od časovače běží příliš často, jednoduše několik průběhů vynecháš. Vynechané průběhy si budeš počítat v proměnné a až to dosáhne třeba 64, tak uděláš akci a proměnnou vynuluješ.

satan

Re:Pomoc s programem na PIC16F877
« Odpověď #6 kdy: 20. 02. 2015, 11:21:38 »
Za mně fungovala instrukce NOP, která trvala dobu taktu procesoru, potom už ti nebrání udělat si funkci, která v cyklu opakuje NOP do požadované doby zpoždění (delay).