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
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:
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
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š.
Offline