Advertisement
Jacobs7

l3

Dec 19th, 2022
1,182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;///////// DiodaT2 ////////////////////////////////////////////////////////
  2. ; Program w??cza diody w kolejno?ci 3, 2, 1 po ˝ sek. ka?da, wykorzystuj?c
  3. ; modu? Timer2, tablice i rezonator kwarcowy o cz?stotliwo?ci 4 MHz.
  4. ;
  5. ;///////// Hierarchia programu ////////////////////////////////////////////
  6. ;
  7. ;//////////////////////////////////////////////////////////////////////////
  8.     list C=160, N=80, ST=OFF, MM=OFF
  9.    #include "P16F877A.INC"
  10.     __config ( _CP_OFF & _PWRTE_ON & _HS_OSC & _WDT_OFF & _BODEN_OFF )
  11.     errorlevel -302
  12. ;///////// Sta?e //////////////////////////////////////////////////////////
  13.    ; equ - equal - rowny
  14.     Bank0RAM equ H'20'
  15.     S_LICZNIK equ 250
  16.     S_LICZNIK_PETLA equ 2
  17. ;///////// Zmienne ////////////////////////////////////////////////////////
  18.     cblock Bank0RAM
  19.     INDEKS
  20.     W_TEMP
  21.     STATUS_TEMP
  22.     LICZNIK
  23.     LICZNIK_PETLA
  24.     endc
  25. ;///////// Wektory ////////////////////////////////////////////////////////
  26.     org H'000'
  27.     goto ProgramGlowny
  28.     org H'004'
  29.     WektorPrzerwania
  30.     goto ProcObsPrzerwan
  31. ;///////// Tablica Przelacz ///////////////////////////////////////////////
  32. TablicaPrzelacz
  33.     addwf PCL,F
  34.     retlw B'00000010'
  35.     retlw B'00000100'
  36.     retlw B'00001000'
  37.     retlw B'00010000'
  38.     retlw B'00100000'
  39.     retlw B'01000000'
  40.     retlw B'10000000'
  41.     retlw B'00000010'
  42. ;///////// Program g?ówny /////////////////////////////////////////////////
  43. ProgramGlowny
  44.     call Inicjalizacja
  45.     nop
  46. PetlaGlowna
  47.     nop
  48.     nop
  49.     goto PetlaGlowna
  50. ;///////// Procedura Inicjalizacja ////////////////////////////////////////
  51. Inicjalizacja
  52.     movlw S_LICZNIK
  53.     movwf LICZNIK
  54.     movlw S_LICZNIK_PETLA
  55.     movwf LICZNIK_PETLA
  56.     clrf INDEKS
  57.     movlw B'00000001'
  58.     movwf PORTD
  59.     bsf STATUS,RP0
  60.     movlw B'10000011'   ;Preskaler ustawiony na 1/16 bo 011 koncowka
  61.     movwf OPTION_REG
  62.     clrf TRISD
  63.     bcf STATUS,RP0
  64.     movlw D'132'
  65.     movwf TMR0
  66.     bsf INTCON,T0IE
  67.     bsf INTCON,GIE
  68.     return
  69. ;///////// Procedura ProcObsPrzerwan //////////////////////////////////////
  70. ;ProcObsPrzerwan pokazuje sposób obs?ugi wszystkich ?róde? przerwa?. wyj?cie z procedury obs?ugi przerwania  
  71. ProcObsPrzerwan
  72.     movwf W_TEMP    ;Zachowanie rejestru roboczego
  73.     swapf STATUS,W  ;Zachowanie rejestru status
  74.     movwf STATUS_TEMP  
  75.     btfsc INTCON,TMR0IF
  76.     call Timer0
  77.     swapf STATUS_TEMP,W
  78.     movwf STATUS
  79.     swapf W_TEMP,F
  80.     swapf W_TEMP,W
  81.     retfie    
  82. ;///////// Procedura Timer0 ///////////////////////////////////////////////
  83. Timer0
  84.     bcf INTCON, T0IF
  85.     movlw D'132'    ;Wartość 132 zapisana do Timer0 bierze się z 256 + 1 – 2000/16 =257 – 125 = 132
  86.     addwf TMR0
  87.     decfsz LICZNIK,F
  88.     goto Timer0_koniec
  89.     movlw S_LICZNIK
  90.     movwf LICZNIK
  91.     decfsz LICZNIK_PETLA,F
  92.     goto Timer0_koniec
  93.     movlw S_LICZNIK_PETLA
  94.     movwf LICZNIK_PETLA
  95.     movlw B'00000111'
  96.     andwf INDEKS,F
  97.     movf INDEKS,W
  98.     incf INDEKS,F
  99.     call TablicaPrzelacz
  100.     movwf PORTD
  101. Timer0_koniec
  102.     return
  103.     end
  104.  
  105.  
  106. /////////////////////lakas inna wersja
  107.  
  108. ;///////// DiodaT2 ////////////////////////////////////////////////////////
  109. ; Program w??cza diody w kolejno?ci 3, 2, 1 po ˝ sek. ka?da, wykorzystuj?c
  110. ; modu? Timer2, tablice i rezonator kwarcowy o cz?stotliwo?ci 4 MHz.
  111. ;
  112. ;///////// Hierarchia programu ////////////////////////////////////////////
  113. ;
  114. ;//////////////////////////////////////////////////////////////////////////
  115.     list C=160, N=80, ST=OFF, MM=OFF
  116.    #include "P16F877A.INC"
  117.     __config ( _CP_OFF & _PWRTE_ON & _HS_OSC & _WDT_OFF & _BODEN_OFF )
  118.     errorlevel -302
  119. ;///////// Sta?e //////////////////////////////////////////////////////////
  120.    ; equ - equal - rowny
  121.     Bank0RAM equ H'20'
  122.     S_LICZNIK equ 250
  123.     S_LICZNIK_PETLA equ 2
  124. ;///////// Zmienne ////////////////////////////////////////////////////////
  125.     cblock Bank0RAM
  126.     INDEKS
  127.     W_TEMP
  128.     STATUS_TEMP
  129.     LICZNIK
  130.     LICZNIK_PETLA
  131.     endc
  132. ;///////// Wektory ////////////////////////////////////////////////////////
  133.     org H'000'
  134.     goto ProgramGlowny
  135.     org H'004'
  136.     WektorPrzerwania
  137.     goto ProcObsPrzerwan
  138. ;///////// Tablica Przelacz ///////////////////////////////////////////////
  139. TablicaPrzelacz
  140.     addwf PCL,F
  141.     retlw B'00000010'
  142.     retlw B'00000100'
  143.     retlw B'00001000'
  144.     retlw B'00010000'
  145.     retlw B'00100000'
  146.     retlw B'01000000'
  147.     retlw B'10000000'
  148.     retlw B'00000010'
  149. ;///////// Program g?ówny /////////////////////////////////////////////////
  150. ProgramGlowny
  151.     call Inicjalizacja
  152.     nop
  153. PetlaGlowna
  154.     nop
  155.     nop
  156.     goto PetlaGlowna
  157. ;///////// Procedura Inicjalizacja ////////////////////////////////////////
  158. Inicjalizacja
  159.     movlw S_LICZNIK
  160.     movwf LICZNIK
  161.     movlw S_LICZNIK_PETLA
  162.     movwf LICZNIK_PETLA
  163.     clrf INDEKS
  164.     movlw B'00000001'
  165.     movwf PORTD
  166.     bsf STATUS,RP0
  167.     movlw B'10000011'
  168.     movwf OPTION_REG
  169.     clrf TRISD
  170.     bcf STATUS,RP0
  171.     movlw D'132'
  172.     movwf TMR0
  173.     bsf INTCON,T0IE
  174.     bsf INTCON,GIE
  175.     return
  176. ;///////// Procedura ProcObsPrzerwan //////////////////////////////////////
  177. ;ProcObsPrzerwan pokazuje sposób obs?ugi wszystkich ?róde? przerwa?. wyj?cie z procedury obs?ugi przerwania  
  178. ProcObsPrzerwan
  179.     movwf W_TEMP
  180.     swapf STATUS,W
  181.     movwf STATUS_TEMP
  182.     btfsc INTCON,TMR0IF
  183.     call Timer0
  184.     swapf STATUS_TEMP,W
  185.     movwf STATUS
  186.     swapf W_TEMP,F
  187.     swapf W_TEMP,W
  188.     retfie    
  189. ;///////// Procedura Timer0 ///////////////////////////////////////////////
  190. Timer0
  191.     bcf INTCON, T0IF
  192.     movlw D'132'
  193.     addwf TMR0
  194.     decfsz LICZNIK,F
  195.     goto Timer0_koniec
  196.     movlw S_LICZNIK
  197.     movwf LICZNIK
  198.     decfsz LICZNIK_PETLA,F
  199.     goto Timer0_koniec
  200.     movlw S_LICZNIK_PETLA
  201.     movwf LICZNIK_PETLA
  202.     movlw B'00000111'
  203.     andwf INDEKS,F
  204.     movf INDEKS,W
  205.     incf INDEKS,F
  206.     call TablicaPrzelacz
  207.     movwf PORTD
  208. Timer0_koniec
  209.     return
  210.     end
  211.  
  212.  
  213.  
  214.  
  215.  
  216. ////////////////////////////////timer2
  217.  
  218. ;///////// DiodaT2 ////////////////////////////////////////////////////////
  219. ; Program w??cza diody w kolejno?ci 3, 2, 1 po ˝ sek. ka?da, wykorzystuj?c
  220. ; modu? Timer2, tablice i rezonator kwarcowy o cz?stotliwo?ci 8 MHz.
  221. ;
  222. ;///////// Hierarchia programu ////////////////////////////////////////////
  223. ;
  224. ; ProgramGlowny
  225. ; Inicjalizacja
  226. ; Przelacz
  227. ; Opoznienie
  228. ; ProcObsPrzerwan
  229. ; Timer2
  230. ;
  231. ;//////////////////////////////////////////////////////////////////////////
  232.  
  233.     list C=160, N=80, ST=OFF, MM=OFF
  234.    #include "P16C74B.INC"
  235.     __config ( _CP_OFF & _PWRTE_ON & _HS_OSC & _WDT_OFF & _BODEN_OFF )
  236.     errorlevel -302
  237.  
  238. ;///////// Sta?e //////////////////////////////////////////////////////////
  239.  
  240.     Freq        equ     8       ;cz?stotliwo?? zegara fosc = 8 MHz
  241.     Bank0RAM        equ     H'20'   ;adres pocz?tkowy Banku 0
  242.     MaksLicz        equ     50      ;liczba p?tli wymaganych dla czasu ˝ sek.
  243.     Dioda3      equ     B'00000001' ;maska nak?adana na port w celu w??czenia diod
  244.        
  245. ;///////// Zmienne ////////////////////////////////////////////////////////
  246.  
  247. cblock  Bank0RAM
  248.     W_TEMP      ;kopia rejestru roboczego,
  249.     STATUS_TEMP     ;kopia rejestru STATUS podczas
  250.             ;wykonywania procedury obs?ugi przerwania
  251.     SKALER      ;licznik przerwa? z Timer2
  252.             ;wykorzystywany wewn?trz procedury Opoznienie
  253.             ;i dekrementowany wewn?trz procedury Timer2
  254.     LICZPETLE       ;g?ówny licznik (50 x 10 ms)
  255. endc
  256.    
  257. ;///////// Wektory ////////////////////////////////////////////////////////
  258.  
  259. org H'000'
  260.     goto    ProgramGlowny
  261.    
  262. org H'004'          ;wektor przerwania - używany
  263.     goto    ProcObsPrzerwan ;skok do procedury obs?ugi przerwania
  264.  
  265. ;///////// Tablica Przelacz ///////////////////////////////////////////////
  266. TablicaPrzelacz
  267.     movf    PORTD, W        ;odczytanie aktualnego stanu diod
  268.     andlw   B'00000111'     ;maska dla odczytania jedynie linii diod
  269.     addwf   PCL, F      ;zmiana PC sum? zawarto?ci PCLATH i W
  270.     retlw   B'00000001'     ;(000 ? 001) zapalenie diody 3
  271.     retlw   B'00000011'     ; 001 ? 010 zapalenie diody 2
  272.     retlw   B'00000110'     ; 010 ? 100 zapalenie diody 1
  273.     retlw   B'00000010'
  274.     retlw   B'00000101'
  275.     retlw   B'00000100'
  276.     retlw   B'00000111'
  277.     retlw   B'00000110'
  278.    
  279. ;///////// Program g?ówny /////////////////////////////////////////////////
  280.  
  281. ProgramGlowny
  282.     call    Inicjalizacja
  283.  
  284. PetlaGlowna
  285.     call    Przelacz
  286.     call    Opoznienie      ;opó?nienie o warto?ci 10 ms
  287.     goto    PetlaGlowna
  288.  
  289. ;///////// Procedura Inicjalizacja ////////////////////////////////////////
  290.  
  291. Inicjalizacja
  292.     movlw   MaksLicz
  293.     movwf   LICZPETLE
  294.     movlw   Dioda3
  295.     movwf   PORTD
  296.     movlw   (4*Freq) - 3    ;inicjalizacja modu?u Timera(2)
  297.     movwf   T2CON       ;4*8 - 3 = 29, 29 = B?00001101?
  298.                 ; B?00001101? -> T2CON
  299.                 ;TMR2ON=1, preskaler=2, postskaler=4
  300.     movlw   4           ;wart. pocz?tkowa zmiennej SKALER
  301.     movwf   SKALER
  302.     bsf     INTCON, PEIE    ;odblokowanie przerwa? zewn?trznych
  303.  
  304.     bsf     STATUS, RP0     ;dost?p do banku 1
  305.     clrf    TRISD       ;ustawienie linii portu D jako wyj?cia
  306.    
  307.     movlw   249         ;inicjalizacja rejestru PR2 (249 -> PR2)
  308.     movwf   PR2         ;czyli g?ówny skaler ma warto?? 250
  309.     bsf     PIE1, TMR2IE    ;odblokowanie przerwania z Timer2
  310.  
  311.     bcf     STATUS, RP0     ;dost?p do banku 0
  312.     bsf     INTCON, GIE     ;odblokowanie systemu przerwa?
  313.     return
  314.  
  315. ;///////// Procedura Przelacz /////////////////////////////////////////////
  316.  
  317. Przelacz
  318.     decfsz  LICZPETLE, F
  319.     goto    PrzelaczKoniec
  320.     movlw   MaksLicz
  321.     movwf   LICZPETLE
  322.     call    TablicaPrzelacz
  323.     xorwf   PORTD, F
  324.  
  325. PrzelaczKoniec
  326.     return
  327.  
  328. ;///////// Procedura Opoznienie ///////////////////////////////////////////
  329. ;Procedura Opoznienie czeka a? up?ynie czas równy 10 ms. Timer2 jest
  330. ;zaprogramowany tak aby odmierza? okresy równe 2 ms pomi?dzy kolejnymi
  331. ;przerwaniami. Aby uzyska? opó?nienie równe 10 ms nale?y zliczy? 5
  332. ;przerwa? z Timer2. Innymi s?owy nale?y zaczeka? a? zawarto?? licznika
  333. ;przerwa? SKALER, zmieni si? z B?00000000? na B?11111111?. Przyjmuj?c, ?e
  334. ;SKALER ma warto?? pocz?tkow? równ? 4, do wy?ej opisanej zmiany dojdzie po
  335. ;5 dekrementacji zmiennej SKALER.
  336.    
  337. Opoznienie
  338.     btfss   SKALER, 7       ;bit 7 sprawdzany dopóki równy 0
  339.                 ;(oczekiwanie na zmian? 00h -> FFh)
  340.     goto    Opoznienie
  341.     movlw   5           ;odnowienie wart. pocz?tkowej zm. SKALER
  342.     addwf   SKALER, F       ;(FFh + 5)
  343.     return
  344.    
  345. ;///////// Procedura ProcObsPrzerwan //////////////////////////////////////
  346. ;ProcObsPrzerwan pokazuje sposób obs?ugi wszystkich ?róde? przerwa?.
  347.    
  348. ProcObsPrzerwan
  349.     movwf   W_TEMP      ;kopiowanie rejestru roboczego
  350.     swapf   STATUS, W       ;i rejestru STATUS do RAM-u
  351.     movwf   STATUS_TEMP
  352.     btfsc   PIR1, TMR2IF    ;sprawdzenie czy ?ród?em przerwania jest
  353.     call    Timer2      ;Timer2, je?li tak to wywo?anie obs?ugi
  354.    ; btfsc ... ;sprawdzenie innych ?róde? przerwa?
  355.    ; call ...
  356.     swapf   STATUS_TEMP, W  ;odtworzenie rejestrów W i STATUS
  357.     movwf   STATUS      ;wykorzystanie instrukcji swapf pozwala
  358.     swapf   W_TEMP, F       ;na zachowanie znacznika Z bez zmian
  359.     swapf   W_TEMP, W
  360.     retfie          ;wyj?cie z procedury obs?ugi przerwania  
  361.  
  362. ;///////// Procedura Timer2 ///////////////////////////////////////////////
  363. Timer2
  364.     bcf     PIR1, TMR2IF    ;wyzerowanie flagi TMR2IF
  365.     decf    SKALER, F
  366.     return
  367.    
  368.     end
  369.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement