Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;///////// DiodaT2 ////////////////////////////////////////////////////////
- ; Program w??cza diody w kolejno?ci 3, 2, 1 po ˝ sek. ka?da, wykorzystuj?c
- ; modu? Timer2, tablice i rezonator kwarcowy o cz?stotliwo?ci 4 MHz.
- ;
- ;///////// Hierarchia programu ////////////////////////////////////////////
- ;
- ;//////////////////////////////////////////////////////////////////////////
- list C=160, N=80, ST=OFF, MM=OFF
- #include "P16F877A.INC"
- __config ( _CP_OFF & _PWRTE_ON & _HS_OSC & _WDT_OFF & _BODEN_OFF )
- errorlevel -302
- ;///////// Sta?e //////////////////////////////////////////////////////////
- ; equ - equal - rowny
- Bank0RAM equ H'20'
- S_LICZNIK equ 250
- S_LICZNIK_PETLA equ 2
- ;///////// Zmienne ////////////////////////////////////////////////////////
- cblock Bank0RAM
- INDEKS
- W_TEMP
- STATUS_TEMP
- LICZNIK
- LICZNIK_PETLA
- endc
- ;///////// Wektory ////////////////////////////////////////////////////////
- org H'000'
- goto ProgramGlowny
- org H'004'
- WektorPrzerwania
- goto ProcObsPrzerwan
- ;///////// Tablica Przelacz ///////////////////////////////////////////////
- TablicaPrzelacz
- addwf PCL,F
- retlw B'00000010'
- retlw B'00000100'
- retlw B'00001000'
- retlw B'00010000'
- retlw B'00100000'
- retlw B'01000000'
- retlw B'10000000'
- retlw B'00000010'
- ;///////// Program g?ówny /////////////////////////////////////////////////
- ProgramGlowny
- call Inicjalizacja
- nop
- PetlaGlowna
- nop
- nop
- goto PetlaGlowna
- ;///////// Procedura Inicjalizacja ////////////////////////////////////////
- Inicjalizacja
- movlw S_LICZNIK
- movwf LICZNIK
- movlw S_LICZNIK_PETLA
- movwf LICZNIK_PETLA
- clrf INDEKS
- movlw B'00000001'
- movwf PORTD
- bsf STATUS,RP0
- movlw B'10000011' ;Preskaler ustawiony na 1/16 bo 011 koncowka
- movwf OPTION_REG
- clrf TRISD
- bcf STATUS,RP0
- movlw D'132'
- movwf TMR0
- bsf INTCON,T0IE
- bsf INTCON,GIE
- return
- ;///////// Procedura ProcObsPrzerwan //////////////////////////////////////
- ;ProcObsPrzerwan pokazuje sposób obs?ugi wszystkich ?róde? przerwa?. wyj?cie z procedury obs?ugi przerwania
- ProcObsPrzerwan
- movwf W_TEMP ;Zachowanie rejestru roboczego
- swapf STATUS,W ;Zachowanie rejestru status
- movwf STATUS_TEMP
- btfsc INTCON,TMR0IF
- call Timer0
- swapf STATUS_TEMP,W
- movwf STATUS
- swapf W_TEMP,F
- swapf W_TEMP,W
- retfie
- ;///////// Procedura Timer0 ///////////////////////////////////////////////
- Timer0
- bcf INTCON, T0IF
- movlw D'132' ;Wartość 132 zapisana do Timer0 bierze się z 256 + 1 – 2000/16 =257 – 125 = 132
- addwf TMR0
- decfsz LICZNIK,F
- goto Timer0_koniec
- movlw S_LICZNIK
- movwf LICZNIK
- decfsz LICZNIK_PETLA,F
- goto Timer0_koniec
- movlw S_LICZNIK_PETLA
- movwf LICZNIK_PETLA
- movlw B'00000111'
- andwf INDEKS,F
- movf INDEKS,W
- incf INDEKS,F
- call TablicaPrzelacz
- movwf PORTD
- Timer0_koniec
- return
- end
- /////////////////////lakas inna wersja
- ;///////// DiodaT2 ////////////////////////////////////////////////////////
- ; Program w??cza diody w kolejno?ci 3, 2, 1 po ˝ sek. ka?da, wykorzystuj?c
- ; modu? Timer2, tablice i rezonator kwarcowy o cz?stotliwo?ci 4 MHz.
- ;
- ;///////// Hierarchia programu ////////////////////////////////////////////
- ;
- ;//////////////////////////////////////////////////////////////////////////
- list C=160, N=80, ST=OFF, MM=OFF
- #include "P16F877A.INC"
- __config ( _CP_OFF & _PWRTE_ON & _HS_OSC & _WDT_OFF & _BODEN_OFF )
- errorlevel -302
- ;///////// Sta?e //////////////////////////////////////////////////////////
- ; equ - equal - rowny
- Bank0RAM equ H'20'
- S_LICZNIK equ 250
- S_LICZNIK_PETLA equ 2
- ;///////// Zmienne ////////////////////////////////////////////////////////
- cblock Bank0RAM
- INDEKS
- W_TEMP
- STATUS_TEMP
- LICZNIK
- LICZNIK_PETLA
- endc
- ;///////// Wektory ////////////////////////////////////////////////////////
- org H'000'
- goto ProgramGlowny
- org H'004'
- WektorPrzerwania
- goto ProcObsPrzerwan
- ;///////// Tablica Przelacz ///////////////////////////////////////////////
- TablicaPrzelacz
- addwf PCL,F
- retlw B'00000010'
- retlw B'00000100'
- retlw B'00001000'
- retlw B'00010000'
- retlw B'00100000'
- retlw B'01000000'
- retlw B'10000000'
- retlw B'00000010'
- ;///////// Program g?ówny /////////////////////////////////////////////////
- ProgramGlowny
- call Inicjalizacja
- nop
- PetlaGlowna
- nop
- nop
- goto PetlaGlowna
- ;///////// Procedura Inicjalizacja ////////////////////////////////////////
- Inicjalizacja
- movlw S_LICZNIK
- movwf LICZNIK
- movlw S_LICZNIK_PETLA
- movwf LICZNIK_PETLA
- clrf INDEKS
- movlw B'00000001'
- movwf PORTD
- bsf STATUS,RP0
- movlw B'10000011'
- movwf OPTION_REG
- clrf TRISD
- bcf STATUS,RP0
- movlw D'132'
- movwf TMR0
- bsf INTCON,T0IE
- bsf INTCON,GIE
- return
- ;///////// Procedura ProcObsPrzerwan //////////////////////////////////////
- ;ProcObsPrzerwan pokazuje sposób obs?ugi wszystkich ?róde? przerwa?. wyj?cie z procedury obs?ugi przerwania
- ProcObsPrzerwan
- movwf W_TEMP
- swapf STATUS,W
- movwf STATUS_TEMP
- btfsc INTCON,TMR0IF
- call Timer0
- swapf STATUS_TEMP,W
- movwf STATUS
- swapf W_TEMP,F
- swapf W_TEMP,W
- retfie
- ;///////// Procedura Timer0 ///////////////////////////////////////////////
- Timer0
- bcf INTCON, T0IF
- movlw D'132'
- addwf TMR0
- decfsz LICZNIK,F
- goto Timer0_koniec
- movlw S_LICZNIK
- movwf LICZNIK
- decfsz LICZNIK_PETLA,F
- goto Timer0_koniec
- movlw S_LICZNIK_PETLA
- movwf LICZNIK_PETLA
- movlw B'00000111'
- andwf INDEKS,F
- movf INDEKS,W
- incf INDEKS,F
- call TablicaPrzelacz
- movwf PORTD
- Timer0_koniec
- return
- end
- ////////////////////////////////timer2
- ;///////// DiodaT2 ////////////////////////////////////////////////////////
- ; Program w??cza diody w kolejno?ci 3, 2, 1 po ˝ sek. ka?da, wykorzystuj?c
- ; modu? Timer2, tablice i rezonator kwarcowy o cz?stotliwo?ci 8 MHz.
- ;
- ;///////// Hierarchia programu ////////////////////////////////////////////
- ;
- ; ProgramGlowny
- ; Inicjalizacja
- ; Przelacz
- ; Opoznienie
- ; ProcObsPrzerwan
- ; Timer2
- ;
- ;//////////////////////////////////////////////////////////////////////////
- list C=160, N=80, ST=OFF, MM=OFF
- #include "P16C74B.INC"
- __config ( _CP_OFF & _PWRTE_ON & _HS_OSC & _WDT_OFF & _BODEN_OFF )
- errorlevel -302
- ;///////// Sta?e //////////////////////////////////////////////////////////
- Freq equ 8 ;cz?stotliwo?? zegara fosc = 8 MHz
- Bank0RAM equ H'20' ;adres pocz?tkowy Banku 0
- MaksLicz equ 50 ;liczba p?tli wymaganych dla czasu ˝ sek.
- Dioda3 equ B'00000001' ;maska nak?adana na port w celu w??czenia diod
- ;///////// Zmienne ////////////////////////////////////////////////////////
- cblock Bank0RAM
- W_TEMP ;kopia rejestru roboczego,
- STATUS_TEMP ;kopia rejestru STATUS podczas
- ;wykonywania procedury obs?ugi przerwania
- SKALER ;licznik przerwa? z Timer2
- ;wykorzystywany wewn?trz procedury Opoznienie
- ;i dekrementowany wewn?trz procedury Timer2
- LICZPETLE ;g?ówny licznik (50 x 10 ms)
- endc
- ;///////// Wektory ////////////////////////////////////////////////////////
- org H'000'
- goto ProgramGlowny
- org H'004' ;wektor przerwania - używany
- goto ProcObsPrzerwan ;skok do procedury obs?ugi przerwania
- ;///////// Tablica Przelacz ///////////////////////////////////////////////
- TablicaPrzelacz
- movf PORTD, W ;odczytanie aktualnego stanu diod
- andlw B'00000111' ;maska dla odczytania jedynie linii diod
- addwf PCL, F ;zmiana PC sum? zawarto?ci PCLATH i W
- retlw B'00000001' ;(000 ? 001) zapalenie diody 3
- retlw B'00000011' ; 001 ? 010 zapalenie diody 2
- retlw B'00000110' ; 010 ? 100 zapalenie diody 1
- retlw B'00000010'
- retlw B'00000101'
- retlw B'00000100'
- retlw B'00000111'
- retlw B'00000110'
- ;///////// Program g?ówny /////////////////////////////////////////////////
- ProgramGlowny
- call Inicjalizacja
- PetlaGlowna
- call Przelacz
- call Opoznienie ;opó?nienie o warto?ci 10 ms
- goto PetlaGlowna
- ;///////// Procedura Inicjalizacja ////////////////////////////////////////
- Inicjalizacja
- movlw MaksLicz
- movwf LICZPETLE
- movlw Dioda3
- movwf PORTD
- movlw (4*Freq) - 3 ;inicjalizacja modu?u Timera(2)
- movwf T2CON ;4*8 - 3 = 29, 29 = B?00001101?
- ; B?00001101? -> T2CON
- ;TMR2ON=1, preskaler=2, postskaler=4
- movlw 4 ;wart. pocz?tkowa zmiennej SKALER
- movwf SKALER
- bsf INTCON, PEIE ;odblokowanie przerwa? zewn?trznych
- bsf STATUS, RP0 ;dost?p do banku 1
- clrf TRISD ;ustawienie linii portu D jako wyj?cia
- movlw 249 ;inicjalizacja rejestru PR2 (249 -> PR2)
- movwf PR2 ;czyli g?ówny skaler ma warto?? 250
- bsf PIE1, TMR2IE ;odblokowanie przerwania z Timer2
- bcf STATUS, RP0 ;dost?p do banku 0
- bsf INTCON, GIE ;odblokowanie systemu przerwa?
- return
- ;///////// Procedura Przelacz /////////////////////////////////////////////
- Przelacz
- decfsz LICZPETLE, F
- goto PrzelaczKoniec
- movlw MaksLicz
- movwf LICZPETLE
- call TablicaPrzelacz
- xorwf PORTD, F
- PrzelaczKoniec
- return
- ;///////// Procedura Opoznienie ///////////////////////////////////////////
- ;Procedura Opoznienie czeka a? up?ynie czas równy 10 ms. Timer2 jest
- ;zaprogramowany tak aby odmierza? okresy równe 2 ms pomi?dzy kolejnymi
- ;przerwaniami. Aby uzyska? opó?nienie równe 10 ms nale?y zliczy? 5
- ;przerwa? z Timer2. Innymi s?owy nale?y zaczeka? a? zawarto?? licznika
- ;przerwa? SKALER, zmieni si? z B?00000000? na B?11111111?. Przyjmuj?c, ?e
- ;SKALER ma warto?? pocz?tkow? równ? 4, do wy?ej opisanej zmiany dojdzie po
- ;5 dekrementacji zmiennej SKALER.
- Opoznienie
- btfss SKALER, 7 ;bit 7 sprawdzany dopóki równy 0
- ;(oczekiwanie na zmian? 00h -> FFh)
- goto Opoznienie
- movlw 5 ;odnowienie wart. pocz?tkowej zm. SKALER
- addwf SKALER, F ;(FFh + 5)
- return
- ;///////// Procedura ProcObsPrzerwan //////////////////////////////////////
- ;ProcObsPrzerwan pokazuje sposób obs?ugi wszystkich ?róde? przerwa?.
- ProcObsPrzerwan
- movwf W_TEMP ;kopiowanie rejestru roboczego
- swapf STATUS, W ;i rejestru STATUS do RAM-u
- movwf STATUS_TEMP
- btfsc PIR1, TMR2IF ;sprawdzenie czy ?ród?em przerwania jest
- call Timer2 ;Timer2, je?li tak to wywo?anie obs?ugi
- ; btfsc ... ;sprawdzenie innych ?róde? przerwa?
- ; call ...
- swapf STATUS_TEMP, W ;odtworzenie rejestrów W i STATUS
- movwf STATUS ;wykorzystanie instrukcji swapf pozwala
- swapf W_TEMP, F ;na zachowanie znacznika Z bez zmian
- swapf W_TEMP, W
- retfie ;wyj?cie z procedury obs?ugi przerwania
- ;///////// Procedura Timer2 ///////////////////////////////////////////////
- Timer2
- bcf PIR1, TMR2IF ;wyzerowanie flagi TMR2IF
- decf SKALER, F
- return
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement