Matematické Fórum


1. 8. 2026 (L) Fórum bude brzy uzavřeno 😿

Nejste přihlášen(a). Přihlásit

#1 07. 12. 2011 18:32

case_fcs
Příspěvky: 101
Reputace:   -1 
 

assembler

ahoj moc prosim potrebuju jestli by mi nekdo nemoch nejak poupravit tenhle kod aby to bylo uplne spravne i s komentarema pro lepsi pochopeni

zadani:
http://forum.matweb.cz/upload3/img/2011-12/79148_Bez%2Bn%25C3%25A1zvu.png

muj kod:

    LIST P=18F87J11                ;directive to define processor
    #include <P18F87J11.INC>    ;processor specific variable definitions
;******************************************************************************
;Configuration bits
    CONFIG     FOSC = HS            ;High speed crystal
    CONFIG     WDTEN = OFF        ;Watchdog disabled
    CONFIG     XINST = OFF        ;Istruction set extension disabled
;******************************************************************************
;Variable definitions
        udata_acs    0x000
        WREG_TEMP    res 1        ;variable used for context saving
        STATUS_TEMP    res 1        ;variable used for context saving
        BSR_TEMP    res 1        ;variable used for context saving

        REG            res 1        ;proměnná - vnitřní reprezentaci PORTD
        TEMP        res 1        ;proměnná - komunikace mezi HighInt a Programem

        STAV        res 1        ;registr stavu
        BLIK        res 1        ;proměnná - rozsvěcení a zhasínání diod
;Reset vector******************************************************************
        ORG    0x0000
        goto    Main        ;go to start of main code
;High priority interrupt vector************************************************
        ORG    0x0008
        goto    HighInt        ;go to high priority interrupt routine
;LowPriority interrupt vector**************************************************

        ORG 0x0018

        goto     LowInt

;******************************************************************************
;High priority interrupt routine, kontrola náběžné hrany

VysokaPriorita:

        movff    STATUS,STATUS_TEMP    ;save STATUS register
        movff    WREG,WREG_TEMP        ;save working register
        movff    BSR,BSR_TEMP        ;save BSR register
       
        movf    REG,0,0                ;přesun REG do W

        IORwf    PORTD,0,0            ;W OR PORTD - na bitu 7 získám údaj o změně hodnoty hodin
        movwf    TEMP                ;W -> TEMP

        BTFSC    PORTD,6,0            ;Je PORTD (minula hodnota tlacitka) na 1?
        BCF        TEMP,6,0            ;pokud ano, nemam nabeznou hranu -> clear TEMP bit 7

        movff    REG,PORTD            ;presun REG do PORTD (na diody)

        BSF        BLIK,0,0            ;prikaz ke zmene stavu diod 4-6 (pokud maji blikat)

        movlw     0Bh                    ;0Bh -> W
        movwf     TMR0H                ;nastav vysoky bit Timer0 na 0Bh 
        movlw     0E2h                ;0E2h -> W
        movwf     TMR0L                ;Nastav nizky bit Timer0 na 0E2h

        movff    BSR_TEMP,BSR        ;restore BSR register
        movff    WREG_TEMP,WREG        ;restore working register
        movff    STATUS_TEMP,STATUS    ;restore STATUS register
        BCF     INTCON,2,0            ;clear Interrupt Flag
        retfie

;******************************************************************************
;Low priority interrupt routine

LowInt:
        movff    STATUS,STATUS_TEMP    ;save STATUS register
        movff    WREG,WREG_TEMP        ;save working register
        movff    BSR,BSR_TEMP        ;save BSR register
       
        BTFSS    PORTA,5,0            ;je tlacitko RA5 (datovy vstup) stisknuto?
        BSF        REG,5,0                ;nastav bit 5 (S2) v REG na 1

        BTFSC    PORTA,5,0            ;neni RA5 stisknuto?
        BCF        REG,5,0                ;nastav bit 5 (S2) v REG na 0

        BTFSS    PORTB,0,0            ;je tlacitko RB0 (hodiny) stisknuto?
        BSF        REG,6,0                ;nastav bit 6 (S1) v REG na 1

        BTFSC    PORTB,0,0            ;neni RB0 stisknuto?
        BCF        REG,6,0                ;nastav bit 6 (S1) v REG na 0

        movlw     0CFh                ;0CFh -> W
        movwf     TMR1H                ;nastav vysoky bit Timer1 na 0CFh

        movlw     037h                ;037h -> W
        movwf     TMR1L                ;nastav nizky bit Timer1 na 037h

        movff    BSR_TEMP,BSR        ;restore BSR register
        movff    WREG_TEMP,WREG        ;restore working register
        movff    STATUS_TEMP,STATUS    ;restore STATUS register
        BCF     PIR1,0,0            ;clear Interrupt Flag
        retfie

;Start of main program*********************************************************

Main:

    clrf     TRISB                    ; 0h -> TRISB - vsechny bity PORTB nastaveny jako vystupni
    clrf     TRISA                    ; 0h -> TRISA - vsechny bity PORTA nastaveny jako vystupni
    clrf     TRISD                    ; 0h -> TRISD - vsechny bity PORTD nastaveny jako vystupni
   
    clrf     PORTD                    ; 0h -> PORTD - PORTD je vynulovan       
    clrf     REG                        ; 0h -> REG - REG je vynulovan
    clrf     TEMP                    ; 0h -> TEMP - TEMP je vynulovan

    BSF     TRISB,0                    ; bit 0 PORTB nastaven jako vstupni - Hodiny cudlik (vlevo)
    BSF     TRISA,5                    ; bit 5 PORTA nastaven jako vstupni - Vstup cudlik (vpravo)
    BSF        WDTCON,4
    BSF        ANCON0,4                ; set RA5
    BCF        WDTCON,4

    movlw     b'00000001'                ; 00000001 -> W
    movwf     T0CON                    ; Timer0 configured to - Timer0 off;configured as 16 bit counter;
                                    ; internal clok source; not important; prescaler active;
                                    ; Timer O prescaler set to 1:4 (PIC18f87j11 manual page 179)

    movlw     b'10000000'                ; 10000000 -> W
    movwf     RCON                    ; enables priority levels on interrupts (PIC18f87j11 manual page 127)

    movlw     b'11100000'                ; 11100000 -> W    
    movwf     INTCON                    ; interrupt configuration - INTCON configured as - High priority Interrupts enabled;
                                    ; Low priority Interrupts enabled; Timer0 overflow interrupt enabled;
                                    ; INT0 interrupt disabled;(PIC18f87j11 manual page 115)
   
    movlw     b'00000100'                ; 00000100 -> W
    movwf     INTCON2                    ; Timer0 overflow int. priority set to High (PIC18f87j11 manual page 116)

    movlw     0Bh                        ; 0Bh -> W
    movwf     TMR0H                    ; nastav vysoky bit Timer0 na 0Bh

    movlw     0E2h                    ; 0E2h -> W
    movwf     TMR0L                    ; nastav nizky bit Timer0 na 0E2h

    BSF     PIE1,0,0                ; enables Timer1 overflow interrupt (PIC18f87j11 manual page 188)
    BCF     IPR1,0,0                ; Timer1 overflow interrupt priority set to Low (PIC18f87j11 manual page 188)

    movlw     b'01011000'                ; 01011000 -> W
    movwf     T1CON                    ; Timer1 configured to - read/write in two 8bit operations; device clock derived from Timer1 oscillator;
                                    ; prescale set to 1:2; Timer1 oscillator enabled; use internal clock; Timer1 off (PIC18f87j11 manual page 183)

    movlw     0CFh                    ; 0CFh -> W
    movwf     TMR1H                    ; nastav vysoky bit Timer1 na 0CFh
    movlw     037h                    ; 037h -> W
    movwf     TMR1L                    ; nastav nizky bit Timer1 na 037h                   

    movlw     b'00000001'                ; data = 0 -> to S0
    movwf     STAV                    ; nastav implicitni stav

    BCF        REG,0,0                    ; zhasni posledni diodu (stav S0)

    BSF     T0CON,7,0                ; start Timer0
    BSF     T1CON,0,0                ; start Timer1
   
Loop:
    BTFSC     TEMP,6,0                ; je TEMP bit 6 nastaven na 1?
    goto     Logic                    ; prejdi na Logic

    BTFSC     BLIK,1,0                ; ma program blikat? je nastavena flag na blikani?
    goto     Blikani                    ; prejdi na Blikani

    goto     Loop                    ; loop forever


;************************************************************************
;***                             Reseni stavu                              ***
;************************************************************************

Logic:               
   
    ;prechod na dane stavy

    BTFSC        STAV,0,0
    goto S0
    BTFSC        STAV,1,0
    goto S1
    BTFSC        STAV,2,0
    goto S2
    BTFSC        STAV,3,0
    goto S3
    BTFSC        STAV,4,0
    goto S4
    BTFSC        stav,5,0
    goto s5

goto Loop

    ; detekce posloupnosti 11110

S0:

    BTFSS        REG,5,0                ;data = 0
    movlw         b'00000010'            ;prejdi na S1

    BTFSC        REG,5,0                ;data = 1
    movlw         b'00000001'            ;prejdi na S0

    movwf         STAV                ;nastav stav

goto RozsvitStav


S1:

    BTFSC        REG,5,0                ;data = 1
    movlw         b'00000100'            ;prejdi na S2

    BTFSS        REG,5,0                ;data = 0
    movlw         b'00000010'            ;prejdi na S1

    movwf         STAV                ;nastav stav

goto RozsvitStav


S2:

    BTFSC        REG,5,0                ;data = 1
    movlw         b'00001000'            ;prejdi na S3

    BTFSS        REG,5,0                ;data = 0
    movlw         b'00000001'            ;prejdi na S0

    movwf         STAV                ;nastav stav

goto RozsvitStav

S3:

    BTFSC        REG,5,0                ;data = 1
    movlw         b'00010000'            ;prejdi na S4

    BTFSS        REG,5,0                ;data = 0
    movlw         b'00000001'            ;prejdi na S0

    movwf         STAV                ;nastav stav

goto RozsvitStav



S4:

    BTFSS        REG,5,0                ;data = 0
    goto         Nalezeno;            ;posloupnost nalezena

    BTFSC        REG,5,0                ;data = 1
    movlw         b'00000001'            ;prejdi na S0

    movwf         STAV                ;nastav stav

goto RozsvitStav


RozsvitStav:

    BCF        REG,0,0                    ;vypni diodu 1
    BCF        REG,1,0                    ;vypni diodu 2
   
    BTFSC     STAV,1,0
    BSF        REG,0,0

    BTFSC     STAV,2,0
    BSF        REG,1,0

    BTFSC    STAV,3,0
    BSF        REG,0,0

    BTFSC    STAV,3,0
    BSF        REG,1,0
   
    BCF        TEMP,6,0                ;logika vyresena

goto Loop;


Nalezeno:

    movlw         b'00000001'            ;nastav stav na S0   
    movwf         STAV               
   
    BSF            BLIK,1,0            ;flag na blikani diod

goto RozsvitStav



;************************************************************************
;***                                 Blikani                                  ***
;************************************************************************

Blikani:

    BTFSS        BLIK,0,0                ;100ms od posledniho rozsviceni/zhasnuti diody?
    goto Loop   

    BTFSS        REG,7,0                    ;vypnute diody?
    goto ZapniBlikaniDiody                ;zapni
   
    goto VypniBlikaniDiody                ;vypni


ZapniBlikaniDiody:

    BSF     REG,7,0            ;rozsvit posledni diodu, ktera ma 3x zablikat pri detekci

    BCF        BLIK,0,0        ;bliknuti probehlo, ceka se na dalsi high interrupt

    BTFSC     BLIK,5,0        ;probehlo uz dvakrat bliknuti?
    BSF     BLIK,6,0        ;bliknuti probehlo potreti

    BTFSC     BLIK,7,0        ;probehlo uz alespoň jednou bliknuti?
    BSF     BLIK,5,0        ;bliknuti probehlo (minimalne) podruhe

    BSF        BLIK,7,0        ;bliknuti probehlo (minimalne) poprve
   
goto Loop


VypniBlikaniDiody:

    BCF     REG,7,0            ;vypni posledni diodu, ktera ma 3x zablikat pri detekci

    BCF        BLIK,0,0        ;bliknuti probehlo, ceka se na dalsi high interrupt

    BTFSC     BLIK,6,0        ;zhasina se treti bliknuti
    clrf    BLIK            ;ukoncit blikani

goto Loop


END     ; konec programu

Offline

 

#2 08. 12. 2011 01:38

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: assembler

Zdravím,
a v čem potřebuješ poradit? Tento semestr programuji taky PIC, tak píchnout mohu. Akorát fakt nevím, co vyžaduješ.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson