Advertisement
Guest User

Untitled

a guest
May 25th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'Program wyświetlajacy dane z dwoch czujnikow temperatury
  2. 'Komunikacja za pomocą magistarli RS485
  3. 'Program nasłucchuje linie i w przypadku otrzymania właściwych danych
  4. 'Wyświetla zmierzoną temperaturę
  5.  
  6. 'by Bartosz Kościelniak
  7.  
  8. '''''''''''''''''''OBLICZANIE PARAMETRÓW KONFIGURACYJNYCH'''''''''''''''''''''''
  9. Const Prescfc = 0                                           'potęga dzielnika częstotliwości taktowania procesora
  10. Const Fcrystal =(14745600 /(2 ^ Prescfc))                   'częstotliwość po przeskalowaniu
  11. 'stałe konfiguracujne USARTów
  12. Const Baundrs0 = 115200                                     'prędkość transmisji po RS [bps] USART0
  13. Const _ubrr0 =(((fcrystal / Baundrs0) / 16) - 1)            'potrzebne w następnych zadaniach
  14. Const Baundrs1 = Baundrs0                                   'prędkość transmisji po RS [bps] USART1
  15. Const _ubrr1 =(((fcrystal / Baundrs1) / 16) - 1)            'potrzebne w następnych zadaniach
  16.  
  17.  
  18. '''''''''''''''''''KONFIGUROWANIE MIKROKONTROLERA'''''''''''''''''''''''''''''''
  19. $regfile = "m644pdef.dat"                                   'plik konfiguracyjny z literką "p" w nazwie
  20. $crystal = Fcrystal
  21. '$baud = Baundrs0    'zbędne gdy inicjalizacja w zdefiniowanej procedurze
  22.  
  23.  
  24. '''''''''''''''''''WGRYWANIA ADRESÓW DO PAMIĘCI EEPROM''''''''''''''''''''''''''
  25. $eeprom                                                     'wrzucic adresy czujnikow/ zawartość eeprom wgrywana na zasadzie programowania
  26. Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0       '0...15
  27. Data 3 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0       '16...31, 16 - adres wlasny (dec.)
  28. $data
  29.  
  30.  
  31. '''''''''''''''''''DEFINIOWANIE ALIASÓW REJESTRÓW PROCESORA'''''''''''''''''''''
  32. Temp Alias R16
  33. Temph Alias R17
  34. Rstemp Alias R18
  35. Rsdata Alias R19
  36. 'pozostałe aliasy
  37. Te_pin Alias 4
  38. Te Alias Portd.te_pin                                       'sterowanie przepływem w nadajniku/odbiorniku linii
  39.  
  40.  
  41. '''''''''''''''''''DEKLAROWANIE PRZERWAŃ MIKROKONTROLERA''''''''''''''''''''''''
  42. On Urxc Usart0_rx Nosave                                    'deklaracja przerwania URXC (odbiór znaku USART0)
  43. On Urxc1 Usart1_rx Nosave                                   'deklaracja przerwania URXC1 (odbiór znaku USART1)
  44. On Utxc1 Usart1_tx_end Nosave                               'deklaracja przerwania UTXC1, koniec nadawania
  45.  
  46.  
  47. '''''''''''''''''''DEKLAROWANIE ZMIENNYCH'''''''''''''''''''''''''''''''''''''''
  48. Dim Adrw As Byte                                            'adres własny
  49. Dim Adro As Byte                                            'adres odbiorcy 0...15
  50. Dim Lstr As Byte                                            'liczba odebranych znaków z USART0
  51. Const Bof_bit = &B11000000                                  'znak poczatku ramki
  52. Dim Stan_odbioru As Byte                                    'stan odbioru
  53. Const Eof_bit = &B10000000                                  'znak konca ramki
  54.  
  55.  
  56. ''''''''''''''''''ZMNIEJSZENIE CZĘSTOTLIWOŚCI TAKTOWANIA PROCESORA''''''''''''''
  57. ldi temp,128
  58. !Out clkpr,temp                                             'ustawienie bitu 7, CLKPR = 128
  59. ldi temp,prescfc                                            'aktualizacja CLKPR dopiero po uprzednim ustawienu bitu 7
  60. !Out clkpr,temp                                             'CLKPR = Prescfc
  61.  
  62.  
  63. ''''''''''''''''''KONFIGURACJA LCD''''''''''''''''''''''''''''''''''''''''''''''
  64. Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
  65. Config Lcd = 16 * 2
  66.  
  67. Waitms 200
  68. Initlcd
  69.  
  70. Cls
  71.  
  72.  
  73. ''''''''''''''''''INICJALIZACJA USARTÓW I WŁĄCZENIE PRZERWAŃ''''''''''''''''''''
  74. rcall usart_init                                            'inicjalizacja USARTów i włączenie przerwań
  75. Sei                                                         'włączenie globalnie przerwań
  76.  
  77. Readeeprom Adrw , 3                                         '
  78.  
  79.  
  80. ''''''''''''''''''PĘTLA GŁÓWNA PROGRAMU'''''''''''''''''''''''''''''''''''''''''
  81. Do
  82.    'inne procedury
  83. Loop
  84.  
  85.  
  86. ''''''''''''''''''PRZERWANIE USART0_RX''''''''''''''''''''''''''''''''''''''''''
  87. Usart0_rx:
  88.    push rstemp                                              'etykieta bascomowa koniecznie bez !
  89.    in rstemp,sreg                                           'o ile potrzeba  - sprawdzić
  90.    push rstemp                                              'o ile potrzeba - sprawdzić
  91.    push rsdata                                              'o ile potrzeba  - sprawdzić
  92.    push yl                                                  'o ile potrzeba  - sprawdzić
  93.    push yh                                                  'o ile potrzeba  - sprawdzić
  94.    push r1                                                  'o ile potrzeba  - sprawdzić
  95.    push r0                                                  'o ile potrzeba  - sprawdzić
  96.  
  97.    rcall rs_rx                                              'kod może być bezpośrenio w usart_rx
  98.  
  99.    'odtworzenie stanu jak przed przerwaniem
  100.    pop r0
  101.    pop r1
  102.    pop yh
  103.    pop yl
  104.    pop rsdata
  105.    pop rstemp
  106.    !out sreg,rstemp
  107.    pop rstemp
  108. Return
  109.  
  110.  
  111. ''''''''''''''''''PRZERWANIE USART1_RX''''''''''''''''''''''''''''''''''''''''''
  112. Usart1_rx:                                                  'etykieta bascomowa koniecznie bez !
  113.    push rstemp                                              'o ile potrzeba - sprawdzić
  114.    in rstemp,sreg                                           'o ile potrzeba  - sprawdzić
  115.    push rstemp                                              'o ile potrzeba - sprawdzić
  116. '   push yl          'o ile potrzeba  - sprawdzić
  117. '   push yh          'o ile potrzeba  - sprawdzić
  118.    push rsdata
  119.  
  120.    rcall rs_rx1
  121.  
  122.    in rsdata,udr1
  123.    'weryfikacja
  124.    !out udr0,rstemp                                         'wysłanie znaku do komputera bez przetwarzania
  125.    'odtworzenie stanu jak przed przerwanie
  126. '   pop yh
  127. '   pop yl
  128.    pop rstemp
  129.    !out sreg,rstemp
  130.    pop rstemp
  131. Return                                                      '
  132.  
  133.  
  134. ''''''''''''''''''FUNKCJA RS_RX'''''''''''''''''''''''''''''''''''''''''''''''''
  135. !rs_rx:
  136.    In rsdata ,UDR1                                          'wczytanie wartości rejesrtu udr1
  137.    MoV rstemp, rsdata                                       'skopiowanie wartosci rejestru
  138.    subi rstemp, bof_bit                                     'odejmowanie wartości początku ramki od nadanej ramki
  139.    sbis sreg, 2                                             'sprawdzenie czy ramka zawiera informacje (wynik>=0 -> BOF/EOF, wynik<0 -> informacja)
  140.    rjmp sprawdz_stan                                        'sprawdzenie czy ramka została nadana do nas
  141.    rcall sprawdz_adres
  142.    ret
  143.  
  144. !sprawdz_stan:                                              'skopiowanie wartosci ramki
  145.    LDS rstemp, {stan_odbioru}                               'wczytaj bit stanu odbioru do rstemp
  146.    CPI rstemp, 1                                            'jeśli rstemp jest = 1 to
  147.       BREQ wyswietl_dane
  148.    ret
  149.  
  150. !wyswietl_dane:
  151.    'kod wyswietlajacy wskazania z czujników temperatury
  152.  
  153. !sprawdz_adres:
  154.    MOV rstemp, rsdata
  155.    subi rstemp,128
  156.    CPI rstemp, adrw
  157.       LDI rstemp, 1
  158.       STS {stan_odbioru}, rstemp
  159.       RET
  160.    cpi rsdata, eofm_bit
  161.       sbis sreg, 1
  162.       Ret
  163.    ldi rstemp, 0
  164.    sts {stanodbioru}, rstemp
  165.    RET
  166.  
  167.  
  168.  
  169.  
  170. in rsdata, udr1
  171. mov rstemp,rsdata
  172. subi rstemp, bof
  173.  
  174. !przetwornik_a:
  175.    subi rsdata
  176. !przetwornik_b:
  177.  
  178.  
  179. ''''''''''''''''''FUNKCJA RS_RX1''''''''''''''''''''''''''''''''''''''''''''''''
  180. !rs_rx1:
  181.    in rsdata,udr1
  182.    'weryfikacja
  183.    'subi rsdata,bof_bit       ' po odjeciu powinien wyjsc adres wlasny\
  184.  
  185.  
  186.    lds rstemp,{adrw}
  187.    subi rstemp,(256-bof_bit)
  188.    !sub rstemp,rsdata
  189.  
  190.    brne  no_bof
  191.       ldi rstemp,1
  192.       sts {stanodbioru},rstemp
  193.       ret
  194.    !no_bof:
  195.  
  196.    lds rstemp,{stanodbioru}
  197.    cpi rstemp,1
  198.    sbis sreg,1                                              'obejscie ret gdy rstemp=1
  199.       ret
  200.    !out Udr0,rsdata                                         'wysylanie znaku do komputera bez przetwarzania
  201.  
  202.      Cpi rsdata,13
  203.       sbis sreg,1
  204.       ret
  205.  
  206.    ldi rstemp,0
  207.    sts {stanodbioru},rstemp
  208.    ret
  209.  
  210.  
  211.    ldi rsdata,10
  212.  
  213.    !pc_tx:
  214.       Sbis ucsr0a, udre0
  215.          rjmp pc_tx
  216.    !out udr0,rsdata
  217. Return
  218.  
  219.  
  220. ''''''''''''''''''FUNKCJA USART_INIT''''''''''''''''''''''''''''''''''''''''''''
  221. !usart_init:
  222. 'procedura inicjalizacji USARTów
  223.    ldi temp,0
  224.    !out ubrr0h,temp                                         'bardziej znaczący bajt UBRR USART0
  225.    !out ubrr1h,temp
  226.    ldi temp,_ubrr0
  227.    !out ubrr0l,temp                                         'mniej znaczący bajt UBRR USART0
  228.    ldi temp,_ubrr1
  229.    !out ubrr1l,temp                                         'mniej znaczący bajt UBRR USART1
  230.    ldi temp,24                                              'włączone odbiorniki i nadajniki USARTów
  231.    !out ucsr0b,temp
  232.    !out ucsr1b,temp
  233.    ldi temp,6                                               'N8bit
  234.    !out ucsr0C,temp
  235.    !out ucsr1C,temp
  236.    'ustawienia RS485
  237.    Te = 0                                                   'domyślnie stan odbioru
  238.    sbi ddrd,Te_pin                                          'wyjście TE silnoprądowe (ustawienie tego pinu na 0)
  239.    'włączenie przerwań
  240.    Enable Urxc
  241.    Enable Urxc1
  242.    Enable Utxc1
  243. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement