Prosty termostat z dwoma diodami ledami


Witam.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:
  If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
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 bym prosił żeby mi pwowiedzieć(wytłumaczyć) co trzeba poprawić:)
Bardzo proszę o pomoc:)
Pozdro:)




Portret użytkownika mirley

Re: Błędy

Wydaje mi się że błędy które wkleiłeś mają się nijak do kodu który pokazujesz. Tak jak napisałem wcześniej wystarczy wziąść kod z wyświetlaczem i trochę z nieg usunąć. To co napisałeś nie będzie działało... zgubiłeś gdzieś obsługę przerwań i timera... nie ma żadnego opóźnienia które potrzebne jest do poprawnej pracy Ds18b20. Może tak:

'****************************
           '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 Tempa As Word
Dim Tempu As Word
Dim Histereza As Byte
Dim Tempp As Word                                           'zmiena pomocnicza
 
 
Dim Zezw_przyciski As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Miganie As Bit
'****************************
      'Wartosci Poczatkowe
'****************************
Histereza = 20
Tempu = 400
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
 
 
  If Pind.7 = 0 Then                                       'jezeli jest wlaczony przekaznik
   If Tempa >= Tempu Then Portd.7 = 1                       'jezeli tempa dochodzi do ustawionej to wyl przekaznik
  Else                                                      'jezeli wyl przekaznik
   Tempp = Tempu - Histereza                                'punkt wylaczenia
   If Tempa < Tempp Then Portd.7 = 0                        'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
  End If
 
  portd.0 = pind.7
  portd.1 = not pind.7
 
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyciski                                    
     Miganie = Not Miganie                             
     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
 
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return

Przeanalizuj to i sprawdź czy działa. Nie kompilowałem więc mogą być błędy

-

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.Nie ma błędowxDMam

Witam.Nie ma błędowxDMam jeszcze proźbe czy mógł by mi pan sprawdzić PCB do tego.PCB jest badzo prosta więc góra zajmie to Panu 5 min.Wiem że eagle ma cos takiego jak rysowanie ze schematu, ale mi robi cienkie ścieżki i wogółe jakś ta PCB ogromna jak na taką iloś elementów.Prosił bym o sprawdzenie czy dobrze LEDY, ds i przekaźnik podłączyłem.Zrobilem również odrazy podłaczenie do programatora:)Tranzystor to BC548.


Pozdro:)

PS.Czy, żeny attiny2313 śmiglą na wewnętrnym ostylatorze to wystarczy że zmienie $crystal?

-

Pozdro :)

Portret użytkownika rafliczek22

1. Schemat trochę ciasny ale

1. Schemat trochę ciasny ale OK.
2. Co to za układzik ok. 8-10 nogi attiny?
3. Cewka trochę blisko attiny, nie wiem czy nie będzie resetował, ja kiedyś myśłałem przekaźnik lepszy- owszem był lepszy bo zawsze rozłączy ale kiedy parę razy kupiłem triaka to nie było ani razu, mi zresetowało 2 razy, jeszcze zależy czym kolega chce sterować jeśli silnym obciążeniem indukcyjnym to przekaźnik lepiej bo mi bez układu RC nie rozłaczył ani razu, silnik był 10kW, przy małych silnikach bez problemu rozłączał, a może miałem feralne modele, dla testu podłączyłem potem piec elektryczny z wszystkimi płytami i piekarnikiem-grubo ponad 12kW, czyli triak nie nadaje się do obć. indukcyjnych ze względu na przesunięcie napięcia względem prądu.

Portret użytkownika gosc

Termostat

8-10 nożki ukłądó to nie scalak tylko goldpin na ds i oprnik.Czy tranzystor i przekażnik od ayyiny2313 są dobrze połączone?1 nożka cewki w przekażniku powina isć do na baze tranzystora druga na VCC?I czy moge zmienić tan kwarc 12 mhz na wewnetrzny oscylator?Czy wtedy trzeba jakiś wikesze zmiany wprowadzać w kodzie oprócz linijki $crystal?

Portret użytkownika mirley

Re: Crystal

W tym przypadku wystarczy zmienić fusebity i wpisać w crystal odpowiednia wartość częstotliwości. Pomiar się trochę wydłuży bo timer będzie liczył ni 1 sekundę tylko o 1/3 dłuższy czas

-

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.W tym kodzie:

'****************************
           '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 Tempa As Word
Dim Tempu As Word
Dim Histereza As Byte
Dim Tempp As Word                                           'zmiena pomocnicza
 
 
Dim Zezw_przyciski As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Miganie As Bit
'****************************
      'Wartosci Poczatkowe
'****************************
Histereza = 20
Tempu = 400
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
 
 
  If Pind.7 = 0 Then                                       'jezeli jest wlaczony przekaznik
   If Tempa >= Tempu Then Portd.7 = 1                       'jezeli tempa dochodzi do ustawionej to wyl przekaznik
  Else                                                      'jezeli wyl przekaznik
   Tempp = Tempu - Histereza                                'punkt wylaczenia
   If Tempa < Tempp Then Portd.7 = 0                        'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
  End If
 
  portd.0 = pind.7
  portd.1 = not pind.7
 
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '***************************************  co 4ms
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyciski                                    
     Miganie = Not Miganie                             
     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
 
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return

który Pan naipsiał byl błąd.Zmienilem port przekaźnika bo w attiny2313 nie ma PORTD.7.Ale pomimo, że to poprawiłem to źle działa.Diody świecą jak chcą.A przekaźnik jest ciagle zalączony.Nawet jak podgrzewam zapałkami DS to przekaźnik nie drgnie.Między środkową nóżką DS, a układem dałem dokładnie opornik 4,66 kilo oma.Co morze być źle w programie?

Bardzo proszę o pomoc:)

-

Pozdro :)

Portret użytkownika mirley

Re: Termostat

Spróbuj taką wersję

Do
 
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
 
 
  If Portd.6 = 0 Then                                       'jezeli jest wlaczony przekaznik
   If Tempa >= Tempu Then Portd.6 = 1                       'jezeli tempa dochodzi do ustawionej to wyl przekaznik
  Else                                                      'jezeli wyl przekaznik
   Tempp = Tempu - Histereza                                'punkt wylaczenia
   If Tempa < Tempp Then Portd.6 = 0                        'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
  End If
 
  portd.0 = portd.6
  portd.1 = not portd.6
 
End If
 
Loop
End

a jak nie zadziała to dodaj w ramach testów zamiast linijek:

  portd.0 = portd.6
  portd.1 = not portd.6

cos takiego

  portd.0 = not portd.0
  portd.1 = not portd.0

diody powinny dzięki temu migać na przemian. Przekonasz sie czy wogóle timer dobrze działa i czy flaga się ustawia i wykonuje

-

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.Po wkleieniu tego fragmento kodu:

Do
 
If Zezw_przyciski = 1 Then
  Reset Zezw_przyciski                                      'co 100ms
 
 
  If Portd.6 = 0 Then                                       'jezeli jest wlaczony przekaznik
   If Tempa >= Tempu Then Portd.6 = 1                       'jezeli tempa dochodzi do ustawionej to wyl przekaznik
  Else                                                      'jezeli wyl przekaznik
   Tempp = Tempu - Histereza                                'punkt wylaczenia
   If Tempa < Tempp Then Portd.6 = 0                        'jezeli tempa mniejsza niz ustawiona temp. - histereza to wlacz przek.
  End If
 
  portd.0 = portd.6
  portd.1 = not portd.6
 
End If
 
Loop
End

Nie bylo żadnuch zmian.Na porcie od przekaźnika scalaka było wraz napięcie, a czerwona led się świeciał nawet jak czasami sie zielona zaświeciła to nadal było napięcie na pinie scalaka.Po wkleieni tego:

portd.0 = not portd.0
  portd.1 = not portd.0

Diody mrugały na przemian.Rozważam trzy powody dla którego nie działa uklad:
1)Źle zaprojektowałem płytke.Umieszcze pod spodem PCB termostatu bo może coś tam spiprzyłem i nie chcie chodzić.Bardzo bym prosił żeby Pan rzucił na to okiem:)
/files/user_img/u368/ssssssssssssssss.png
W układzie jest LM7805 lecz po podłaczeniu ~9V daje na układ 6V stalego czy przez to morze nie działć ukald?Tranzystor to BC546B(NPN).
2)Źle ustawione fusy bit:

Dobrze są ustawione?
3)Zepsuty ds.

Barzo proszę żeby Pan sprawdził tą PCB bo momentami to nie wiem czy się smiać czy płakać:(
Proszę o pomoc

-

Pozdro :)

Portret użytkownika mirley

Re; termostat

gdzie masz schemat do tej płytki? mam nadzieje że nie rysowałeś od razu na PCB bo takich rzeczy się nie robi?

Na 6V procesor napewno nie pójdzie a jak nawet zadziała to nikt nie gwarantuje jak. zasilanie 4.5 - 5.5V, a nie 4.4 lub 5.6. O 6V nawet nie wspomnę. Co to znaczy że podałeś na LM7805 ~9V, podałeś bezpośrednio z trafa napięcie przemienne? a gdzie mostek i kondensator filtrujący? najgorszy LM7805 jaki widziałem dawał 5.12V, a przeważnie jest coś w okolicach 5.08V lub 4.98V

Fusebity są dobre

Ds napewno też.... masz rezystor 4.7k podciągający linię danych ds do +5V? bez tego nie będzie działał

-

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.