Termostat LED do wytrawiarki


Witam.Jestem w trakcie robienia wytrawiarki i termostatu do niej.Opieram się na projekcie kolegi Ducha.Zrobił bardzo fajny termostat na diodach led.Jego program trochę przerobiłem na moje potrzeby.Lecz nic nie trwa wiecznie.Na początku szło gładko,ale potem zaczeły sie schody.W założeniu mój program ma działać tak:

-temperatura wyświetla sie od 35 stopni C do 45 stopni C na led (10)
-ustawiam temperature microswitch,po włączeniu zasilania klikam raz i zapala sie 1 dioda,drugi raz klikam i następna itd. poczym potwierdzam to przytrzymując microswitch na 5s (wszystkie diody mrygną raz po potwierdzeniu)
-histereza 2 stopnie C
-jak grzałka grzeje to pali sie czerwona led a jak nie grzeje to zielona led
-pompkę załączam 2 microswitch,port sie otwiera lub zamyka a do portu jest podłączony przekaźnik

Część programu już mam ale dalej nie wiem co zrobić.Bardzo proszę o pomoc.Poniżej kod.

$regfile = "m8def.DAT" 'deklaracja procesora, w tym wypadku Atmega8 
$crystal = 1000000 'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza) 
 
 
 
'*************************************WAŻNE********************************************** 
'Pamiętać o podłączeniu rezystora podciągającego o wartości 4.7kohm między linią DQ a VCC 
Config 1wire = Portd.6 'deklaracja portu na którym będą podpięte DS18b20 
Config Portd.3 = Input 'Microswitch 1 
Config Portd.4 = Input 'Microswitch 2 
do 'pętla nieskończona 
 
if pinb.0=1 then 'jeżeli przycisk 1 wciśnięty 
portd.0=1 'otwiera port 
elseif pinb.1=1 then 'jeżeli przycisk 2 wciśnięty 
portd.0=0 'zamyka port 
endif 'koniec bloku warunkowego 
 
loop 'koniec pętli 
 
 
Config Portd.7 = Output 'Przekaźnik 2 
Config Portb.0 = Output 'Przekaźnik 1 
Config Portc.5 = Output 
Config Portc.4 = Output 
Config Portc.3 = Output 
Config Portc.2 = Output 
Config Portc.1 = Output 
Config Portc.0 = Output 
Config Portb.5 = Output 
Config Portb.4 = Output 
Config Portb.3 = Output 
Config Portb.2 = Output 
Config Portb.1 = Output 
 
Config 1wire = Portd.6 
 
Dim Ilosc_czujnikow As Byte 
Dim Powtorz As Byte 
Dim I1 As Integer , Ss As String * 6 
Dim Temp As Integer 
Dim Dsid1( As Byte 
Dim Tempmax As Byte 
Dim Tempmin As Byte 
Dim Status_grzalki As Bit 
 
Grzanie Alias Portb.0 
Led45 Alias Portc.5 
Led44 Alias Portc.4 
Led43 Alias Portc.3 
Led42 Alias Portc.2 
Led41 Alias Portc.1 
Led40 Alias Portc.0 
Led39 Alias Portb.5 
Led38 Alias Portb.4 
Led37 Alias Portb.3 
Led36 Alias Portb.2 
Led35 Alias Portb.1 
Powerled Alias Portd.2 
 
 
Set Led45 
Set Led44 
Set Led43 
Set Led42 
Set Led41 
Set Led40 
Set Led39 
Set Led38 
Set Led37 
Set Led36 
Set Led35 
Reset Grzanie 
Reset Powerled 
 
 
 
 
'------------------Ustawienia początkowe----------------- 
Tempmax = 35 
Tempmin = 34 
 
Status_grzalki = 0 
Powtorz = 0 
'----------------------Start programu-------------------- 
 
 
 
Waitms 100 
Set Powerled 
 
 
 
Poczatek: 
Do 
 
 
Gosub Pomiar_temperatury 
Gosub Wyswietl_temp 
Gosub Termostat 
 
Loop 
 
 
'-------------Obsługa Pomiar temperatury------------- 
Pomiar_temperatury: 
1wreset 
1wwrite &HCC 
1wwrite &H44 
Wait 2 
 
1wreset 
1wwrite &H55 
1wverify Dsid1(1) 'wysyłamy adres pierwszego czujnika 
1wwrite &HBE 
I1 = 1wread(2) 
Wait 1 
 
I1 = I1 * 10 
I1 = I1 / 16 
Temp = I1 / 10 
Return 
 
'-------------Obsługa Wyswietlanie temperatury------------- 
Wyswietl_temp: 
If Temp >= 35 Then 
Reset Led35 
Else 
Set Led35 
End If 
 
If Temp >= 36 Then 
Reset Led36 
Else 
Set Led36 
End If 
 
If Temp >= 37 Then 
Reset Led37 
Else 
Set Led37 
End If 
 
If Temp >= 38 Then 
Reset Led38 
Else 
Set Led38 
End If 
 
If Temp >= 39 Then 
Reset Led39 
Else 
Set Led39 
End If 
 
If Temp >= 40 Then 
Reset Led40 
Else 
Set Led40 
End If 
 
If Temp >= 41 Then 
Reset Led41 
Else 
Set Led41 
End If 
 
If Temp >= 42 Then 
Reset Led42 
Else 
Set Led42 
End If 
 
If Temp >= 43 Then 
Reset Led43 
Else 
Set Led43 
End If 
 
If Temp >= 44 Then 
Reset Led44 
Else 
Set Led44 
 
If Temp >= 45 Then 
Reset Led45 
Else 
Set Led45 
 
Return 
 
'-------------Obsługa Termostatu------------- 
Termostat: 
If Temp >= Tempmax And Status_grzalki = 1 Then 
Status_grzalki = 0 
Reset Grzanie 
End If 
 
If Temp =< Tempmin And Status_grzalki = 0 Then 
Status_grzalki = 1 
Set Grzanie 
End If 
 
Return 

Pozdro:)




Portret użytkownika mirley

Re: Program termostat

po pierwsze... fragmenty kodów zamiesza się w odpowiednim znaczniku, przciski nad polem edycyjnym w tym pomagają.

CO ten fragment programu robi wśród poleceń konfiguracyjnych?

do 'pętla nieskończona 
 
if pinb.0=1 then 'jeżeli przycisk 1 wciśnięty 
portd.0=1 'otwiera port 
elseif pinb.1=1 then 'jeżeli przycisk 2 wciśnięty 
portd.0=0 'zamyka port 
endif 'koniec bloku warunkowego 
 
loop 'koniec pętli 

Nie wiem czy testowałeś działanie programu ale przy takim działaniu program nigdy nie wyjdzie poza ten fragment. Poza tym w programie masz dwie główne pętle a tak byc nie może, albo przynajmniej nie powinno tak być.

Obsługa przycisków tak poprostu poprzez sprawdzanie stanu na porcie raczej nie zda egzaminu, no chyba że masz coś sprzętowo do polepszania sygnału z przycisku.

Dla uproszczenia zapisu, całą konfiguracje portów i ich stanów początkowych załatwia się na początku programu za pomocą 3 linijek. Popatrz do jakiegokolwiek mojego programu pod atmega8.

Nie rozumiem tez jeszcze po co jest etykieta Poczatek: przed pętlą do loop.

Jeśli chodzi o ustawianie temperatury to chcesz żeby było wykonywane zawsze na starcie czy zawsze jak sobie klikniesz pierwszy usw to wchodzisz do ustawień i miga aktualna dioda w słupku. Dodatkowo robienie reakcji na 5s trzymania jest kłopotliwe, nie wystarczy jak masz dwa przyciski wykorzystać jeden do włączania ustawień temperatury, jak już jest ustawianie to oba przyciski działają jako + i - po czym naciśnięcie 2 naraz albo odczekanie kilku sekund powoduje powrót do normalnej pracy? Nacisnięcie drugiego przycisku podczas normalnej pracy zmienia stan pompki i po problemie

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Witam,dzięki za

Witam,dzięki za odpowoiedź.Zdecydowałem się że temperatura będzie ustawiona w programie na stałe 40 stopni C.Wyświetlanie temperatury będzie na 10 led (od 30 stopni C do 40 stopni C).Histereza 1 stopień C.Dioda czerwona będzie się palić jak grzałka będzie grzać a zielona jak nie grzeje.Tylko z tym przekaźnikiem do pompki jest problem.Ja to sobie wyobraźam tak,do portu Atmegi8 jest podczepiony microswitch i jak go nacisne to jakieś inny port sie otworzy popłynie napięcie na przekaźnik itd. i tak samo w drugą stronę jak drugi raz nacisne microswitch to obwód sie przerywa.Poniżej zamieszczam poprawiony kod,bardzo bym prosił o pomoc bo wszystkego nie udało mi sie napisać ponieważ nie wiem jak :)

$regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
$crystal = 1000000                                          'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
 
 
 
'*************************************WAŻNE**********************************************
'Pamiętać o podłączeniu rezystora podciągającego o wartości 4.7kohm między linią DQ a VCC
Config 1wire = Portd.6                                      'deklaracja portu na którym będą podpięte DS18b20
 
Config Portd.3 = Input                                      'Microswitch 1
Config Portd.7 = Output                                     'Przekaźnik 2 pompka
Config Portb.0 = Output                                     'Przekaźnik 1 grzałka
Config Portc.4 = Output
Config Portc.3 = Output
Config Portc.2 = Output
Config Portc.1 = Output
Config Portc.0 = Output
Config Portb.5 = Output
Config Portb.4 = Output
Config Portb.3 = Output
Config Portb.2 = Output
Config Portb.1 = Output
 
Config 1wire = Portd.6
 
Dim Ilosc_czujnikow As Byte
Dim Powtorz As Byte
Dim I1 As Integer , Ss As String * 6
Dim Temp As Integer
Dim Dsid1(8) As Byte
Dim Tempmax As Byte
Dim Tempmin As Byte
Dim Status_grzalki As Bit
Dim Temp_zalaczenie_pompki As Byte
 
 
Grzanie Alias Portb.0
Led40 Alias Portc.5
Led39 Alias Portc.4
Led38 Alias Portc.3
Led37 Alias Portc.2
Led36 Alias Portc.1
Led35 Alias Portc.0
Led34 Alias Portb.5
Led33 Alias Portb.4
Led32 Alias Portb.3
Led31 Alias Portb.2
Led30 Alias Portb.1
Powerled Alias Portd.2
 
 
Set Led40
Set Led39
Set Led38
Set Led37
Set Led36
Set Led35
Set Led34
Set Led33
Set Led32
Set Led31
Set Led30
Reset Grzanie
 
Reset Powerled
 
 
'------------------Ustawienia początkowe-----------------
Tempmax = 35
Tempmin = 34
Temp_zalaczenie_pompki = 40
 
Status_grzalki = 0
Powtorz = 0
'----------------------Start programu--------------------
 
 
 
Waitms 100
Set Powerled
 
 
 
Poczatek:
Do
 
 
Gosub Pomiar_temperatury
Gosub Wyswietl_temp
Gosub Termostat
 
Loop
 
 
'-------------Obsługa Pomiar temperatury-------------
Pomiar_temperatury:
1wreset
   1wwrite &HCC
   1wwrite &H44
Wait 2
 
   1wreset
   1wwrite &H55
   1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
   1wwrite &HBE
   I1 = 1wread(2)
Wait 1
 
  I1 = I1 * 10
  I1 = I1 / 16
  Temp = I1 / 10
Return
 
'-------------Obsługa Wyswietlanie temperatury-------------
Wyswietl_temp:
If Temp >= 30 Then
Reset Led30
Else
Set Led30
End If
 
If Temp >= 31 Then
Reset Led31
Else
Set Led31
End If
 
If Temp >= 32 Then
Reset Led32
Else
Set Led32
End If
 
If Temp >= 33 Then
Reset Led33
Else
Set Led33
End If
 
If Temp >= 34 Then
Reset Led34
Else
Set Led34
End If
 
If Temp >= 35 Then
Reset Led35
Else
Set Led35
End If
 
If Temp >= 36 Then
Reset Led36
Else
Set Led36
End If
 
If Temp >= 37 Then
Reset Led37
Else
Set Led37
End If
If Temp >= 38 Then
Reset Led38
Else
Set Led38
End If
 
If Temp >= 39 Then
Reset Led39
Else
Set Led39
End If
 
If Temp >= 40 Then
Reset Led40
Else
Set Led40
End If
 
 
 
'-------------Obsługa Termostatu-------------
Termostat:
If Temp >= Tempmax And Status_grzalki = 1 Then
Status_grzalki = 0
Reset Grzanie
End If
 
If Temp =< Tempmin And Status_grzalki = 0 Then
Status_grzalki = 1
Set Grzanie
End If
 
Return

Bardzo proszę o pomoc :)

Portret użytkownika mirley

Re: Program

Z tym przekaźnikiem to sprawa jest prosta. Prawie tak jak mówisz, procesor ustawia 0V lub 5V na swoim wyjściu, żeby dać przekaźnik potrzebny jest tranzystor i dioda zabezpieczająca, tranzystor podłaczony do uC poprzez rezystor ograniczający prąd, np 1k. W procedurze Odczytu temperatury nie może być poleceń wait bo wstrzymują one program, jeśli teraz dasz w głównej pętli odwołanie do obsługi przycisku to będziesz musiał dotąd go trzymać aż nie skończy się odczytywać temperatura. Można by spróbować zrobić to za pomocą tych wait ale w taki sposób:

Pomiar_temperatury:
   1wreset
   1wwrite &H55
   1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
   1wwrite &HBE
   I1 = 1wread(2)
 
   I1 = I1 * 10
   I1 = I1 / 16
   Temp = I1 / 10
 
   1wreset
   1wwrite &HCC
   1wwrite &H44
Return

a w pętli głównej dać wait:

Waitms 100
Set Powerled
 
Do
 
if Pind.3 = 0 then  Portd.7 = not Portd.7  'przycisk na pinie d3 przez zwarcie do masy przełącza portd.7
 
wait 1 
Gosub Pomiar_temperatury
Gosub Wyswietl_temp
Gosub Termostat
 
Loop

tak powinno zadziałać ale sprawdź w praktyce.... teraz nie mam wogóle czasu.... jakby co to w weekend napiszę parę linijek trochę inaczej. Narazie kombinuj

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Witam dzięki za odpowiedź.Mam

Witam dzięki za odpowiedź.Mam jeszcze pytanie, co z to histerezą czy mugłbyś jeszcze mi napisać ten kawałek kody tylko to histerezy byłbym bardzo wdzięczny :)Aaa i bym zapomniał gdzie wkleić to histereze i przekaźnik (w którym miejscu w kodzie)

Pozdro :)

Portret użytkownika gosc

[img][/img]Aaa sory, jak

[img][/img]Aaa sory, jak jeszcze napisać żeby dioda czerwona się świeciła jak grzeje grzałka a zielona jak nie grzeje grzałka :)

Portret użytkownika gosc

Mam tylko podpowiedz zeby to

Mam tylko podpowiedz zeby to wyswietlanie na ledach nie robic na if'ach tylko na case'ach

Portret użytkownika mirley

Re: Termostat LED

Przekaźnik od pompki masz juz wklejony przecież:

if Pind.3 = 0 then  Portd.7 = not Portd.7  'przycisk na pinie d3 przez zwarcie do masy przełącza portd.7

co do grzałki żeby działała z histerezą to przecież juz masz napisane, tylko trochę to zmodyfikować trzeba i powinno śmigać:

Termostat:
 
 
If Temp >= Tempmax Then
  Reset Grzanie
  'tutaj wpisz żeby dioda jedna się zapaliła a druga zgasiła dla wyłaczonej grzałki
End If
 
If Temp =< Tempmin Then
  Set Grzanie
  'tutaj wpisz żeby dioda jedna się zapaliła a druga zgasiła dla właczonej grzałki
End If
 
Return

Tak to powinno działać. Jeśli Temp >= Tempmax to wyłaczy grzałkę, jeśli mniejsza od minimalnej to właczy. Jeśli jest między tempmin a tempmax to nic się nie będzie przełączało, zostanie stan który był wcześniej. Twoja histereza to Tempmax - tempmin

Sprawdź czy to wszystko działa, czy pomiar temperatury jest poprawny i czy ten przekaźnik od pompki sterowany przyciskiem działa.... jeśli zadziała będziemy myśleć o dalszych rzeczach w programie

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Witam, jestem autorem tego

Witam, jestem autorem tego tematu.Więc tak nadal chce zrobić termostat do wytrawiarki lecz na podstawie tego http://mirley.firlej.org/termometr_uniwersalny plus dopisany termostat.Dlatego nie będe zakładał nowego tematu żeby nie zaśmiecać forum.Całoś ma śmigąć na Attiny2313, uruchomiłem już sam termometr (złożony na płytce uniwesalnej xD).Teraz dopisuje termostat ale mam problem.Dopisałem już konfiguracje portów pod 2 microswitche i przekaźnik.Mam już również histereze.Nie umiem dopisać 2 rzeczy:
1.Po naciśnięciu dwóch microswitch naraz będzie się wchodziło do menu temperatury załączania grzałki
2.Dodawanie i odejmowanie temperatury załączania grzałki w menu.

Bardzo bym prosił żeby kotoś sprawdził czy to co dopisałem jest dobre napisane i żeby ktoś mi powiedział jak dopisać tego czego nie wiem
Kod programu:

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 12000000
 
Config Portd.4 = Input                                      'S1 + temperatura
Config Portd.3 = Input                                      'S2 - temperatura
Config Portd.6 = Output                                     'Przekaźnik
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
 
Config 1wire = Pind.5
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Mux As Byte
 
Dim Zezw_wysw As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
'****************************
      'Wartosci Poczatkowe
'****************************
Reset Pomiar_odczyt
Reset Ur
Wysw1 = 191
Wysw10 = 191
Wysw100 = 191
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
  Wysw = Tempa
 
  If Ur = 1 Then Gosub Przelicz
  Gosub Wyswietl
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     'ew flaga obslugi przyciskow
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16
 
          If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                     'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 '-------------Obsługa Termostatu/histereza 1C-------------
 H = 1
 Waitms 100
 
H = H / 1
A1 = T1 - H
A2 = T1 + H
 
 
If Temp <= A1 Then
Portd.6 = 0
End If
 
If Temp >= A2 Then
Portd.6 = 1
 
End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
 
   If Wysw100 = 0 Then Wysw100 = 10                         'wygaszenie zera wiodącego
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
 
 Else
   Wysw1 = 175                                              'r
   Wysw10 = 175                                             'r
   Wysw100 = 134                                            'E
 End If
 
Return
 
 
Wyswietl:
 
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  Portd.6 = Not Minus
 
  Select Case Mux
    Case 0:
     Set Portd.0
      Portb = Wysw100
     Reset Portd.2
 
    Case 1:
     Set Portd.2
      Portb = Wysw10
     Reset Portd.1
 
    Case 2:
     Set Portd.1
     Portb = Wysw1
     Reset Portd.0
  End Select
 
Return
 
'****************************
 
'****************************
 
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty
'*******************************************************************************
 
'*******************************************************************************

Portret użytkownika mirley

Re: Termostat

Po pierwsze co to w ogóle ma być i po co to?

Config Portd.4 = Input                                      'S1 + temperatura
Config Portd.3 = Input                                      'S2 - temperatura
Config Portd.6 = Output                                     'Przekaźnik
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111

ma być tak:

Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11100111 : Portd = &B11111111  'piny 3 i 4 jako wejścia, reszta wyjścia

W obsłudze przerwania dodajesz linijke:

.....
Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     set Flaga_100ms   'to dodajesz ustawianie zmiennej bitowej, zadeklaruj na początku programu jako bit 
     Incr Co1s
     If Co1s = 7 Then
.....

a potem w pętli głównej:

If Flaga_100ms = 1 Then
  Reset Flaga_100ms                                        'co 100ms
 
  'ponizszy fragment obsługuje przycisk menu, zmieniając stan zmiennej Poz_menu od którem ma zależeć potem co jest wyświetlone na wysw
  'Sw_licz(3) to tablica bajtów bo bedzie potrzebna jeszcze podobna zmienna do obslugi samego + i -
  If Pind.3 = 0 And Pind.4 = 0 Then                                'menu
    Incr Sw_licz(3)
      If Sw_licz(3) = 10 Then
        Sw_licz(3) = 5
 
        Incr Poz_menu
        If Poz_menu = 3 Then Poz_menu = 0
 
      End If
  Else
    Sw_licz(3) = 8
  End If
 
 
  Gosub Sterowanie   'to będzie skok do procedury obsługi grzałki z uwzględnieniem histerezy
 
End If

Reszte musisz sobie sam napisać, a dokąldniej przepisać z kodu termostatu który napisałem dla 2051 http://mirley.firlej.org/files/TermUnTermostat.BAS zmieniając nazwy portów itp

Ps. pisz jako zalogowany użytkownik i poprawnie wstawiaj znaczniki do tekstu, jak widzisz że źle napisałeś to popraw. Już drugi raz upominam że pisze byle jak teksty

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rgbled

Termostat

Witam ponownie.Pisze z konta tylko musiałem hasło zmienić xD A wię tak wprowadziłem te zmiany które zostały mi poradzone.Czyli obsługe microswitchi i powklejałem te gragmenty kodów xD.Nie wiem co jeszcze tam brakuje to poprawnego działania termostatu.Czego brakuje?

Kod:

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 12000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11100111 : Portd = &B11111111  'piny 3 i 4 jako wejścia, reszta wyjścia
 
Config 1wire = Pind.5
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Mux As Byte
 
Dim Zezw_wysw As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
'****************************
      'Wartosci Poczatkowe
'****************************
Reset Pomiar_odczyt
Reset Ur
Wysw1 = 191
Wysw10 = 191
Wysw100 = 191
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
  Wysw = Tempa
 
  If Ur = 1 Then Gosub Przelicz
  Gosub Wyswietl
End If
If Flaga_100ms = 1 Then
  Reset Flaga_100ms                                        'co 100ms
 
  'ponizszy fragment obsługuje przycisk menu, zmieniając stan zmiennej Poz_menu od którem ma zależeć potem co jest wyświetlone na wysw
  'Sw_licz(3) to tablica bajtów bo bedzie potrzebna jeszcze podobna zmienna do obslugi samego + i -
If Pind.3 = 0 And Pind.4 = 1 Then                           'plus
    Incr Sw_licz(1)
      If Sw_licz(1) = 10 Then
        Sw_licz(1) = 5
 
        Select Case Poz_menu
          Case 0:
    Poz_menu = 1
          Case 1:
           If Tempu < 900 Then Incr Tempu
          Case 2:
           If Histereza < 100 Then Incr Histereza
        End Select
 
        Autopowrot = 0
 
      End If
  Else
    Sw_licz(1) = 8
  End If
 
  If Pind.3 = 1 And Pind.4 = 0 Then                         'minus
    Incr Sw_licz(2)
      If Sw_licz(2) = 10 Then
        Sw_licz(2) = 5
 
        Select Case Poz_menu
          Case 0:
    Poz_menu = 2
          Case 1:
           If Tempu > 100 Then Decr Tempu
          Case 2:
           If Histereza > 0 Then Decr Histereza
        End Select
 
        Autopowrot = 0
 
      End If
  Else
    Sw_licz(2) = 8
  End If
  If Pind.3 = 0 And Pind.4 = 0 Then                                'menu
    Incr Sw_licz(3)
      If Sw_licz(3) = 10 Then
        Sw_licz(3) = 5
 
        Incr Poz_menu
        If Poz_menu = 3 Then Poz_menu = 0
 
      End If
  Else
    Sw_licz(3) = 8
  End If
 
 
  Gosub Sterowanie   'to będzie skok do procedury obsługi grzałki z uwzględnieniem histerezy
 
End If
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Flaga_100ms                                        'to dodajesz ustawianie zmiennej bitowej, zadeklaruj na początku programu jako bit
     Incr Co1s
     If Co1s = 7 Then
 
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16
 
          If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                     'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
  '-------------Obsługa Termostatu/histereza 1C-------------
 H = 1
 Waitms 100
 
H = H / 1
A1 = T1 - H
A2 = T1 + H
 
 
If Temp <= A1 Then
Portd.6 = 0
End If
 
If Temp >= A2 Then
Portd.6 = 1
 
End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
 
   If Wysw100 = 0 Then Wysw100 = 10                         'wygaszenie zera wiodącego
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
 
 Else
   Wysw1 = 175                                              'r
   Wysw10 = 175                                             'r
   Wysw100 = 134                                            'E
 End If
 
Return
 
 
Wyswietl:
 
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  Portd.6 = Not Minus
 
  Select Case Mux
    Case 0:
     Set Portd.0
      Portb = Wysw100
     Reset Portd.2
 
    Case 1:
     Set Portd.2
      Portb = Wysw10
     Reset Portd.1
 
    Case 2:
     Set Portd.1
     Portb = Wysw1
     Reset Portd.0
  End Select
 
Return
 
'****************************
 
'****************************
 
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty
'*******************************************************************************
 
'*******************************************************************************

Co musze jeszcze wpisać, żeby termostat mi działa tak jak założyłem w poprzednim poście?Czy histereza dobrze napisana dal 1C?

Pozdro

-

Pozdro :)

Portret użytkownika mirley

Re: Termostat

Ten fragment jest źle napisany bo zawiera przede wszystkim polecenie waitms a w dodatku wkleiłeś to do obsługi przerwania co spowoduje z duzym prawdopodobieństwem zawieszenie procka:

  '-------------Obsługa Termostatu/histereza 1C-------------
 H = 1
 Waitms 100
 
H = H / 1
A1 = T1 - H
A2 = T1 + H
 
 
If Temp <= A1 Then
Portd.6 = 0
End If
 
If Temp >= A2 Then
Portd.6 = 1
 
End If


Napisałem wyżej i nawet to wkleiłeś do kodu:

Gosub Sterowanie 'to będzie skok do procedury obsługi grzałki z uwzględnieniem histerezy

Na dole po procedurze wyświetlania możesz dodać procedurę obsługi grzałki:

Sterowanie:
 If P3.7 = 0 Then                                             'jezeli jest wlaczony przekaznik
   If Tempa >= Tempu Then P3.7 = 1                            'jezeli tempa dochodzi do ustawionej to wyl przekaznik
 Else                                                         'jezeli wyl przekaznik
   Tempp = Tempu - Histereza                                  'punkt wylaczenia
   If Tempa < Tempp Then P3.7 = 0                             'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
 End If
Return

Musisz sobie oczywiście zmienić pin bo to jest fragment kodu dla 2051

Poza tym wkleiłeś fragmenty kodu a żadnej zmiennej nie zadeklarowałeś więc napewno program się nie skompiluje. Juz pierwszy błąd będzie na Flaga_100ms. porównaj jakie zmienne są w programie dla 2051 i takie same typy zadeklaruj w identyczny sposób

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rgbled

Termostat

Witam.Poprawiłem to sterowanie grzałką i to co było źle z tymi flagami.Tylko teraz mam problm.Po naciśnięciu F7 do zrobienia hex i bin wyskakują errory:

Error : 344 Line : 278 Program will overwrite bootloader [ 328 too long] , in File : C:\Documents and Settings\xxxxx\Pulpit\Nowy folder\Kopia Kopia sss.BAS
Error : 61 Line : 278 Label not found [STEROWANIE ] , in File : C:\Documents and Settings\xxxxx\Pulpit\Nowy folder\Kopia Kopia sss.BAS
Error : 61 Line : 278 Label not found [STEROWANIE ] , in File : C:\Documents and Settings\xxxxx\Pulpit\Nowy folder\Kopia Kopia sss.BAS

Moim zdaniem to zamał ilość pamięci w procku.Można jakoś program "odchudzić",skrucić,zmniejszyć?

KOD:

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 12000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11100111 : Portd = &B11111111              'piny 3 i 4 jako wejścia, reszta wyjścia
 
Config 1wire = Pind.5
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Tempu As Word
Dim Histereza As Byte
Dim Mux As Byte
Dim Poz_menu As Byte
Dim Sw_licz(3) As Byte
Dim Tempp As Word                                           'zmiena pomocnicza
Dim Autopowrot As Byte
 
Dim Zezw_wysw As Bit , Zezw_przyciski As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
Dim Miganie As Bit
'****************************
      'Wartosci Poczatkowe
'****************************
Reset Pomiar_odczyt
Reset Ur
Wysw1 = 191
Wysw10 = 191
Wysw100 = 191
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
 
  Select Case Poz_menu
    Case 0:
      Wysw = Tempa
    Case 1:
      If Miganie = 1 Then Wysw = Tempu Else Wysw = 10000
    Case 2:
       If Miganie = 1 Then Wysw = Histereza Else Wysw = 10000
  End Select
 
  If Ur = 1 Then Gosub Przelicz
  Gosub Wyswietl
End If
 
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
 
  'ponizszy fragment obsługuje przycisk menu, zmieniając stan zmiennej Poz_menu od którem ma zależeć potem co jest wyświetlone na wysw
  'Sw_licz(3) to tablica bajtów bo bedzie potrzebna jeszcze podobna zmienna do obslugi samego + i -
If Pind.3 = 0 And Pind.4 = 1 Then                           'plus
    Incr Sw_licz(1)
      If Sw_licz(1) = 10 Then
        Sw_licz(1) = 5
 
        Select Case Poz_menu
          Case 0:
    Poz_menu = 1
          Case 1:
           If Tempu < 900 Then Incr Tempu
          Case 2:
           If Histereza < 100 Then Incr Histereza
        End Select
 
        Autopowrot = 0
 
      End If
  Else
    Sw_licz(1) = 8
  End If
 
  If Pind.3 = 1 And Pind.4 = 0 Then                         'minus
    Incr Sw_licz(2)
      If Sw_licz(2) = 10 Then
        Sw_licz(2) = 5
 
        Select Case Poz_menu
          Case 0:
    Poz_menu = 2
          Case 1:
           If Tempu > 100 Then Decr Tempu
          Case 2:
           If Histereza > 0 Then Decr Histereza
        End Select
 
        Autopowrot = 0
 
      End If
  Else
    Sw_licz(2) = 8
  End If
  If Pind.3 = 0 And Pind.4 = 0 Then                         'menu
    Incr Sw_licz(3)
      If Sw_licz(3) = 10 Then
        Sw_licz(3) = 5
 
        Incr Poz_menu
        If Poz_menu = 3 Then Poz_menu = 0
 
      End If
  Else
    Sw_licz(3) = 8
  End If
 
 
  Gosub Sterowanie
  If Pind.7 = 0 Then                                        'jezeli jest wlaczony przekaznik
   If Tempa >= Tempu Then Pind.7 = 1                        'jezeli tempa dochodzi do ustawionej to wyl przekaznik
 Else                                                       'jezeli wyl przekaznik
   Tempp = Tempu - Histereza                                'punkt wylaczenia
   If Tempa < Tempp Then Pind.7 = 0                         'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
 End If
Return                                                      'to będzie skok do procedury obsługi grzałki z uwzględnieniem histerezy
 
End If
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyciski                                     'zezwolenie obslugi przyciskow
     Miganie = Not Miganie                                  'umozliwia miganie cyfr podczas wyswietlania menu
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16
 
          If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                     'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
 
   If Wysw100 = 0 Then Wysw100 = 10                         'wygaszenie zera wiodącego
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
 
 Else
   Wysw1 = 175                                              'r
   Wysw10 = 175                                             'r
   Wysw100 = 134                                            'E
 End If
 
Return
 
 
Wyswietl:
 
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  Portd.6 = Not Minus
 
  Select Case Mux
    Case 0:
     Set Portd.0
      Portb = Wysw100
     Reset Portd.2
 
    Case 1:
     Set Portd.2
      Portb = Wysw10
     Reset Portd.1
 
    Case 2:
     Set Portd.1
     Portb = Wysw1
     Reset Portd.0
  End Select
 
Return
 
'****************************
 
'****************************
 
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty
'*******************************************************************************
 
'*******************************************************************************

Czy oprócz tamtych errorów(te,które napisałem na początku tego postu) są jeszcze jakieś błędy w programie przez, które program nie zadziała według moich założeń, czyli po wciścięciu dwóch microswitch na raz będze menu z ustawieniem temperarury włączenia grzałki.Pierwszym microswitchem dodajemy temperature, a drugim odejmujemy.Histereza 1C.A jak potem wyjść z menu utawianej temperatury?W taki sposób jak się będzie wchodziło?
Bardzo bradzo proszę o pomoc :)
Pozdro :)

-

Pozdro :)

Portret użytkownika mirley

Re: Program

Po pierwsze.. to po co napisałeś skok do procedury Gosub Sterowanie jak i tak obsługę grzałki wkleiłeś na chama zaraz pod ta linijką. Usuń to gosub Sterowanie bo nie ma etykiety o takiej nazwie do której mógłby się program odwołać.

Po skasowaniu tej linijki program i tak ma 115% procesora więc poważne odchudzanie trzeba zastosować. Procedury przycisków trzeba zmienić z takiej jaką kiedyś używałem na taką jak używam obecnie, a dodatkowo w opcjach kompilatora trzeba zaznaczyć optymalizację kodu. Po tych zabiegach powinien działać kod:

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 12000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11100111 : Portd = &B11111111              'piny 3 i 4 jako wejścia, reszta wyjścia
 
Config 1wire = Pind.5
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Tempu As Word
Dim Histereza As Byte
Dim Mux As Byte
Dim Poz_menu As Byte
Dim Tempp As Word                                           'zmiena pomocnicza
'Dim Autopowrot As Byte
 
Dim Zezw_wysw As Bit , Zezw_przyciski As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
'Dim Ur As Bit
Dim Miganie As Bit
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
'****************************
      'Wartosci Poczatkowe
'****************************
'Reset Pomiar_odczyt
'Reset Ur
'Wysw1 = 191
'Wysw10 = 191
'Wysw100 = 191
Sw = 255
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
 
  Select Case Poz_menu
    Case 0:
      Wysw = Tempa
    Case 1:
      If Miganie = 1 Then Wysw = Tempu Else Wysw = 10000
    Case 2:
       If Miganie = 1 Then Wysw = Histereza Else Wysw = 10000
  End Select
 
  'If Ur = 1 Then Gosub Przelicz
  Gosub Przelicz
  Gosub Wyswietl
End If
 
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
 
  Sw.0 = Pind.3
  Sw.1 = Pind.4
  If Sw <> &B11111111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
        Case &B11111110:                                    'D3
         Select Case Poz_menu
          Case 0:
           'Poz_menu = 1
          Case 1:
           If Tempu < 900 Then Incr Tempu
          Case 2:
           If Histereza < 100 Then Incr Histereza
         End Select
 
        Case &B11111101:                                    'D4
         Select Case Poz_menu
          Case 0:
           'Poz_menu = 2
          Case 1:
           If Tempu > 100 Then Decr Tempu
          Case 2:
           If Histereza > 0 Then Decr Histereza
        End Select
 
        Case &B11111100:                                    'D3 + D4
         Incr Poz_menu
         If Poz_menu = 3 Then Poz_menu = 0
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 98
  End If
 
  If Pind.7 = 0 Then                                        'jezeli jest wlaczony przekaznik
   If Tempa >= Tempu Then Pind.7 = 1                        'jezeli tempa dochodzi do ustawionej to wyl przekaznik
  Else                                                      'jezeli wyl przekaznik
   Tempp = Tempu - Histereza                                'punkt wylaczenia
   If Tempa < Tempp Then Pind.7 = 0                         'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
  End If
 
 
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyciski                                     'zezwolenie obslugi przyciskow
     Miganie = Not Miganie                                  'umozliwia miganie cyfr podczas wyswietlania menu
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16
 
          'If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                     'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
 
   If Wysw100 = 0 Then Wysw100 = 10                         'wygaszenie zera wiodącego
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
 
 Else
   Wysw1 = 175                                              'r
   Wysw10 = 175                                             'r
   Wysw100 = 134                                            'E
 End If
 
Return
 
 
Wyswietl:
 
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  Portd.6 = Not Minus
 
  Select Case Mux
    Case 0:
     Set Portd.0
      Portb = Wysw100
     Reset Portd.2
 
    Case 1:
     Set Portd.2
      Portb = Wysw10
     Reset Portd.1
 
    Case 2:
     Set Portd.1
     Portb = Wysw1
     Reset Portd.0
  End Select
 
Return
 
'****************************
 
'****************************
 
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty
'*******************************************************************************
 
'*******************************************************************************

Jakby nie działał kod to trzeba wrócić do wcześniejszej wersji i skasować obsługę przycisków + i - i zostawić same menu. Jak będzie zmieniał wskazania to będzie się kombinować z tym kodem co teraz podałem

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rgbled

Termostat

Witam, dzięki za zainteresowanie:).Tylko gdzie się zaznacza tą optymalizację kodu?
Wpadłem też na pomysł skasowana fragmentu który wyświetla Err jak DS18B20 nie jest podłączony wtedy się powinien zmniejszyć ten kod.Więc skasowałem ten fragment,ale wywala mi erory przy robieniu na hexi bin.
Error : 28 Line : 211 IF THEN expected , in File : D:\Nowy folder\prubs.bas
Error : 7 Line : 211 IF THEN expected [END IF in source 211] , in File : D:\Nowy folder\prubs.bas

Kod:

                            '****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 12000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11100111 : Portd = &B11111111              'piny 3 i 4 jako wejścia, reszta wyjścia
 
Config 1wire = Pind.5
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Tempu As Word
Dim Histereza As Byte
Dim Mux As Byte
Dim Poz_menu As Byte
Dim Tempp As Word                                           'zmiena pomocnicza
'Dim Autopowrot As Byte
 
Dim Zezw_wysw As Bit , Zezw_przyciski As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
'Dim Ur As Bit
Dim Miganie As Bit
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
'****************************
      'Wartosci Poczatkowe
'****************************
'Reset Pomiar_odczyt
'Reset Ur
'Wysw1 = 191
'Wysw10 = 191
'Wysw100 = 191
Sw = 255
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
 
  Select Case Poz_menu
    Case 0:
      Wysw = Tempa
    Case 1:
      If Miganie = 1 Then Wysw = Tempu Else Wysw = 10000
    Case 2:
       If Miganie = 1 Then Wysw = Histereza Else Wysw = 10000
  End Select
 
  'If Ur = 1 Then Gosub Przelicz
  Gosub Przelicz
  Gosub Wyswietl
End If
 
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
 
  Sw.0 = Pind.3
  Sw.1 = Pind.4
  If Sw <> &B11111111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
        Case &B11111110:                                    'D3
         Select Case Poz_menu
          Case 0:
           'Poz_menu = 1
          Case 1:
           If Tempu < 900 Then Incr Tempu
          Case 2:
           If Histereza < 100 Then Incr Histereza
         End Select
 
        Case &B11111101:                                    'D4
         Select Case Poz_menu
          Case 0:
           'Poz_menu = 2
          Case 1:
           If Tempu > 100 Then Decr Tempu
          Case 2:
           If Histereza > 0 Then Decr Histereza
        End Select
 
        Case &B11111100:                                    'D3 + D4
         Incr Poz_menu
         If Poz_menu = 3 Then Poz_menu = 0
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 98
  End If
 
  If Pind.7 = 0 Then                                        'jezeli jest wlaczony przekaznik
   If Tempa >= Tempu Then Pind.7 = 1                        'jezeli tempa dochodzi do ustawionej to wyl przekaznik
  Else                                                      'jezeli wyl przekaznik
   Tempp = Tempu - Histereza                                'punkt wylaczenia
   If Tempa < Tempp Then Pind.7 = 0                         'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
  End If
 
 
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyciski                                     'zezwolenie obslugi przyciskow
     Miganie = Not Miganie                                  'umozliwia miganie cyfr podczas wyswietlania menu
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16
 
          'If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                     'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
 
 
 
'****************************
 
'****************************
 
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty
'*******************************************************************************

Więc gdzie jest błąd?
Bardzo proszę o pomoc :)

-

Pozdro :)

Portret użytkownika mirley

Re; Program

Po pierwsze nie jest to konieczne bo program się mieści a po drugie jeśli już tak zrobiłeś to skasuj wszystko co dotyczy tego ifa. komunikat mówi Ci że brakuje If then bo znalazł end if który nie ma pary:

       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
 
        If Err = 0 Then               '<<wywaliłeś to
 
          'tu jest zawartośc obsługująca pomiar
 
        Else                          '<< zostało to
          Tempa = 10000               '<< i to                    
        End If                        '<< i to
 
       End If

jak jest otwarty if to musisz go zakończyć, nie możesz sobie pisać bele jak poleceń w kodzie

Optymalizacja: Options->compiler->output: optimize code zaznaczyć

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rgbled

Witam, zaznaczyłem tą opcję i

Witam, zaznaczyłem tą opcję i biorę do zrobienie hex i bin i wywala mi error:
Error : 344 Line : 261 Program will overwrite bootloader [ 2 too long] , in File : C:\Documents and Settings\Piotrek\Pulpit\Nowy folder (2)\noname2.bas
Co zrobić?

Kod:

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 12000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11100111 : Portd = &B11111111              'piny 3 i 4 jako wejścia, reszta wyjścia
 
Config 1wire = Pind.5
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Tempu As Word
Dim Histereza As Byte
Dim Mux As Byte
Dim Poz_menu As Byte
Dim Tempp As Word                                           'zmiena pomocnicza
'Dim Autopowrot As Byte
 
Dim Zezw_wysw As Bit , Zezw_przyciski As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
'Dim Ur As Bit
Dim Miganie As Bit
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
'****************************
      'Wartosci Poczatkowe
'****************************
'Reset Pomiar_odczyt
'Reset Ur
'Wysw1 = 191
'Wysw10 = 191
'Wysw100 = 191
Sw = 255
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
 
  Select Case Poz_menu
    Case 0:
      Wysw = Tempa
    Case 1:
      If Miganie = 1 Then Wysw = Tempu Else Wysw = 10000
    Case 2:
       If Miganie = 1 Then Wysw = Histereza Else Wysw = 10000
  End Select
 
  'If Ur = 1 Then Gosub Przelicz
  Gosub Przelicz
  Gosub Wyswietl
End If
 
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
 
  Sw.0 = Pind.3
  Sw.1 = Pind.4
  If Sw <> &B11111111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
        Case &B11111110:                                    'D3
         Select Case Poz_menu
          Case 0:
           'Poz_menu = 1
          Case 1:
           If Tempu < 900 Then Incr Tempu
          Case 2:
           If Histereza < 100 Then Incr Histereza
         End Select
 
        Case &B11111101:                                    'D4
         Select Case Poz_menu
          Case 0:
           'Poz_menu = 2
          Case 1:
           If Tempu > 100 Then Decr Tempu
          Case 2:
           If Histereza > 0 Then Decr Histereza
        End Select
 
        Case &B11111100:                                    'D3 + D4
         Incr Poz_menu
         If Poz_menu = 3 Then Poz_menu = 0
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 98
  End If
 
  If Pind.7 = 0 Then                                        'jezeli jest wlaczony przekaznik
   If Tempa >= Tempu Then Pind.7 = 1                        'jezeli tempa dochodzi do ustawionej to wyl przekaznik
  Else                                                      'jezeli wyl przekaznik
   Tempp = Tempu - Histereza                                'punkt wylaczenia
   If Tempa < Tempp Then Pind.7 = 0                         'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
  End If
 
 
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyciski                                     'zezwolenie obslugi przyciskow
     Miganie = Not Miganie                                  'umozliwia miganie cyfr podczas wyswietlania menu
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16
 
          'If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                     'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
 
   If Wysw100 = 0 Then Wysw100 = 10                         'wygaszenie zera wiodącego
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
 
 Else
   Wysw1 = 175                                              'r
   Wysw10 = 175                                             'r
   Wysw100 = 134                                            'E
 End If
 
Return
 
 
Wyswietl:
 
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  Portd.6 = Not Minus
 
  Select Case Mux
    Case 0:
     Set Portd.0
      Portb = Wysw100
     Reset Portd.2
 
    Case 1:
     Set Portd.2
      Portb = Wysw10
     Reset Portd.1
 
    Case 2:
     Set Portd.1
     Portb = Wysw1
     Reset Portd.0
  End Select
 
Return
 
'****************************
 
'****************************
 
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty
'*******************************************************************************
 
'*******************************************************************************

Proszę o pomoc:)
Pozdro:)

-

Pozdro :)

Portret użytkownika mirley

Re: Program

Zakomentuj np te 3 linijki:

.....
Else
   'Wysw1 = 175                                              'r
   'Wysw10 = 175                                             'r
   'Wysw100 = 134                                            'E
 End If
.....

powinno wystarczyć, kod który Ci wkleiłem po zaznaczeniu optymalizaji u mnie przeszedł kompilację więc dziwne że dalej się pluje

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rgbled

Termostat

Witam.Znowu sie "pluje" i znowu ten sam error.Czy mógłbyś mi dać bezpośrednio link(żeby było już do pobrania) do tego bascoma którego używasz?

Pozdro :)

-

Pozdro :)

Portret użytkownika mirley

Re: termostat

link do bascoma http://www.mcselec.com/index.php?option=com_docman&task=doc_download&gid=139&Itemid=54

Kod wklej do pustego pliku ten który wrzuciłem wcześniej i co pisałem że się kompiluje, nic z niego nie kasuj jak nie jesteś pewien co kasujesz

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rgbled

Termostat

Witam.Zainstalowałem bascoma z tego linku i ciągle ten sam error.Czy mógby mi Pan wysłać hex i bin na ?Bardzo bym prosił:)

Pozdro:)

-

Pozdro :)

Portret użytkownika mirley

Re: Termostat

Teraz się na 100% przekompiluje bo u mnie zajmuje teraz 98% procka:

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 12000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11100111 : Portd = &B11111111              'piny 3 i 4 jako wejścia, reszta wyjścia
 
Config 1wire = Pind.5
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Tempu As Word
Dim Histereza As Byte
Dim Mux As Byte
Dim Poz_menu As Byte
Dim Tempp As Word                                           'zmiena pomocnicza
'Dim Autopowrot As Byte
 
Dim Zezw_wysw As Bit , Zezw_przyciski As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
'Dim Ur As Bit
Dim Miganie As Bit
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
'****************************
      'Wartosci Poczatkowe
'****************************
'Reset Pomiar_odczyt
'Reset Ur
'Wysw1 = 191
'Wysw10 = 191
'Wysw100 = 191
Sw = 255
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
 
  Select Case Poz_menu
    Case 0:
      Wysw = Tempa
    Case 1:
      If Miganie = 1 Then Wysw = Tempu Else Wysw = 10000
    Case 2:
       If Miganie = 1 Then Wysw = Histereza Else Wysw = 10000
  End Select
 
  'If Ur = 1 Then Gosub Przelicz
  Gosub Przelicz
  Gosub Wyswietl
End If
 
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
 
  Sw.0 = Pind.3
  Sw.1 = Pind.4
  If Sw <> &B11111111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
        Case &B11111110:                                    'D3
         Select Case Poz_menu
          Case 0:
           'Poz_menu = 1
          Case 1:
           If Tempu < 900 Then Incr Tempu
          Case 2:
           If Histereza < 100 Then Incr Histereza
         End Select
 
        Case &B11111101:                                    'D4
         Select Case Poz_menu
          Case 0:
           'Poz_menu = 2
          Case 1:
           If Tempu > 100 Then Decr Tempu
          Case 2:
           If Histereza > 0 Then Decr Histereza
        End Select
 
        Case &B11111100:                                    'D3 + D4
         Incr Poz_menu
         If Poz_menu = 3 Then Poz_menu = 0
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 98
  End If
 
  If Pind.7 = 0 Then                                        'jezeli jest wlaczony przekaznik
   If Tempa >= Tempu Then Pind.7 = 1                        'jezeli tempa dochodzi do ustawionej to wyl przekaznik
  Else                                                      'jezeli wyl przekaznik
   Tempp = Tempu - Histereza                                'punkt wylaczenia
   If Tempa < Tempp Then Pind.7 = 0                         'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
  End If
 
 
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyciski                                     'zezwolenie obslugi przyciskow
     Miganie = Not Miganie                                  'umozliwia miganie cyfr podczas wyswietlania menu
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
 
   If Wysw100 = 0 Then Wysw100 = 10                         'wygaszenie zera wiodącego
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
 End If
 
Return
 
 
Wyswietl:
 
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  Portd.6 = Not Minus
 
  Select Case Mux
    Case 0:
     Set Portd.0
      Portb = Wysw100
     Reset Portd.2
 
    Case 1:
     Set Portd.2
      Portb = Wysw10
     Reset Portd.1
 
    Case 2:
     Set Portd.1
     Portb = Wysw1
     Reset Portd.0
  End Select
 
Return
 
'****************************
 
'****************************
 
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty
'*******************************************************************************
 
'*******************************************************************************

Wywaliłem linijki odpowiedzialne za wyświetlanie Err itp

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika matrix

Re: kompilacja

mirley wrote:
Teraz się na 100% przekompiluje bo u mnie zajmuje teraz 98% procka:

a u mnie zajmuje 101% i wywala nadpisanie bootloadera. to tak z ciekawości bo nie jestem w temacie.

Portret użytkownika mirley

Re; Kompilacja

Włącz optymalizację kodu w menu kompilatora, wtedy się zmieści... co prawda pierwszy raz takiego czegoś używam więc czy program będzie działał dobrze to trudno powiedzieć

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika matrix

Re; Kompilacja

mirley wrote:
Włącz optymalizację kodu w menu kompilatora, wtedy się zmieści... co prawda pierwszy raz takiego czegoś używam więc czy program będzie działał dobrze to trudno powiedzieć

ja wolę nie kombinować, żeby problemów nie mieć. jeśli normalnie się nie mieści to nie kombinuję.

Portret użytkownika mirley

Re: Optymalizacja

Po to taka opcję zrobili żeby jej używać.... prawdopodobnie kompilator zamienia polecenia asemblerowe wchodzące w skład tych co wpisujesz w bascomie na bardziej optymalne w danym miejscu w kodzie

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rgbled

Termostat

Witam.Odpaliłem termostat z tego kodu:

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 12000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11100111 : Portd = &B11111111              'piny 3 i 4 jako wejścia, reszta wyjścia
 
Config 1wire = Pind.5
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Tempu As Word
Dim Histereza As Byte
Dim Mux As Byte
Dim Poz_menu As Byte
Dim Tempp As Word                                           'zmiena pomocnicza
'Dim Autopowrot As Byte
 
Dim Zezw_wysw As Bit , Zezw_przyciski As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
'Dim Ur As Bit
Dim Miganie As Bit
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
'****************************
      'Wartosci Poczatkowe
'****************************
'Reset Pomiar_odczyt
'Reset Ur
'Wysw1 = 191
'Wysw10 = 191
'Wysw100 = 191
Sw = 255
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
 
  Select Case Poz_menu
    Case 0:
      Wysw = Tempa
    Case 1:
      If Miganie = 1 Then Wysw = Tempu Else Wysw = 10000
    Case 2:
       If Miganie = 1 Then Wysw = Histereza Else Wysw = 10000
  End Select
 
  'If Ur = 1 Then Gosub Przelicz
  Gosub Przelicz
  Gosub Wyswietl
End If
 
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
 
  Sw.0 = Pind.3
  Sw.1 = Pind.4
  If Sw <> &B11111111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
        Case &B11111110:                                    'D3
         Select Case Poz_menu
          Case 0:
           'Poz_menu = 1
          Case 1:
           If Tempu < 900 Then Incr Tempu
          Case 2:
           If Histereza < 100 Then Incr Histereza
         End Select
 
        Case &B11111101:                                    'D4
         Select Case Poz_menu
          Case 0:
           'Poz_menu = 2
          Case 1:
           If Tempu > 100 Then Decr Tempu
          Case 2:
           If Histereza > 0 Then Decr Histereza
        End Select
 
        Case &B11111100:                                    'D3 + D4
         Incr Poz_menu
         If Poz_menu = 3 Then Poz_menu = 0
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 98
  End If
 
  If Pind.7 = 0 Then                                       'jezeli jest wlaczony przekaznik
   If Tempa >= Tempu Then Pind.7 = 1                       'jezeli tempa dochodzi do ustawionej to wyl przekaznik
  Else                                                      'jezeli wyl przekaznik
   Tempp = Tempu - Histereza                                'punkt wylaczenia
   If Tempa < Tempp Then Pind.7 = 0                        'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
  End If
 
 
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyciski                                     'zezwolenie obslugi przyciskow
     Miganie = Not Miganie                                  'umozliwia miganie cyfr podczas wyswietlania menu
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16
 
          'If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                     'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
 
   If Wysw100 = 0 Then Wysw100 = 10                         'wygaszenie zera wiodącego
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
 
 Else
   'Wysw1 = 175                                              'r
   'Wysw10 = 175                                             'r
   'Wysw100 = 134                                            'E
 End If
 
Return
 
 
Wyswietl:
 
  Incr Mux
  If Mux = 3 Then Mux = 0
 
  Portd.6 = Not Minus
 
  Select Case Mux
    Case 0:
     Set Portd.0
      Portb = Wysw100
     Reset Portd.2
 
    Case 1:
     Set Portd.2
      Portb = Wysw10
     Reset Portd.1
 
    Case 2:
     Set Portd.1
     Portb = Wysw1
     Reset Portd.0
  End Select
 
Return
 
'****************************
 
'****************************
 
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty
'*******************************************************************************
 
'****************************************

Ale w programie jest chyba bląd.Otóz port przekaźnika to PIND.7 ale w attiny2313 nie ma takiego, jest PIND6.Moim zdaniem musze wpisać PIND6.Druga sprawa to menu.Mam jak by dwa menu.Przyciskam dwa microswitch naraz i mam pierwsze menu, a jak przyciskam drugi raz mam jeszcze jedno.Czyżby jedno było do histerezy, a dygie to temperatura załanczania grzalki?Gdyby było to moźliwe to bym prosiłbym, żeby temperatura załanczania grzałki byla ustawiana w inny sposób.Ustawialbo by sie liczby na segmentach to znaczy.1 segment i przycisk plus zaczyna zwikszać o 1, czyli np mamy 0,1,2,3,4,5,6,7,8,9 i nasptępny segment i znoiwy zwiększmay.Bo teraz jak mam te dziesiątki to zanim ustawie tem. 40 C to miną wieki.

Pozdro :)

-

Pozdro :)

Portret użytkownika mirley

Re; Termostat

jasne że ma być pind.6.... nie patrzyłem w ogóle na piny tylko czy program się kompiluje. W programie ustawia sie temperaturę i histerezę. ustawianie osobno dziesiątek i jednostek temperatury nie wchodzi w grę bo nie ma miejsca w programie. Poza tym poklikać musisz tylko raz a potem urządzenie działa. Ewentualnie modyfikujesz temperaturę.... trudno sobie wyobrazić że co dzień zmieniasz ustawienie raz na 30 stopni a drugi raz na 80

Sprawdź czy układ działa tak jak powinien a nie przejmuj się tym że musisz klikać dużo aby ustawić temperaturę.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rgbled

Termostat

Witam.Termostat mi bedzie służył do wytrawiarki.Jak ustawie ustawieniu temperatury załoączenia grzalki,a potem odłacze po końcu pracy termosatu.To potem pry ponownym właczeniu termostatu będze musaił klikać ze 100 razy żeby mieć 40C.Jeżeli nie ma tle miejsca na muj wcześniejszy pomysl to morze by sie dało zrobić tak:jak wchodze dop menu załacznaia grzałki to tm będzie wpisame na stałe 40C, a ewentualne zminay wprowadzało by się tylko w jednościach.

Bardzo proszę o pomoc:)

-

Pozdro :)

Portret użytkownika mirley

Re: Termostat

Na początku programu możesz ustawić sobie wartości początkowe w zmiennych Tempu i histereza. Poprostu pisząc np

Tempu = 400

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rgbled

Termostat

Witam:) I jak to wpisze, a potem wejde do menu temperarury załaczania grzałki to będe miał na stałe 40 C? A jak zrobić tak z histerezą?

Bardzo proszę o pomoc:)
Pozdro:)

-

Pozdro :)

Portret użytkownika rafliczek22

Wpisać histereza = xxx

Wpisać histereza = xxx

Portret użytkownika mirley

Re: Termostat

Musisz to wpisać w tym miejscu, na początku programu:

'****************************
      'Wartosci Poczatkowe
'****************************
Tempu = 400     'na starcie wpisujesz 40 stopni
Histereza = 20  'histereza = 2stopnie
'Reset Pomiar_odczyt
'Reset Ur
'Wysw1 = 191
'Wysw10 = 191
'Wysw100 = 191
Sw = 255
'****************************
      'Petla glowna
'****************************

Przy każdym uruchomieniu będzie w menu początkowo tak jak napisałeś w warunkach początkowych. Potem będziesz sobie mógł normalnie ustawiać czy chcesz 41 czy 42 stopnie itp i przestawiać histereze. najlepiej ustawić najbardziej prawdopodobne wartości

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rgbled

Termostat ale inny:)

Witam.Teraz postanowiłem, że zrobie prosty termostacik.Moje założenia są takie:
2 LED (czerwona i zielona), czerwona się świeci jak grzałka grzeje a zielona jak nie grzeje.Temperarura załaczania grzalki jest ustawiana w programie (w kodzie w bascomnie) o raz histereza 2C.I z kawałkow róznych kodów ukleiłem coś takiego:

$regfile = "attiny2313.dat"
$crystal = 1000000                                          ' (wew oscylator 1MHz w zupełności wystarcza)
Config 1wire = Portd.5
Config Portd.0 = Output                                     'Led Czerwona -grzeje
Config Portd.1 = Output                                     'led Zielona -nie Grzeje
Config 1wire = Portd.5
 
 
Dim Tempmax As Byte
Dim Tempmin As Byte
Tempmax = 40
Tempmin = 38
 
 
Do
 
 
Gosub Pomiar_temperatury
Gosub Wyswietl_temp
Gosub Termostat
 
Loop
 
 
'-------------Obsługa Pomiar temperatury-------------
Pomiar_temperatury:
1wreset
1wwrite &HCC
1wwrite &H44
Wait 2
 
1wreset
1wwrite &H55
1wverify Dsid1(1) 'wysyłamy adres pierwszego czujnika
1wwrite &HBE
I1 = 1wread(2)
Wait 1
 
I1 = I1 * 10
I1 = I1 / 16
Temp = I1 / 10
Return
Termostat:
If Temp >= Tempmax And Status_grzalki = 1 Then
Status_grzalki = 0
Reset Grzanie
End If
 
If Temp =< Tempmin And Status_grzalki = 0 Then
Status_grzalki = 1
Set Grzanie
End If
                                     '

I mam takie erory:
Error : 238 Line : 34 Variable is not dimensioned as an array [DSID1(1)] , in File : C:\Program Files\MCS Electronics\BASCOM-AVR\noname2.bas
Error : 263 Line : 34 Array index out of range [1] , in File : C:\Program Files\MCS Electronics\BASCOM-AVR\noname2.bas
Error : 104 Line : 34 LoadReg error [DSID1(1)] , in File : C:\Program Files\MCS Electronics\BASCOM-AVR\noname2.bas

I nie wiem jak jeszcze dopisać z tymi LED zeby sie świeciyły jak wyżej opisalem.

Bardzo proszę o pomoc:)
Pozdro:)

-

Pozdro :)

Portret użytkownika gosc

Mam 6 podpowiedzi: 1. Po co

Mam 6 podpowiedzi:

1. Po co dawać oscylator 1Mhz jak można dać 8Mhz, tylko zmiana fusów.
2. Po co skakać do tych etykiet co 1uS, nie miej potem pretensji jak załączy grzałkę i coś za mocno podgrzeje a procek sobie stanie:D:D
3. Wypadało by zadeklarować tablicę ds1(8), i potem dać 1wsearchfirst.
4. Po co czytasz odrazu 2 Bajty z ds-a czytaj po kolei tak jak ma to mirek w wszystkich programach
5. OGÓLNIE TO TEN KOD DAJ DO WINDOWSOWEGO KOSZA I OGARNIJ NA POCZĄTEK OBSŁ. 1WIRE W PĘTLI DO-LOOP, POTEM GOSUB-Y DAJ JAK POUSTAWIASZ TIMERY, ŻEBY PROGRAM DZIAŁAŁ WG. JAKIEŚ "ZASADY"
A NIE JAK MU TAKT PRZYPADNIE ALBO BASCOM ŹLE POLICZY WAIT-A, NO I OCZYWIŚCIE JEŚLI NIE ZALEŻY CI NA POBIERANYM PRĄDZIE USTAWIAJ TAKTOWANIE JAK NAJWYŻEJ CZYLI 8000000Hz, TA ZMIANA CYFERKI DUŻO NIE KOSZTUJE (NIC) A PRZY TAKICH PROGRAMACH DAJE DUŻO
6. PRZY TAKICH PROGRAMACH ZASTOSUJ CO NAJMNIEJ WATCHDOG-A

Portret użytkownika mirley

Re: Termostat

Zaczynasz już 3 osobny problem w tym samym temacie... załóż nowy temat dla prostego termostatu na ledach i tam wklej ten kod... Jak ma ktoś potem coś znaleźć w takim bajzlu... Jak będzie nowy temat to zadumamy się nad problemem termostatu z dwoma diodami. Poza tym jak masz gotowy kod napisany wyżej to wystarczy tylko wywalić wyświetlanie i przyciski a całą obsługę z pomiarem temperatury na przerwaniach masz zrobioną

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.