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

Awatar użytkownika
woojtex
-
-
Posty:1
Rejestracja:2 paź 2005, o 14:28
Lokalizacja:śląsk
Przeróbka programu

Postautor: woojtex » 2 paź 2005, o 14:35

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

a_antoniak
-
-
Posty:651
Rejestracja:13 sty 2005, o 18:38
Lokalizacja:Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 3 paź 2005, o 10:52

Jasne, już lecę, trzymajcie mnie!!! I jaki fajny któtki listing - gratulacje. Sądzisz że ktoś to przeczyta??

Awatar użytkownika
tasza
-
-
Posty:456
Rejestracja:17 sty 2005, o 10:52

Postautor: tasza » 3 paź 2005, o 11:10

Sądzisz że ktoś to przeczyta??
ja przeczytałam... :o - fascynujące...
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ą....

a_antoniak
-
-
Posty:651
Rejestracja:13 sty 2005, o 18:38
Lokalizacja:Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 3 paź 2005, o 14:03

ja przeczytałam...
Moje wyrazy najszczerszego podziwu :).

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...

radzio
Moderator
Moderator
Posty:967
Rejestracja:13 maja 2003, o 10:33
Lokalizacja:Sosnowiec
Kontaktowanie:

Postautor: radzio » 3 paź 2005, o 15:08

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 :lol: )
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.

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 3 paź 2005, o 18:14

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ą....
No właśnie , skoro są aliasy , to wystarczy "P1 Alias Portb" ... zamienić 7 na 6 i po krzyku.
Niestety, ale muszę "ostudzić zapał" zainteresowanego :( Po kompilacji , kod wynikowy wychodzi grubo poza 2048 B.Moja rada ... napisać samemu od podstaw ;)

Piotrek

arek
-
-
Posty:25
Rejestracja:11 maja 2003, o 12:39
Lokalizacja:Opole

Postautor: arek » 3 paź 2005, o 18:59

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

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 3 paź 2005, o 19:54

arek To nie jest krytyka , tylko ... delikatne zwrócenie uwagi :D
Oto program przerobiony na Avr ...
Fakt , tylko ... :(
i na procesory 90S8515, 90S4414 gdyż procek 90S2013 ma za mało wy/we
Powiedziałbym "za mało FLASH-u" :D

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 ...
:569: Pin-y czytamy , a zapisujemy(ustawiamy/kasujemy)Port-y.

Pozdrawiam
Piotrek

arek
-
-
Posty:25
Rejestracja:11 maja 2003, o 12:39
Lokalizacja:Opole

Postautor: arek » 3 paź 2005, o 20:36

Fakt, że może źle się określiłem, to nie przerobienie, lecz jedna z wielu propozycji przygotowana w piętnaście minut programu. W pośpiechu można popełnić błędy pin-port, tylko szkoda, że nikt nie podjął się tego tematu tylko wszyscy krytykują czyjeś podknięcia. :(

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 45 gości