Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięPrzeróbka programu
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
Witam
Czy może ktoś przerobic progam termostatu
żeby działał na AVR-ach np.90S2313?
--------------------------------------------------------------
' Termometr do pieca na DS1820, DS18S20
'
'--------------------------------------------------------------
' Czujnik temp. DS1820, DS18S20
' Wyświetlacz 3xLED multiplex
'
'--------------------------------------------------------------
'Wyswietlacze Wspolna Anoda :
'a = P1.0 f = P1.1 jednostki: P3.3
'b = P1.6 g = P1.5 dziesiatki: P3.4
'c = P1.4 setki: P3.5
'd = P1.3
'e = P1.2
'--------------------------------------------------------------
' P3.0 - 1wire z DS1820
' P3.1 - switch A (nie/góra)
' P3.7 - switch B (ustaw)
' P3.2 - przekaznik (aktywny H)
' P1.7 - buzzer (aktywny L)
'--------------------------------------------------------------
' W DS1820 zapisywana jest dolna i gorna temperatura alarmowa
' w rejestrach TH i TL. Po resecie procek powinien ja odczytac
' z ukladu i przechowywac w zmiennej.
' Rozdzielczość wyświetlania: 1 stopień.
'--------------------------------------------------------------
$crystal = 12000000
Config Timer0 = Timer , Gate = Internal , Mode = 2
' Timer 0 jako licznik impulsow wewnetrznych
' Mode = 2: 8-bit auto reload
'--- konfiguracja i zmienne dla 1wire ---
Config 1wire = P3.0 ' use P3.0 for 1 wire communication
Dim Tlo As Byte ' temp dolna ponizej ktorej wylacza sie pompe
Dim Thi As Byte ' temp gorna powyzej ktorej wlacza sie alarm
Dim Bd(9) As Byte ' tablica rejestrów DS'a
Dim T(2) As Byte ' odczyt temperaturki
Dim Temp_buf As Byte ' aktualna teperatura 8 bit
Dim Hist As Bit ' histereza
Dim His As Byte ' histereza +3 stopnie
Dim Cyfry(3) As Byte ' tablica cyfr do wyswietlenia na LED
Dim Cyfra As Byte ' Cyfra do wyswietlenia
Dim Minus As Bit ' BIT - znak minus
Dim Licz_led As Byte ' licznik przerwan dla odmierzania czasu
Dim Licz_odc As Word ' Licznik okresu odczytow temp (max 65535)
Dim Opcje_in As Word ' licznik po ilu wejsc w opcje
Dim Licz_buz As Byte ' licznik dla buzzera
Dim Disp As Byte ' Numer kostki LED
Dim Alarm As Bit ' BIT - Czy Alarm?
Dim Alarm_s As Bit ' BIT - pomocniczy przerywany alarm i odp. LED
Dim Disp_err As Bit ' BIT - Blad
Dim Opcje As Bit ' BIT - jestem w opcjach
Declare Sub Get_temp
Declare Sub Disp_temp
Declare Sub Temp1_up
Declare Sub Temp2_up
Declare Sub Zapis_tmp
'--- ustawienie portow LED ---
P1 = 255 'katody - 1-wygaszone, 0 zapalone
P3.3 = 1 'Anoda jednostek, 1-wygaszony segment
P3.4 = 1 'Anoda dziesiatek, 1-wygaszony segment
P3.5 = 1 'Anoda setek, 1-wygaszony segment
'--- ustawienie innych portow ---
P3.1 = 1 ' przycisk A
P3.7 = 1 ' przycisk B
P3.2 = 0 ' przekaznik
P1.7 = 1 ' wylaczony buzzer
Licz_led = 0
Disp = 0
Alarm = 0
Opcje = 0
Disp_err = 0
Licz_odc = 0
Licz_buz = 0
Hist = 0
'--- odczyt Tlo, Thi oraz inicjalizacja DS1820 ---
1wreset
If Err = 1 Then 'jezeli brak ukladu
Disp_err = 1 ' wyswietl Err
Else
1wwrite &HCC : 1wwrite &HB8 ' odczyt Tlo, Thi z EEPROM do DS'a
Waitms 10
1wreset ' trzeba odczytać tu do zmiennych proca
1wwrite &HCC ' read internal RAM
1wwrite &HBE ' read 9 data bytest
Bd(1) = 1wread(9) ' read bytes in array
1wreset ' reset the bus
Tlo = Bd(4)
Thi = Bd(3)
End If
'--- Ustawienie i uruchomienie Timera i przerwan ---
Load Timer0 , 250 ' przerwanie co 250us dla X=12MHz
On Timer0 Timer_0_int ' Skok do obslugi przerwania od Timera 0
Enable Timer0
Enable Interrupts
Start Timer0 'start the timer
'#############################################################
'##################### Petla glowna ##########################
'#############################################################
Do
'----- start konwersji po 3,5sek
If Licz_odc = 700 Then
Stop Timer0
1wreset
1wwrite &HCC : 1wwrite &H44 ' start konwesji, cc - pomija ROM Code
Licz_odc = 701
Start Timer0
End If
'----- odczyt temp co 5sek (5ms * 1000)
If Licz_odc > 999 Then
Licz_odc = 0
Stop Timer0
Gosub Get_temp
Start Timer0
End If
'----- Piszczek przerywany 200ms
If Licz_buz > 40 And Alarm = 1 Then
Licz_buz = 0
Cpl Alarm_s
End If
'---- wchodzimy w opcje:
If Opcje_in > 600 Then
Opcje_in = 0
Opcje = 1
End If
'##### jestesmy w opcjach #####
While Opcje = 1
Alarm = 0
Alarm_s = 0
Cyfry(3) = 10 ' ---
Cyfry(2) = 10
Cyfry(1) = 10
Do
Loop Until P3.1 = 1 And P3.7 = 1
Waitms 250
Waitms 250
'----- opcja tLo -----
Cyfry(3) = 12 ' kody "tLo"
Cyfry(2) = 15
Cyfry(1) = 16
Do
Debounce P3.1 , 0 , Tlo_no
Debounce P3.7 , 0 , Tlo_ok
Loop
Tlo_ok:
Temp_buf = Tlo
Gosub Disp_temp ' wyswietl aktualne tLo
Do
Debounce P3.1 , 0 , Temp1_up , Sub
Debounce P3.7 , 0 , Tlo_ok_w
Loop
Tlo_ok_w: ' zapis temperatury Tlo w zmiennej
Tlo = Temp_buf
Tlo_no:
'----- opcja tHi -----
Cyfry(3) = 12 ' kody "tHi"
Cyfry(2) = 13
Cyfry(1) = 14
Do
Debounce P3.1 , 0 , Thi_no
Debounce P3.7 , 0 , Thi_ok
Loop
Thi_ok:
Temp_buf = Thi
Gosub Disp_temp ' wyswietl aktualne tHi
Do
Debounce P3.1 , 0 , Temp2_up , Sub
Debounce P3.7 , 0 , Thi_ok_w
Loop
Thi_ok_w:
Thi = Temp_buf
Thi_no:
Cyfry(3) = 16 ' o-o
Cyfry(2) = 10
Cyfry(1) = 16
Opcje = 0
Gosub Zapis_tmp
Wend
'##### koniec opcji #####
Loop
End
'#############################################################
'########## Dodatki do operacji w opcjach ####################
'#############################################################
'zwieksza wartosc temperatury o 1
Temp1_up:
Incr Temp_buf
If Temp_buf > 60 Then
Temp_buf = 10
End If
Gosub Disp_temp
Return
Temp2_up:
Incr Temp_buf
If Temp_buf > 99 Then
Temp_buf = 70
End If
Gosub Disp_temp
Return
' Zapis Tlo i Thi do DS1820
Zapis_tmp:
Stop Timer0
P3.3 = 1 'Anoda setek, 1-wygaszony segment
P3.4 = 1 'Anoda dziesiatek, 1-wygaszony segment
P3.5 = 1 'Anoda jednostek, 1-wygaszony segment
1wreset
1wwrite &HCC : 1wwrite &H4E ' zapis Thi (1-bajt) i Tlo (2-bajt)
1wwrite Thi ' chyba trzeba 1wwrite(2) zrobić
1wwrite Tlo
Waitms 20
1wreset
1wwrite &HCC : 1wwrite &H48 ' zapis temperatur do EEPROM
Waitms 20
1wreset
Start Timer0
Return
'#############################################################
'########## Przerwanie - wyswietlanie LED ####################
'#############################################################
' Aby uzyskac swiecenie LED przez:
' 1ms - nalezy odliczyc 4 przerwania
' 5ms - 20 przerwan.
' Zmiana cyfry co 5ms
Timer_0_int:
Incr Licz_led ' nie? to jeszcze licz dalej timerek
If Licz_led > 19 And Opcje = 0 Then
Incr Licz_odc ' odliczamy odczyty temp
Incr Licz_buz ' czestotliwosc pikania buzzera
If P3.1 = 0 And P3.7 = 0 Then ' ZAPLATANA PROCEDURA WEJSCIA W SERVICE MODE )
Incr Opcje_in ' czas na wejscie w opcje/przelacz pompe
Else
Opcje_in = 0
End If
End If
'----- Wyswietlamy cyferki -----
If Licz_led > 19 Then ' czy minelo 5ms?
Licz_led = 0
P3.3 = 1 'Anoda setek, 1-wygaszony segment
P3.4 = 1 'Anoda dziesiatek, 1-wygaszony segment
P3.5 = 1 'Anoda jednostek, 1-wygaszony segment
Incr Disp ' numer wyswietlacza
If Disp > 3 Then Disp = 1
Cyfra = Cyfry(disp) ' wybiera kod cyfry/znaku z tabeli
' --- wybor tabeli do prezentacji i wyslanie cyfry
If Opcje = 0 Then
If Disp_err = 1 Then
P1 = Lookup(disp , Tab_err) ' "Err"
Elseif Alarm_s = 1 Then
P1 = Lookup(cyfra , Tabela2) ' Temperatura + alarm
Elseif Alarm_s = 0 Then
P1 = Lookup(cyfra , Tabela) ' temeratura
End If
Else
P1 = Lookup(cyfra , Tabela) ' temeratura
End If
' --- wlaczenie danego segmentu
Select Case Disp
Case 1 : Reset P3.3 ' Jednostk1
Case 2 : Reset P3.4 ' Dziesiatki
Case 3 : Reset P3.5 ' Setki
End Select
End If
Return
'#############################################################
'########## Podprogramy - w czasie swiecenia LED #############
'#############################################################
' Odczyt i konwersja do BCD temperatury
' Wynik w tablicy Cyfry() 3-setki, 2-dziesiatki, 1-jednostki
' Test progow temperatury
Get_temp:
1wreset
If Err = 1 Then 'jezeli brak ukladu
Disp_err = 1 ' wyswietl Err
Return
End If
1wwrite &HCC ' read internal RAM skip
1wwrite &HBE ' read 2 data bytest (odczyt temp)
T(1) = 1wread()
T(2) = 1wread()
1wreset
If T(2) = 0 Then
Temp_buf = T(1) / 2
Minus = 0
Else
T(1) = 256 - T(1)
Temp_buf = T(1) / 2
Minus = 1
End If
If Temp_buf = 0 Then
Minus = 0
End If
'------------- Testy progow temperatury --------------
If Temp_buf > Thi Then
Alarm = 1 ' test wysokiej teperatury
Else
Alarm_s = 0
Alarm = 0
End If
' test niskiej temperatury
His = Temp_buf - 3 ' histereza +3 stopnie
If Hist = 0 Then
If Temp_buf > Tlo Then ' brak histerezy
Set P3.2 ' wlacz pompe powyzej zadanej temp.
Else
Reset P3.2
Hist = 1
End If
End If
If Hist = 1 Then
If His > Tlo Then
Set P3.2 ' wlacz pompe powyzej zadanej temp.
Hist = 0
Else
Reset P3.2
End If
End If
'------ Konwersja i zapisanie cyfr w tablicy ----------
Disp_temp:
Cyfry(3) = Temp_buf / 100
Temp_buf = Temp_buf Mod 100
Cyfry(2) = Temp_buf / 10
Cyfry(1) = Temp_buf Mod 10
If Cyfry(3) = 0 Then Cyfry(3) = 11 ' zgas pierwsze zero
If Minus = 1 Then Cyfry(3) = 10 ' znak minus
Return
'#############################################################
'################ Tabele znakow dla LCD ######################
'#############################################################
'---- Dane dla kolejnych cyfr wyswietlacza LED 0...9 ------
'---- brak alarmu ------
' 0 ; 1 ; 2 ; 3 ; 4 ; 5 ; 6 ; 7 ; 8 ; 9 ; - ; ; t ; H ; i ; L ; o ;
Tabela:
Data 160 , 175 , 146 , 134 , 141 , 196 , 192 , 174 , 128 , 132 , 223 , 255 , 209 , 137 , 239 , 241 , 195
'---- + alarm , lub odejmij 128 z tabeli wyzej !!! ------
Tabela2:
Data 32 , 47 , 18 , 6 , 13 , 68 , 64 , 46 , 0 , 4 , 255 , 127
'---- wyswietla Err, kolejne cyfry od najmlodszej (tylu) ------
Tab_err:
Data 255 , 219 , 219 , 208
pozdro woojtex
Czy może ktoś przerobic progam termostatu
żeby działał na AVR-ach np.90S2313?
--------------------------------------------------------------
' Termometr do pieca na DS1820, DS18S20
'
'--------------------------------------------------------------
' Czujnik temp. DS1820, DS18S20
' Wyświetlacz 3xLED multiplex
'
'--------------------------------------------------------------
'Wyswietlacze Wspolna Anoda :
'a = P1.0 f = P1.1 jednostki: P3.3
'b = P1.6 g = P1.5 dziesiatki: P3.4
'c = P1.4 setki: P3.5
'd = P1.3
'e = P1.2
'--------------------------------------------------------------
' P3.0 - 1wire z DS1820
' P3.1 - switch A (nie/góra)
' P3.7 - switch B (ustaw)
' P3.2 - przekaznik (aktywny H)
' P1.7 - buzzer (aktywny L)
'--------------------------------------------------------------
' W DS1820 zapisywana jest dolna i gorna temperatura alarmowa
' w rejestrach TH i TL. Po resecie procek powinien ja odczytac
' z ukladu i przechowywac w zmiennej.
' Rozdzielczość wyświetlania: 1 stopień.
'--------------------------------------------------------------
$crystal = 12000000
Config Timer0 = Timer , Gate = Internal , Mode = 2
' Timer 0 jako licznik impulsow wewnetrznych
' Mode = 2: 8-bit auto reload
'--- konfiguracja i zmienne dla 1wire ---
Config 1wire = P3.0 ' use P3.0 for 1 wire communication
Dim Tlo As Byte ' temp dolna ponizej ktorej wylacza sie pompe
Dim Thi As Byte ' temp gorna powyzej ktorej wlacza sie alarm
Dim Bd(9) As Byte ' tablica rejestrów DS'a
Dim T(2) As Byte ' odczyt temperaturki
Dim Temp_buf As Byte ' aktualna teperatura 8 bit
Dim Hist As Bit ' histereza
Dim His As Byte ' histereza +3 stopnie
Dim Cyfry(3) As Byte ' tablica cyfr do wyswietlenia na LED
Dim Cyfra As Byte ' Cyfra do wyswietlenia
Dim Minus As Bit ' BIT - znak minus
Dim Licz_led As Byte ' licznik przerwan dla odmierzania czasu
Dim Licz_odc As Word ' Licznik okresu odczytow temp (max 65535)
Dim Opcje_in As Word ' licznik po ilu wejsc w opcje
Dim Licz_buz As Byte ' licznik dla buzzera
Dim Disp As Byte ' Numer kostki LED
Dim Alarm As Bit ' BIT - Czy Alarm?
Dim Alarm_s As Bit ' BIT - pomocniczy przerywany alarm i odp. LED
Dim Disp_err As Bit ' BIT - Blad
Dim Opcje As Bit ' BIT - jestem w opcjach
Declare Sub Get_temp
Declare Sub Disp_temp
Declare Sub Temp1_up
Declare Sub Temp2_up
Declare Sub Zapis_tmp
'--- ustawienie portow LED ---
P1 = 255 'katody - 1-wygaszone, 0 zapalone
P3.3 = 1 'Anoda jednostek, 1-wygaszony segment
P3.4 = 1 'Anoda dziesiatek, 1-wygaszony segment
P3.5 = 1 'Anoda setek, 1-wygaszony segment
'--- ustawienie innych portow ---
P3.1 = 1 ' przycisk A
P3.7 = 1 ' przycisk B
P3.2 = 0 ' przekaznik
P1.7 = 1 ' wylaczony buzzer
Licz_led = 0
Disp = 0
Alarm = 0
Opcje = 0
Disp_err = 0
Licz_odc = 0
Licz_buz = 0
Hist = 0
'--- odczyt Tlo, Thi oraz inicjalizacja DS1820 ---
1wreset
If Err = 1 Then 'jezeli brak ukladu
Disp_err = 1 ' wyswietl Err
Else
1wwrite &HCC : 1wwrite &HB8 ' odczyt Tlo, Thi z EEPROM do DS'a
Waitms 10
1wreset ' trzeba odczytać tu do zmiennych proca
1wwrite &HCC ' read internal RAM
1wwrite &HBE ' read 9 data bytest
Bd(1) = 1wread(9) ' read bytes in array
1wreset ' reset the bus
Tlo = Bd(4)
Thi = Bd(3)
End If
'--- Ustawienie i uruchomienie Timera i przerwan ---
Load Timer0 , 250 ' przerwanie co 250us dla X=12MHz
On Timer0 Timer_0_int ' Skok do obslugi przerwania od Timera 0
Enable Timer0
Enable Interrupts
Start Timer0 'start the timer
'#############################################################
'##################### Petla glowna ##########################
'#############################################################
Do
'----- start konwersji po 3,5sek
If Licz_odc = 700 Then
Stop Timer0
1wreset
1wwrite &HCC : 1wwrite &H44 ' start konwesji, cc - pomija ROM Code
Licz_odc = 701
Start Timer0
End If
'----- odczyt temp co 5sek (5ms * 1000)
If Licz_odc > 999 Then
Licz_odc = 0
Stop Timer0
Gosub Get_temp
Start Timer0
End If
'----- Piszczek przerywany 200ms
If Licz_buz > 40 And Alarm = 1 Then
Licz_buz = 0
Cpl Alarm_s
End If
'---- wchodzimy w opcje:
If Opcje_in > 600 Then
Opcje_in = 0
Opcje = 1
End If
'##### jestesmy w opcjach #####
While Opcje = 1
Alarm = 0
Alarm_s = 0
Cyfry(3) = 10 ' ---
Cyfry(2) = 10
Cyfry(1) = 10
Do
Loop Until P3.1 = 1 And P3.7 = 1
Waitms 250
Waitms 250
'----- opcja tLo -----
Cyfry(3) = 12 ' kody "tLo"
Cyfry(2) = 15
Cyfry(1) = 16
Do
Debounce P3.1 , 0 , Tlo_no
Debounce P3.7 , 0 , Tlo_ok
Loop
Tlo_ok:
Temp_buf = Tlo
Gosub Disp_temp ' wyswietl aktualne tLo
Do
Debounce P3.1 , 0 , Temp1_up , Sub
Debounce P3.7 , 0 , Tlo_ok_w
Loop
Tlo_ok_w: ' zapis temperatury Tlo w zmiennej
Tlo = Temp_buf
Tlo_no:
'----- opcja tHi -----
Cyfry(3) = 12 ' kody "tHi"
Cyfry(2) = 13
Cyfry(1) = 14
Do
Debounce P3.1 , 0 , Thi_no
Debounce P3.7 , 0 , Thi_ok
Loop
Thi_ok:
Temp_buf = Thi
Gosub Disp_temp ' wyswietl aktualne tHi
Do
Debounce P3.1 , 0 , Temp2_up , Sub
Debounce P3.7 , 0 , Thi_ok_w
Loop
Thi_ok_w:
Thi = Temp_buf
Thi_no:
Cyfry(3) = 16 ' o-o
Cyfry(2) = 10
Cyfry(1) = 16
Opcje = 0
Gosub Zapis_tmp
Wend
'##### koniec opcji #####
Loop
End
'#############################################################
'########## Dodatki do operacji w opcjach ####################
'#############################################################
'zwieksza wartosc temperatury o 1
Temp1_up:
Incr Temp_buf
If Temp_buf > 60 Then
Temp_buf = 10
End If
Gosub Disp_temp
Return
Temp2_up:
Incr Temp_buf
If Temp_buf > 99 Then
Temp_buf = 70
End If
Gosub Disp_temp
Return
' Zapis Tlo i Thi do DS1820
Zapis_tmp:
Stop Timer0
P3.3 = 1 'Anoda setek, 1-wygaszony segment
P3.4 = 1 'Anoda dziesiatek, 1-wygaszony segment
P3.5 = 1 'Anoda jednostek, 1-wygaszony segment
1wreset
1wwrite &HCC : 1wwrite &H4E ' zapis Thi (1-bajt) i Tlo (2-bajt)
1wwrite Thi ' chyba trzeba 1wwrite(2) zrobić
1wwrite Tlo
Waitms 20
1wreset
1wwrite &HCC : 1wwrite &H48 ' zapis temperatur do EEPROM
Waitms 20
1wreset
Start Timer0
Return
'#############################################################
'########## Przerwanie - wyswietlanie LED ####################
'#############################################################
' Aby uzyskac swiecenie LED przez:
' 1ms - nalezy odliczyc 4 przerwania
' 5ms - 20 przerwan.
' Zmiana cyfry co 5ms
Timer_0_int:
Incr Licz_led ' nie? to jeszcze licz dalej timerek
If Licz_led > 19 And Opcje = 0 Then
Incr Licz_odc ' odliczamy odczyty temp
Incr Licz_buz ' czestotliwosc pikania buzzera
If P3.1 = 0 And P3.7 = 0 Then ' ZAPLATANA PROCEDURA WEJSCIA W SERVICE MODE )
Incr Opcje_in ' czas na wejscie w opcje/przelacz pompe
Else
Opcje_in = 0
End If
End If
'----- Wyswietlamy cyferki -----
If Licz_led > 19 Then ' czy minelo 5ms?
Licz_led = 0
P3.3 = 1 'Anoda setek, 1-wygaszony segment
P3.4 = 1 'Anoda dziesiatek, 1-wygaszony segment
P3.5 = 1 'Anoda jednostek, 1-wygaszony segment
Incr Disp ' numer wyswietlacza
If Disp > 3 Then Disp = 1
Cyfra = Cyfry(disp) ' wybiera kod cyfry/znaku z tabeli
' --- wybor tabeli do prezentacji i wyslanie cyfry
If Opcje = 0 Then
If Disp_err = 1 Then
P1 = Lookup(disp , Tab_err) ' "Err"
Elseif Alarm_s = 1 Then
P1 = Lookup(cyfra , Tabela2) ' Temperatura + alarm
Elseif Alarm_s = 0 Then
P1 = Lookup(cyfra , Tabela) ' temeratura
End If
Else
P1 = Lookup(cyfra , Tabela) ' temeratura
End If
' --- wlaczenie danego segmentu
Select Case Disp
Case 1 : Reset P3.3 ' Jednostk1
Case 2 : Reset P3.4 ' Dziesiatki
Case 3 : Reset P3.5 ' Setki
End Select
End If
Return
'#############################################################
'########## Podprogramy - w czasie swiecenia LED #############
'#############################################################
' Odczyt i konwersja do BCD temperatury
' Wynik w tablicy Cyfry() 3-setki, 2-dziesiatki, 1-jednostki
' Test progow temperatury
Get_temp:
1wreset
If Err = 1 Then 'jezeli brak ukladu
Disp_err = 1 ' wyswietl Err
Return
End If
1wwrite &HCC ' read internal RAM skip
1wwrite &HBE ' read 2 data bytest (odczyt temp)
T(1) = 1wread()
T(2) = 1wread()
1wreset
If T(2) = 0 Then
Temp_buf = T(1) / 2
Minus = 0
Else
T(1) = 256 - T(1)
Temp_buf = T(1) / 2
Minus = 1
End If
If Temp_buf = 0 Then
Minus = 0
End If
'------------- Testy progow temperatury --------------
If Temp_buf > Thi Then
Alarm = 1 ' test wysokiej teperatury
Else
Alarm_s = 0
Alarm = 0
End If
' test niskiej temperatury
His = Temp_buf - 3 ' histereza +3 stopnie
If Hist = 0 Then
If Temp_buf > Tlo Then ' brak histerezy
Set P3.2 ' wlacz pompe powyzej zadanej temp.
Else
Reset P3.2
Hist = 1
End If
End If
If Hist = 1 Then
If His > Tlo Then
Set P3.2 ' wlacz pompe powyzej zadanej temp.
Hist = 0
Else
Reset P3.2
End If
End If
'------ Konwersja i zapisanie cyfr w tablicy ----------
Disp_temp:
Cyfry(3) = Temp_buf / 100
Temp_buf = Temp_buf Mod 100
Cyfry(2) = Temp_buf / 10
Cyfry(1) = Temp_buf Mod 10
If Cyfry(3) = 0 Then Cyfry(3) = 11 ' zgas pierwsze zero
If Minus = 1 Then Cyfry(3) = 10 ' znak minus
Return
'#############################################################
'################ Tabele znakow dla LCD ######################
'#############################################################
'---- Dane dla kolejnych cyfr wyswietlacza LED 0...9 ------
'---- brak alarmu ------
' 0 ; 1 ; 2 ; 3 ; 4 ; 5 ; 6 ; 7 ; 8 ; 9 ; - ; ; t ; H ; i ; L ; o ;
Tabela:
Data 160 , 175 , 146 , 134 , 141 , 196 , 192 , 174 , 128 , 132 , 223 , 255 , 209 , 137 , 239 , 241 , 195
'---- + alarm , lub odejmij 128 z tabeli wyzej !!! ------
Tabela2:
Data 32 , 47 , 18 , 6 , 13 , 68 , 64 , 46 , 0 , 4 , 255 , 127
'---- wyswietla Err, kolejne cyfry od najmlodszej (tylu) ------
Tab_err:
Data 255 , 219 , 219 , 208
pozdro woojtex
-
- -
- Posty:651
- Rejestracja:13 sty 2005, o 18:38
- Lokalizacja:Krasnystaw
- Kontaktowanie:
ja przeczytałam... - fascynujące...Sądzisz że ktoś to przeczyta??
takie tagi są na forum, chyba code i /code się wabią, ale się nie upieram...
a co do samego programu
bascom avr i bascom 51 w kontekście przedstawionego kodu
zbytnio się nie różnią... nalezy tylko odwołania do portów np. 'P3.3' zamienić
na avr-ową nomenklaturę i powinien jakoś ruszyć....o, aliasy w bascom-ie są....
-
- -
- Posty:651
- Rejestracja:13 sty 2005, o 18:38
- Lokalizacja:Krasnystaw
- Kontaktowanie:
Moje wyrazy najszczerszego podziwu .ja przeczytałam...
A poważnie, autor topicu przy niewielkim wysiłku (przynajmniej w kwestii jakościowej)mógłby poradzić sobie z zadaniem. No, ale lepiej napisać długaśny post i czekać na gotowe, jakby ludzie nie mieli nic do roboty tylko przerabiać jakieś kody źródłowe z tego na tamto...
Ehh a Bascom podobno jest taki prosty...
Myślę, że powinna wystarczyć za pomocą "Find/Replace" nazw portów... i zmodyfikować fragmenty odpowiedzialne za timery (ogromnie pomocne są noty katalogowe mikrokontrolerów, ach zapomniałem przeciez są tylko po angielsku), no i zmienić częstotliwość kwarcu bo na 12MHz to 90S2313 raczej nie poleci (albo poleci, ale z dymem )
Poztym aby móc przerobić ten program potrzebny byłby układ bo trzeba w końcu sprawdzić czy po przeróbce działa, a ja osobiście nigdy nie wypuszczę w świat niesprawdzonego programu.
Tak więc autorowi tematu polecam lekturę plików pomocy od Bascoma (na szczęscie w rodzimym języku) a także not katalogowych 89C2051 i 90S2313 (niestety w języku wroga) i dostosowanie programu do różnic pomiedzy 8051 a AVR.
Myślę, że powinna wystarczyć za pomocą "Find/Replace" nazw portów... i zmodyfikować fragmenty odpowiedzialne za timery (ogromnie pomocne są noty katalogowe mikrokontrolerów, ach zapomniałem przeciez są tylko po angielsku), no i zmienić częstotliwość kwarcu bo na 12MHz to 90S2313 raczej nie poleci (albo poleci, ale z dymem )
Poztym aby móc przerobić ten program potrzebny byłby układ bo trzeba w końcu sprawdzić czy po przeróbce działa, a ja osobiście nigdy nie wypuszczę w świat niesprawdzonego programu.
Tak więc autorowi tematu polecam lekturę plików pomocy od Bascoma (na szczęscie w rodzimym języku) a także not katalogowych 89C2051 i 90S2313 (niestety w języku wroga) i dostosowanie programu do różnic pomiedzy 8051 a AVR.
No właśnie , skoro są aliasy , to wystarczy "P1 Alias Portb" ... zamienić 7 na 6 i po krzyku.bascom avr i bascom 51 w kontekście przedstawionego kodu
zbytnio się nie różnią... nalezy tylko odwołania do portów np. 'P3.3' zamienić
na avr-ową nomenklaturę i powinien jakoś ruszyć....o, aliasy w bascom-ie są....
Niestety, ale muszę "ostudzić zapał" zainteresowanego Po kompilacji , kod wynikowy wychodzi grubo poza 2048 B.Moja rada ... napisać samemu od podstaw
Piotrek
Oto program przerobiony na Avr i na procesory 90S8515, 90S4414 gdyż procek 90S2013 ma za mało wy/we
$crystal = 4000000
Config Timer0 = Timer , Prescale = 1
'--- konfiguracja i zmienne dla 1wire ---
Config 1wire = Pind.0 ' use P3.0 for 1 wire communication
Dim Tlo As Byte ' temp dolna ponizej ktorej wylacza sie pompe
Dim Thi As Byte ' temp gorna powyzej ktorej wlacza sie alarm
Dim Bd(9) As Byte ' tablica rejestrów DS'a
Dim T(2) As Byte ' odczyt temperaturki
Dim Temp_buf As Byte ' aktualna teperatura 8 bit
Dim Hist As Bit ' histereza
Dim His As Byte ' histereza +3 stopnie
Dim Cyfry(3) As Byte ' tablica cyfr do wyswietlenia na LED
Dim Cyfra As Byte ' Cyfra do wyswietlenia
Dim Minus As Bit ' BIT - znak minus
Dim Licz_led As Byte ' licznik przerwan dla odmierzania czasu
Dim Licz_odc As Word ' Licznik okresu odczytow temp (max 65535)
Dim Opcje_in As Word ' licznik po ilu wejsc w opcje
Dim Licz_buz As Byte ' licznik dla buzzera
Dim Disp As Byte ' Numer kostki LED
Dim Alarm As Bit ' BIT - Czy Alarm?
Dim Alarm_s As Bit ' BIT - pomocniczy przerywany alarm i odp. LED
Dim Disp_err As Bit ' BIT - Blad
Dim Opcje As Bit ' BIT - jestem w opcjach
Declare Sub Get_temp
Declare Sub Disp_temp
Declare Sub Temp1_up
Declare Sub Temp2_up
Declare Sub Zapis_tmp
Config Portc = Output
Config Pind.4 = Input
Config Pind.3 = Input
Config Pind.2 = Output
Config Pind.1 = Output
'--- ustawienie portow LED ---
Portc = &B11111111 'katody - 1-wygaszone, 0 zapalone
Set Pind.7 'Anoda jednostek, 1-wygaszony segment
Set Pind.6 'Anoda dziesiatek, 1-wygaszony segment
Set Pind.5 'Anoda setek, 1-wygaszony segment
'--- ustawienie innych portow ---
Set Pind.4 ' przycisk A
Set Pind.3 ' przycisk B
Reset Pind.2 ' przekaznik
Set Pind.1 ' wylaczony buzzer
Licz_led = 0
Disp = 0
Alarm = 0
Opcje = 0
Disp_err = 0
Licz_odc = 0
Licz_buz = 0
Hist = 0
'--- odczyt Tlo, Thi oraz inicjalizacja DS1820 ---
1wreset
If Err = 1 Then 'jezeli brak ukladu
Disp_err = 1 ' wyswietl Err
Else
1wwrite &HCC : 1wwrite &HB8 ' odczyt Tlo, Thi z EEPROM do DS'a
Waitms 10
1wreset ' trzeba odczytać tu do zmiennych proca
1wwrite &HCC ' read internal RAM
1wwrite &HBE ' read 9 data bytest
Bd(1) = 1wread(9) ' read bytes in array
1wreset ' reset the bus
Tlo = Bd(4)
Thi = Bd(3)
End If
'--- Ustawienie i uruchomienie Timera i przerwan ---
Load Timer0 , 250 ' przerwanie co 250us dla X=12MHz
On Timer0 Timer_0_int ' Skok do obslugi przerwania od Timera 0
Enable Timer0
Enable Interrupts
Start Timer0 'start the timer
'#############################################################
'##################### Petla glowna ##########################
'#############################################################
Do
'----- start konwersji po 3,5sek
If Licz_odc = 700 Then
Stop Timer0
1wreset
1wwrite &HCC : 1wwrite &H44 ' start konwesji, cc - pomija ROM Code
Licz_odc = 701
Start Timer0
End If
'----- odczyt temp co 5sek (5ms * 1000)
If Licz_odc > 999 Then
Licz_odc = 0
Stop Timer0
Gosub Get_temp
Start Timer0
End If
'----- Piszczek przerywany 200ms
If Licz_buz > 40 And Alarm = 1 Then
Licz_buz = 0
End If
'---- wchodzimy w opcje:
If Opcje_in > 600 Then
Opcje_in = 0
Opcje = 1
End If
'##### jestesmy w opcjach #####
While Opcje = 1
Alarm = 0
Alarm_s = 0
Cyfry(3) = 10 ' ---
Cyfry(2) = 10
Cyfry(1) = 10
Do
Loop Until Pind.4 = 1 And Pind.3 = 1
Waitms 250
Waitms 250
'----- opcja tLo -----
Cyfry(3) = 12 ' kody "tLo"
Cyfry(2) = 15
Cyfry(1) = 16
Do
Debounce Pind.4 , 0 , Tlo_no
Debounce Pind.3 , 0 , Tlo_ok
Loop
Tlo_ok:
Temp_buf = Tlo
Gosub Disp_temp ' wyswietl aktualne tLo
Do
Debounce Pind.4 , 0 , Temp1_up , Sub
Debounce Pind.3 , 0 , Tlo_ok_w
Loop
Tlo_ok_w: ' zapis temperatury Tlo w zmiennej
Tlo = Temp_buf
Tlo_no:
'----- opcja tHi -----
Cyfry(3) = 12 ' kody "tHi"
Cyfry(2) = 13
Cyfry(1) = 14
Do
Debounce Pind.4 , 0 , Thi_no
Debounce Pind.3 , 0 , Thi_ok
Loop
Thi_ok:
Temp_buf = Thi
Gosub Disp_temp ' wyswietl aktualne tHi
Do
Debounce Pind.4 , 0 , Temp2_up , Sub
Debounce Pind.3 , 0 , Thi_ok_w
Loop
Thi_ok_w:
Thi = Temp_buf
Thi_no:
Cyfry(3) = 16 ' o-o
Cyfry(2) = 10
Cyfry(1) = 16
Opcje = 0
Gosub Zapis_tmp
Wend
'##### koniec opcji #####
Loop
End
'#############################################################
'########## Dodatki do operacji w opcjach ####################
'#############################################################
'zwieksza wartosc temperatury o 1
Temp1_up:
Incr Temp_buf
If Temp_buf > 60 Then
Temp_buf = 10
End If
Gosub Disp_temp
Return
Temp2_up:
Incr Temp_buf
If Temp_buf > 99 Then
Temp_buf = 70
End If
Gosub Disp_temp
Return
' Zapis Tlo i Thi do DS1820
Zapis_tmp:
Stop Timer0
Set Pind.7 'Anoda setek, 1-wygaszony segment
Set Pind.6 'Anoda dziesiatek, 1-wygaszony segment
Set Pind.5 'Anoda jednostek, 1-wygaszony segment
1wreset
1wwrite &HCC : 1wwrite &H4E ' zapis Thi (1-bajt) i Tlo (2-bajt)
1wwrite Thi ' chyba trzeba 1wwrite(2) zrobić
1wwrite Tlo
Waitms 20
1wreset
1wwrite &HCC : 1wwrite &H48 ' zapis temperatur do EEPROM
Waitms 20
1wreset
Start Timer0
Return
'#############################################################
'########## Przerwanie - wyswietlanie LED ####################
'#############################################################
' Aby uzyskac swiecenie LED przez:
' 1ms - nalezy odliczyc 4 przerwania
' 5ms - 20 przerwan.
' Zmiana cyfry co 5ms
Timer_0_int:
Incr Licz_led ' nie? to jeszcze licz dalej timerek
If Licz_led > 19 And Opcje = 0 Then
Incr Licz_odc ' odliczamy odczyty temp
Incr Licz_buz ' czestotliwosc pikania buzzera
If Pind.4 = 0 And Pind.3 = 0 Then ' ZAPLATANA PROCEDURA WEJSCIA W SERVICE MODE )
Incr Opcje_in ' czas na wejscie w opcje/przelacz pompe
Else
Opcje_in = 0
End If
End If
'----- Wyswietlamy cyferki -----
If Licz_led > 19 Then ' czy minelo 5ms?
Licz_led = 0
Set Pind.7 'Anoda setek, 1-wygaszony segment
Set Pind.6 'Anoda dziesiatek, 1-wygaszony segment
Set Pind.5 'Anoda jednostek, 1-wygaszony segment
Incr Disp ' numer wyswietlacza
If Disp > 3 Then Disp = 1
Cyfra = Cyfry(disp) ' wybiera kod cyfry/znaku z tabeli
' --- wybor tabeli do prezentacji i wyslanie cyfry
If Opcje = 0 Then
If Disp_err = 1 Then
Portc = Lookup(disp , Tab_err) ' "Err"
Elseif Alarm_s = 1 Then
Portc = Lookup(cyfra , Tabela2) ' Temperatura + alarm
Elseif Alarm_s = 0 Then
Portc = Lookup(cyfra , Tabela) ' temeratura
End If
Else
Portc = Lookup(cyfra , Tabela) ' temeratura
End If
' --- wlaczenie danego segmentu
Select Case Disp
Case 1 : Reset Pind.7 ' Jednostk1
Case 2 : Reset Pind.6 ' Dziesiatki
Case 3 : Reset Pind.5 ' Setki
End Select
End If
Return
'#############################################################
'########## Podprogramy - w czasie swiecenia LED #############
'#############################################################
' Odczyt i konwersja do BCD temperatury
' Wynik w tablicy Cyfry() 3-setki, 2-dziesiatki, 1-jednostki
' Test progow temperatury
Get_temp:
1wreset
If Err = 1 Then 'jezeli brak ukladu
Disp_err = 1 ' wyswietl Err
Return
End If
1wwrite &HCC ' read internal RAM skip
1wwrite &HBE ' read 2 data bytest (odczyt temp)
T(1) = 1wread()
T(2) = 1wread()
1wreset
If T(2) = 0 Then
Temp_buf = T(1) / 2
Minus = 0
Else
T(1) = 256 - T(1)
Temp_buf = T(1) / 2
Minus = 1
End If
If Temp_buf = 0 Then
Minus = 0
End If
'------------- Testy progow temperatury --------------
If Temp_buf > Thi Then
Alarm = 1 ' test wysokiej teperatury
Else
Alarm_s = 0
Alarm = 0
End If
' test niskiej temperatury
His = Temp_buf - 3 ' histereza +3 stopnie
If Hist = 0 Then
If Temp_buf > Tlo Then ' brak histerezy
Set Pind.2 ' wlacz pompe powyzej zadanej temp.
Else
Reset Pind.2
Hist = 1
End If
End If
If Hist = 1 Then
If His > Tlo Then
Set Pind.2 ' wlacz pompe powyzej zadanej temp.
Hist = 0
Else
Reset Pind.2
End If
End If
'------ Konwersja i zapisanie cyfr w tablicy ----------
Disp_temp:
Cyfry(3) = Temp_buf / 100
Temp_buf = Temp_buf Mod 100
Cyfry(2) = Temp_buf / 10
Cyfry(1) = Temp_buf Mod 10
If Cyfry(3) = 0 Then Cyfry(3) = 11 ' zgas pierwsze zero
If Minus = 1 Then Cyfry(3) = 10 ' znak minus
Return
'#############################################################
'################ Tabele znakow dla LCD ######################
'#############################################################
'---- Dane dla kolejnych cyfr wyswietlacza LED 0...9 ------
'---- brak alarmu ------
' 0 ; 1 ; 2 ; 3 ; 4 ; 5 ; 6 ; 7 ; 8 ; 9 ; - ; ; t ; H ; i ; L ; o ;
Tabela:
Data 160 , 175 , 146 , 134 , 141 , 196 , 192 , 174 , 128 , 132 , 223 , 255 , 209 , 137 , 239 , 241 , 195
'---- + alarm , lub odejmij 128 z tabeli wyzej !!! ------
Tabela2:
Data 32 , 47 , 18 , 6 , 13 , 68 , 64 , 46 , 0 , 4 , 255 , 127
'---- wyswietla Err, kolejne cyfry od najmlodszej (tylu) ------
Tab_err:
Data 255 , 219 , 219 , 208
$crystal = 4000000
Config Timer0 = Timer , Prescale = 1
'--- konfiguracja i zmienne dla 1wire ---
Config 1wire = Pind.0 ' use P3.0 for 1 wire communication
Dim Tlo As Byte ' temp dolna ponizej ktorej wylacza sie pompe
Dim Thi As Byte ' temp gorna powyzej ktorej wlacza sie alarm
Dim Bd(9) As Byte ' tablica rejestrów DS'a
Dim T(2) As Byte ' odczyt temperaturki
Dim Temp_buf As Byte ' aktualna teperatura 8 bit
Dim Hist As Bit ' histereza
Dim His As Byte ' histereza +3 stopnie
Dim Cyfry(3) As Byte ' tablica cyfr do wyswietlenia na LED
Dim Cyfra As Byte ' Cyfra do wyswietlenia
Dim Minus As Bit ' BIT - znak minus
Dim Licz_led As Byte ' licznik przerwan dla odmierzania czasu
Dim Licz_odc As Word ' Licznik okresu odczytow temp (max 65535)
Dim Opcje_in As Word ' licznik po ilu wejsc w opcje
Dim Licz_buz As Byte ' licznik dla buzzera
Dim Disp As Byte ' Numer kostki LED
Dim Alarm As Bit ' BIT - Czy Alarm?
Dim Alarm_s As Bit ' BIT - pomocniczy przerywany alarm i odp. LED
Dim Disp_err As Bit ' BIT - Blad
Dim Opcje As Bit ' BIT - jestem w opcjach
Declare Sub Get_temp
Declare Sub Disp_temp
Declare Sub Temp1_up
Declare Sub Temp2_up
Declare Sub Zapis_tmp
Config Portc = Output
Config Pind.4 = Input
Config Pind.3 = Input
Config Pind.2 = Output
Config Pind.1 = Output
'--- ustawienie portow LED ---
Portc = &B11111111 'katody - 1-wygaszone, 0 zapalone
Set Pind.7 'Anoda jednostek, 1-wygaszony segment
Set Pind.6 'Anoda dziesiatek, 1-wygaszony segment
Set Pind.5 'Anoda setek, 1-wygaszony segment
'--- ustawienie innych portow ---
Set Pind.4 ' przycisk A
Set Pind.3 ' przycisk B
Reset Pind.2 ' przekaznik
Set Pind.1 ' wylaczony buzzer
Licz_led = 0
Disp = 0
Alarm = 0
Opcje = 0
Disp_err = 0
Licz_odc = 0
Licz_buz = 0
Hist = 0
'--- odczyt Tlo, Thi oraz inicjalizacja DS1820 ---
1wreset
If Err = 1 Then 'jezeli brak ukladu
Disp_err = 1 ' wyswietl Err
Else
1wwrite &HCC : 1wwrite &HB8 ' odczyt Tlo, Thi z EEPROM do DS'a
Waitms 10
1wreset ' trzeba odczytać tu do zmiennych proca
1wwrite &HCC ' read internal RAM
1wwrite &HBE ' read 9 data bytest
Bd(1) = 1wread(9) ' read bytes in array
1wreset ' reset the bus
Tlo = Bd(4)
Thi = Bd(3)
End If
'--- Ustawienie i uruchomienie Timera i przerwan ---
Load Timer0 , 250 ' przerwanie co 250us dla X=12MHz
On Timer0 Timer_0_int ' Skok do obslugi przerwania od Timera 0
Enable Timer0
Enable Interrupts
Start Timer0 'start the timer
'#############################################################
'##################### Petla glowna ##########################
'#############################################################
Do
'----- start konwersji po 3,5sek
If Licz_odc = 700 Then
Stop Timer0
1wreset
1wwrite &HCC : 1wwrite &H44 ' start konwesji, cc - pomija ROM Code
Licz_odc = 701
Start Timer0
End If
'----- odczyt temp co 5sek (5ms * 1000)
If Licz_odc > 999 Then
Licz_odc = 0
Stop Timer0
Gosub Get_temp
Start Timer0
End If
'----- Piszczek przerywany 200ms
If Licz_buz > 40 And Alarm = 1 Then
Licz_buz = 0
End If
'---- wchodzimy w opcje:
If Opcje_in > 600 Then
Opcje_in = 0
Opcje = 1
End If
'##### jestesmy w opcjach #####
While Opcje = 1
Alarm = 0
Alarm_s = 0
Cyfry(3) = 10 ' ---
Cyfry(2) = 10
Cyfry(1) = 10
Do
Loop Until Pind.4 = 1 And Pind.3 = 1
Waitms 250
Waitms 250
'----- opcja tLo -----
Cyfry(3) = 12 ' kody "tLo"
Cyfry(2) = 15
Cyfry(1) = 16
Do
Debounce Pind.4 , 0 , Tlo_no
Debounce Pind.3 , 0 , Tlo_ok
Loop
Tlo_ok:
Temp_buf = Tlo
Gosub Disp_temp ' wyswietl aktualne tLo
Do
Debounce Pind.4 , 0 , Temp1_up , Sub
Debounce Pind.3 , 0 , Tlo_ok_w
Loop
Tlo_ok_w: ' zapis temperatury Tlo w zmiennej
Tlo = Temp_buf
Tlo_no:
'----- opcja tHi -----
Cyfry(3) = 12 ' kody "tHi"
Cyfry(2) = 13
Cyfry(1) = 14
Do
Debounce Pind.4 , 0 , Thi_no
Debounce Pind.3 , 0 , Thi_ok
Loop
Thi_ok:
Temp_buf = Thi
Gosub Disp_temp ' wyswietl aktualne tHi
Do
Debounce Pind.4 , 0 , Temp2_up , Sub
Debounce Pind.3 , 0 , Thi_ok_w
Loop
Thi_ok_w:
Thi = Temp_buf
Thi_no:
Cyfry(3) = 16 ' o-o
Cyfry(2) = 10
Cyfry(1) = 16
Opcje = 0
Gosub Zapis_tmp
Wend
'##### koniec opcji #####
Loop
End
'#############################################################
'########## Dodatki do operacji w opcjach ####################
'#############################################################
'zwieksza wartosc temperatury o 1
Temp1_up:
Incr Temp_buf
If Temp_buf > 60 Then
Temp_buf = 10
End If
Gosub Disp_temp
Return
Temp2_up:
Incr Temp_buf
If Temp_buf > 99 Then
Temp_buf = 70
End If
Gosub Disp_temp
Return
' Zapis Tlo i Thi do DS1820
Zapis_tmp:
Stop Timer0
Set Pind.7 'Anoda setek, 1-wygaszony segment
Set Pind.6 'Anoda dziesiatek, 1-wygaszony segment
Set Pind.5 'Anoda jednostek, 1-wygaszony segment
1wreset
1wwrite &HCC : 1wwrite &H4E ' zapis Thi (1-bajt) i Tlo (2-bajt)
1wwrite Thi ' chyba trzeba 1wwrite(2) zrobić
1wwrite Tlo
Waitms 20
1wreset
1wwrite &HCC : 1wwrite &H48 ' zapis temperatur do EEPROM
Waitms 20
1wreset
Start Timer0
Return
'#############################################################
'########## Przerwanie - wyswietlanie LED ####################
'#############################################################
' Aby uzyskac swiecenie LED przez:
' 1ms - nalezy odliczyc 4 przerwania
' 5ms - 20 przerwan.
' Zmiana cyfry co 5ms
Timer_0_int:
Incr Licz_led ' nie? to jeszcze licz dalej timerek
If Licz_led > 19 And Opcje = 0 Then
Incr Licz_odc ' odliczamy odczyty temp
Incr Licz_buz ' czestotliwosc pikania buzzera
If Pind.4 = 0 And Pind.3 = 0 Then ' ZAPLATANA PROCEDURA WEJSCIA W SERVICE MODE )
Incr Opcje_in ' czas na wejscie w opcje/przelacz pompe
Else
Opcje_in = 0
End If
End If
'----- Wyswietlamy cyferki -----
If Licz_led > 19 Then ' czy minelo 5ms?
Licz_led = 0
Set Pind.7 'Anoda setek, 1-wygaszony segment
Set Pind.6 'Anoda dziesiatek, 1-wygaszony segment
Set Pind.5 'Anoda jednostek, 1-wygaszony segment
Incr Disp ' numer wyswietlacza
If Disp > 3 Then Disp = 1
Cyfra = Cyfry(disp) ' wybiera kod cyfry/znaku z tabeli
' --- wybor tabeli do prezentacji i wyslanie cyfry
If Opcje = 0 Then
If Disp_err = 1 Then
Portc = Lookup(disp , Tab_err) ' "Err"
Elseif Alarm_s = 1 Then
Portc = Lookup(cyfra , Tabela2) ' Temperatura + alarm
Elseif Alarm_s = 0 Then
Portc = Lookup(cyfra , Tabela) ' temeratura
End If
Else
Portc = Lookup(cyfra , Tabela) ' temeratura
End If
' --- wlaczenie danego segmentu
Select Case Disp
Case 1 : Reset Pind.7 ' Jednostk1
Case 2 : Reset Pind.6 ' Dziesiatki
Case 3 : Reset Pind.5 ' Setki
End Select
End If
Return
'#############################################################
'########## Podprogramy - w czasie swiecenia LED #############
'#############################################################
' Odczyt i konwersja do BCD temperatury
' Wynik w tablicy Cyfry() 3-setki, 2-dziesiatki, 1-jednostki
' Test progow temperatury
Get_temp:
1wreset
If Err = 1 Then 'jezeli brak ukladu
Disp_err = 1 ' wyswietl Err
Return
End If
1wwrite &HCC ' read internal RAM skip
1wwrite &HBE ' read 2 data bytest (odczyt temp)
T(1) = 1wread()
T(2) = 1wread()
1wreset
If T(2) = 0 Then
Temp_buf = T(1) / 2
Minus = 0
Else
T(1) = 256 - T(1)
Temp_buf = T(1) / 2
Minus = 1
End If
If Temp_buf = 0 Then
Minus = 0
End If
'------------- Testy progow temperatury --------------
If Temp_buf > Thi Then
Alarm = 1 ' test wysokiej teperatury
Else
Alarm_s = 0
Alarm = 0
End If
' test niskiej temperatury
His = Temp_buf - 3 ' histereza +3 stopnie
If Hist = 0 Then
If Temp_buf > Tlo Then ' brak histerezy
Set Pind.2 ' wlacz pompe powyzej zadanej temp.
Else
Reset Pind.2
Hist = 1
End If
End If
If Hist = 1 Then
If His > Tlo Then
Set Pind.2 ' wlacz pompe powyzej zadanej temp.
Hist = 0
Else
Reset Pind.2
End If
End If
'------ Konwersja i zapisanie cyfr w tablicy ----------
Disp_temp:
Cyfry(3) = Temp_buf / 100
Temp_buf = Temp_buf Mod 100
Cyfry(2) = Temp_buf / 10
Cyfry(1) = Temp_buf Mod 10
If Cyfry(3) = 0 Then Cyfry(3) = 11 ' zgas pierwsze zero
If Minus = 1 Then Cyfry(3) = 10 ' znak minus
Return
'#############################################################
'################ Tabele znakow dla LCD ######################
'#############################################################
'---- Dane dla kolejnych cyfr wyswietlacza LED 0...9 ------
'---- brak alarmu ------
' 0 ; 1 ; 2 ; 3 ; 4 ; 5 ; 6 ; 7 ; 8 ; 9 ; - ; ; t ; H ; i ; L ; o ;
Tabela:
Data 160 , 175 , 146 , 134 , 141 , 196 , 192 , 174 , 128 , 132 , 223 , 255 , 209 , 137 , 239 , 241 , 195
'---- + alarm , lub odejmij 128 z tabeli wyzej !!! ------
Tabela2:
Data 32 , 47 , 18 , 6 , 13 , 68 , 64 , 46 , 0 , 4 , 255 , 127
'---- wyswietla Err, kolejne cyfry od najmlodszej (tylu) ------
Tab_err:
Data 255 , 219 , 219 , 208
arek To nie jest krytyka , tylko ... delikatne zwrócenie uwagi
Pin-y czytamy , a zapisujemy(ustawiamy/kasujemy)Port-y.
Pozdrawiam
Piotrek
Fakt , tylko ...Oto program przerobiony na Avr ...
Powiedziałbym "za mało FLASH-u"i na procesory 90S8515, 90S4414 gdyż procek 90S2013 ma za mało wy/we
Kod: Zaznacz cały
...
Set Pind.7 'Anoda jednostek, 1-wygaszony segment
Set Pind.6 'Anoda dziesiatek, 1-wygaszony segment
Set Pind.5 'Anoda setek, 1-wygaszony segment
...
Pozdrawiam
Piotrek
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 69 gości