Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

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