Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'Program wyświetlajacy dane z dwoch czujnikow temperatury
- 'Komunikacja za pomocą magistarli RS485
- 'Program nasłucchuje linie i w przypadku otrzymania właściwych danych
- 'Wyświetla zmierzoną temperaturę
- 'by Bartosz Kościelniak
- '''''''''''''''''''OBLICZANIE PARAMETRÓW KONFIGURACYJNYCH'''''''''''''''''''''''
- Const Prescfc = 0 'potęga dzielnika częstotliwości taktowania procesora
- Const Fcrystal =(14745600 /(2 ^ Prescfc)) 'częstotliwość po przeskalowaniu
- 'stałe konfiguracujne USARTów
- Const Baundrs0 = 115200 'prędkość transmisji po RS [bps] USART0
- Const _ubrr0 =(((fcrystal / Baundrs0) / 16) - 1) 'potrzebne w następnych zadaniach
- Const Baundrs1 = Baundrs0 'prędkość transmisji po RS [bps] USART1
- Const _ubrr1 =(((fcrystal / Baundrs1) / 16) - 1) 'potrzebne w następnych zadaniach
- '''''''''''''''''''KONFIGUROWANIE MIKROKONTROLERA'''''''''''''''''''''''''''''''
- $regfile = "m644pdef.dat" 'plik konfiguracyjny z literką "p" w nazwie
- $crystal = Fcrystal
- '$baud = Baundrs0 'zbędne gdy inicjalizacja w zdefiniowanej procedurze
- '''''''''''''''''''WGRYWANIA ADRESÓW DO PAMIĘCI EEPROM''''''''''''''''''''''''''
- $eeprom 'wrzucic adresy czujnikow/ zawartość eeprom wgrywana na zasadzie programowania
- Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 '0...15
- Data 3 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 '16...31, 16 - adres wlasny (dec.)
- $data
- '''''''''''''''''''DEFINIOWANIE ALIASÓW REJESTRÓW PROCESORA'''''''''''''''''''''
- Temp Alias R16
- Temph Alias R17
- Rstemp Alias R18
- Rsdata Alias R19
- 'pozostałe aliasy
- Te_pin Alias 4
- Te Alias Portd.te_pin 'sterowanie przepływem w nadajniku/odbiorniku linii
- '''''''''''''''''''DEKLAROWANIE PRZERWAŃ MIKROKONTROLERA''''''''''''''''''''''''
- On Urxc Usart0_rx Nosave 'deklaracja przerwania URXC (odbiór znaku USART0)
- On Urxc1 Usart1_rx Nosave 'deklaracja przerwania URXC1 (odbiór znaku USART1)
- On Utxc1 Usart1_tx_end Nosave 'deklaracja przerwania UTXC1, koniec nadawania
- '''''''''''''''''''DEKLAROWANIE ZMIENNYCH'''''''''''''''''''''''''''''''''''''''
- Dim Adrw As Byte 'adres własny
- Dim Adro As Byte 'adres odbiorcy 0...15
- Dim Lstr As Byte 'liczba odebranych znaków z USART0
- Const Bof_bit = &B11000000 'znak poczatku ramki
- Dim Stan_odbioru As Byte 'stan odbioru
- Const Eof_bit = &B10000000 'znak konca ramki
- ''''''''''''''''''ZMNIEJSZENIE CZĘSTOTLIWOŚCI TAKTOWANIA PROCESORA''''''''''''''
- ldi temp,128
- !Out clkpr,temp 'ustawienie bitu 7, CLKPR = 128
- ldi temp,prescfc 'aktualizacja CLKPR dopiero po uprzednim ustawienu bitu 7
- !Out clkpr,temp 'CLKPR = Prescfc
- ''''''''''''''''''KONFIGURACJA LCD''''''''''''''''''''''''''''''''''''''''''''''
- Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
- Config Lcd = 16 * 2
- Waitms 200
- Initlcd
- Cls
- ''''''''''''''''''INICJALIZACJA USARTÓW I WŁĄCZENIE PRZERWAŃ''''''''''''''''''''
- rcall usart_init 'inicjalizacja USARTów i włączenie przerwań
- Sei 'włączenie globalnie przerwań
- Readeeprom Adrw , 3 '
- ''''''''''''''''''PĘTLA GŁÓWNA PROGRAMU'''''''''''''''''''''''''''''''''''''''''
- Do
- 'inne procedury
- Loop
- ''''''''''''''''''PRZERWANIE USART0_RX''''''''''''''''''''''''''''''''''''''''''
- Usart0_rx:
- push rstemp 'etykieta bascomowa koniecznie bez !
- in rstemp,sreg 'o ile potrzeba - sprawdzić
- push rstemp 'o ile potrzeba - sprawdzić
- push rsdata 'o ile potrzeba - sprawdzić
- push yl 'o ile potrzeba - sprawdzić
- push yh 'o ile potrzeba - sprawdzić
- push r1 'o ile potrzeba - sprawdzić
- push r0 'o ile potrzeba - sprawdzić
- rcall rs_rx 'kod może być bezpośrenio w usart_rx
- 'odtworzenie stanu jak przed przerwaniem
- pop r0
- pop r1
- pop yh
- pop yl
- pop rsdata
- pop rstemp
- !out sreg,rstemp
- pop rstemp
- Return
- ''''''''''''''''''PRZERWANIE USART1_RX''''''''''''''''''''''''''''''''''''''''''
- Usart1_rx: 'etykieta bascomowa koniecznie bez !
- push rstemp 'o ile potrzeba - sprawdzić
- in rstemp,sreg 'o ile potrzeba - sprawdzić
- push rstemp 'o ile potrzeba - sprawdzić
- ' push yl 'o ile potrzeba - sprawdzić
- ' push yh 'o ile potrzeba - sprawdzić
- push rsdata
- rcall rs_rx1
- in rsdata,udr1
- 'weryfikacja
- !out udr0,rstemp 'wysłanie znaku do komputera bez przetwarzania
- 'odtworzenie stanu jak przed przerwanie
- ' pop yh
- ' pop yl
- pop rstemp
- !out sreg,rstemp
- pop rstemp
- Return '
- ''''''''''''''''''FUNKCJA RS_RX'''''''''''''''''''''''''''''''''''''''''''''''''
- !rs_rx:
- In rsdata ,UDR1 'wczytanie wartości rejesrtu udr1
- MoV rstemp, rsdata 'skopiowanie wartosci rejestru
- subi rstemp, bof_bit 'odejmowanie wartości początku ramki od nadanej ramki
- sbis sreg, 2 'sprawdzenie czy ramka zawiera informacje (wynik>=0 -> BOF/EOF, wynik<0 -> informacja)
- rjmp sprawdz_stan 'sprawdzenie czy ramka została nadana do nas
- rcall sprawdz_adres
- ret
- !sprawdz_stan: 'skopiowanie wartosci ramki
- LDS rstemp, {stan_odbioru} 'wczytaj bit stanu odbioru do rstemp
- CPI rstemp, 1 'jeśli rstemp jest = 1 to
- BREQ wyswietl_dane
- ret
- !wyswietl_dane:
- 'kod wyswietlajacy wskazania z czujników temperatury
- !sprawdz_adres:
- MOV rstemp, rsdata
- subi rstemp,128
- CPI rstemp, adrw
- LDI rstemp, 1
- STS {stan_odbioru}, rstemp
- RET
- cpi rsdata, eofm_bit
- sbis sreg, 1
- Ret
- ldi rstemp, 0
- sts {stanodbioru}, rstemp
- RET
- in rsdata, udr1
- mov rstemp,rsdata
- subi rstemp, bof
- !przetwornik_a:
- subi rsdata
- !przetwornik_b:
- ''''''''''''''''''FUNKCJA RS_RX1''''''''''''''''''''''''''''''''''''''''''''''''
- !rs_rx1:
- in rsdata,udr1
- 'weryfikacja
- 'subi rsdata,bof_bit ' po odjeciu powinien wyjsc adres wlasny\
- lds rstemp,{adrw}
- subi rstemp,(256-bof_bit)
- !sub rstemp,rsdata
- brne no_bof
- ldi rstemp,1
- sts {stanodbioru},rstemp
- ret
- !no_bof:
- lds rstemp,{stanodbioru}
- cpi rstemp,1
- sbis sreg,1 'obejscie ret gdy rstemp=1
- ret
- !out Udr0,rsdata 'wysylanie znaku do komputera bez przetwarzania
- Cpi rsdata,13
- sbis sreg,1
- ret
- ldi rstemp,0
- sts {stanodbioru},rstemp
- ret
- ldi rsdata,10
- !pc_tx:
- Sbis ucsr0a, udre0
- rjmp pc_tx
- !out udr0,rsdata
- Return
- ''''''''''''''''''FUNKCJA USART_INIT''''''''''''''''''''''''''''''''''''''''''''
- !usart_init:
- 'procedura inicjalizacji USARTów
- ldi temp,0
- !out ubrr0h,temp 'bardziej znaczący bajt UBRR USART0
- !out ubrr1h,temp
- ldi temp,_ubrr0
- !out ubrr0l,temp 'mniej znaczący bajt UBRR USART0
- ldi temp,_ubrr1
- !out ubrr1l,temp 'mniej znaczący bajt UBRR USART1
- ldi temp,24 'włączone odbiorniki i nadajniki USARTów
- !out ucsr0b,temp
- !out ucsr1b,temp
- ldi temp,6 'N8bit
- !out ucsr0C,temp
- !out ucsr1C,temp
- 'ustawienia RS485
- Te = 0 'domyślnie stan odbioru
- sbi ddrd,Te_pin 'wyjście TE silnoprądowe (ustawienie tego pinu na 0)
- 'włączenie przerwań
- Enable Urxc
- Enable Urxc1
- Enable Utxc1
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement