Elektroda.pl
Elektroda.pl
X
AM TechnologiesAM Technologies
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Bascom] Proszę o sprawdzenie kodu

23 Sty 2011 19:36 3045 16
  • Poziom 14  
    Jestem w trakcie budowy sterownika do terrarium, wszytko jest już złożone. Mam jednak problem z programem. Po wgraniu go do procesora program poprawnie się uruchamia i na wyświetlaczy wszystko działa dobrze. Jednak układ dziwnie steruje wyjściami. W momencie kiedy wyjście powinno być wyłączone na wyświetlaczu przy znaku wyjścia nie ma strzałki i wyjście jest rzeczywiście wyłączone(np. żarówka podłączona przez triak się nie świeci), jednak jak wzrośnie temperatura i wyjście powinno się załączyć i pozostać załączone (na wyświetlaczu pojawia się znak strzałki i zostaje tam do momentu aż wyjście może zostać wyłączone) żarówka podłączona na wyjściu zamiast świecić światłem ciągłym miga. Udało mi się jedynie ustalić że żarówka zapala się i gaśnie co drugie okrążenie pętli programu. Polecenie SET działa tak samo jak TOGGLE. Dzieje się tak samo na wszystkich wyjściach. Nie wiem czemu tak jest i jak to naprawić.

    Załączam kod programu i schemat i proszę o pomoc w rozwiązaniu problemu.

    Schemat
    Kod

    Poprawiłem schemat i kod
  • AM TechnologiesAM Technologies
  • Pomocny post
    Poziom 27  
    Może nie umie wstawiać?
    Code:

    $regfile = "m88def.dat"
    $crystal = 1000000


    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
    Config Portd = &B00001111                                   'portd 0 1 2 3  jako wyjscia portd 4 jako 1wire 5 6 7 jako wejscia
            Portd.5 = 1
            Portd.6 = 1
            Portd.7 = 1
            Portd.3 = 1
            Portd.2 = 1
            Portd.1 = 1
            Portd.0 = 1

    Config Portc = Output                                       'portc jako wyjscia sterowania
            Portc.5 = 1
            Portc.4 = 1
            Portc.3 = 1
            Portc.2 = 1
            Portc.1 = 1
            Portc.0 = 1

    Config Portb.6 = Output
    Config Portb.7 = Output

    Config 1wire = Portd.4                                      'deklaracja 1wire
    Config Timer1 = Timer , Prescale = 256
    Declare Sub Wyswietl_czas                                   'procedura wyświetlająca czas w formacie gg:mm:ss
    Declare Sub Menu                                            'procedura menu
    Declare Sub Manual                                          'sterowanie manualne
    On Timer1 Odmierz_1s                                        'przerwanie do przepełnienia timer1


    Dim Sekundy As Byte
    Dim Minuty As Byte
    Dim Godziny As Byte
    Dim Nowa As Byte                                            'flaga zezwolenia aktualizacji czasu na LCD
    Dim Wart_bcd As Byte                                        'zmienna do zapisywania wartości PCD czasu

    Dim Odczyt(2) As Byte
    Dim A As Byte
    Dim C As Byte                                               'licznik for
    Dim T As Integer
    Dim E As Byte                                               'zmienna manual
    Dim T1 As Single
    Dim B As Byte                                               'zmienna odczytu kodów ID
    Dim W As Byte                                               'zmienna odczytu ilośc czujników
    Dim Dsid1(1) As Byte
    Dim F As String * 5                                         'zmienna do formatu wyświetlanej temp.
    Dim I As Byte                                               'licznik petli for

    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia celsjusza
    Deflcdchar 1 , 32 , 8 , 11 , 4 , 26 , 2 , 32 , 32           ' wentylator
    Deflcdchar 2 , 32 , 17 , 14 , 14 , 14 , 17 , 32 , 32        ' dzien
    Deflcdchar 3 , 32 , 6 , 12 , 24 , 24 , 24 , 12 , 6          ' noc
    Deflcdchar 4 , 32 , 32 , 4 , 4 , 4 , 21 , 14 , 4            ' strzałka
    Deflcdchar 5 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31        ' Test



    H Alias Pind.5                                              'przypisanie  pind.5 nazwy H
    M Alias Pind.6
    Men Alias Pind.7
                                                                 'przypisanie portom nazw
    Grzalka Alias Pinc.0                                        'Grzałka
    Wentylg Alias Pinb.7                                        'Wentylator grzałki
    Fogger Alias Pinc.2                                         'Nawilżacz
    Wentylf Alias Pinb.6                                        'Wentylator nawilżacza
    Dzien Alias Pinc.1                                          'Światło dzienne(żarówka)
    Noc Alias Pinc.3                                            'Światło nocne(żarówka)
    Led Alias Pinc.5                                            'Oświetlenie dzienne LED
    Ext Alias Pinc.4                                            'Wyjście dodatkowe
    Alarm Alias Pind.2                                          'Dioda alarm
    Le Alias Pind.3                                             'Dioda pracy
    Li Alias Pind.1                                             'Dioda dodatkowa stanu

    Enable Interrupts
    Enable Timer1
    Counter1 = 61630
    Set Nowa                                                    'zezwolenie na wyświetlanie czasu
    Cursor Off


    '***ekran startowy***

    Cursor Off                                                  'Wyłącza kursor
    Cls
    Lcd "Sterownik"                                             'ekran startowy (pojawia się tylko podczas włączania urządzenia)
    Lowerline
    Lcd "terrarium"
    Locate 1 , 12
    Lcd Chr(2) ; Chr(3) ; Chr(4)                                ' dzien/noc i strzałka stanu
    Locate 2 , 12
    Lcd Chr(1) ; Chr(1) ; "GFL"                                 'znaki wyjsc

    Wait 2


    Dsid1(1) = 1wsearchfirst()                                  'sprawdza czujnik podpięty do portu
    Cls

    'procedura ustawiania czasu i wejscia do menu
     Do
      Cursor Off

      If Men = 0 Then
      Waitms 200
          If Men = 0 Then
          Gosub Menu
          End If
      End If

      Call Wyswietl_czas
       If M = 0 Then
          Waitms 200
          If M = 0 Then
             Incr Minuty
             Sekundy = 0
             If Minuty = 60 Then
                Minuty = 0
             End If
             Set Nowa
             Call Wyswietl_czas
             Waitms 200
          End If
       End If

      If H = 0 Then
         Waitms 200
         If H = 0 Then
            Incr Godziny
            If Godziny = 24 Then
               Godziny = 0
            End If
            Set Nowa
            Call Wyswietl_czas
            Waitms 200
         End If
       End If


    '*************   operacje konwersji temperatury  *******************************


    1wreset                                                     'reset 1wire
    1wwrite &HCC                                                'rozkaz skip rom
    1wwrite &H44                                                'dokonaj konwersji temperatury
    Waitms 750                                                  'przeczekaj konwersję
    1wreset                                                     'reset 1wire
    1wwrite &HCC                                                'rozkaz skip rom
    1wwrite &HBE                                                'polecenie odczytu DS-a
    Odczyt(1) = 1wread(2)                                       'odczytaj dwa pierwsze bajty  do zmiennej
    T = Odczyt(2)                                               'przepisuje starszy bajt do zmiennej Integer
    Shift T , Left , 8                                          'przesuwa ten bajt w lewo na wyższe pozycje
    T = T + Odczyt(1)                                           'przepisz i dodaj młodszy bajt
    Waitms 100

    T1 = T * 10
    T1 = T / 16                                                 'wyraź w st. celsjusza i wpisz do zmiennej single


    F = Str(t1)                                                 'wpisz odczyt do string
    F = Fusing(t1 , "#.#")                                      'ustaw format wyświetlania


    Locate 1 , 1
    Lcd "Temp:" ; F ; Chr(0)                                    'wyswietlenie temperatury
    Locate 2 , 12
    Lcd Chr(1) ; Chr(1) ; "GFL"                                 'znaki wyjsc

    ' instrukcje sterujace##########
    If T1 > 16 And T1 < 30 Then                                 'Praca normalna w temperaturze od 16 do 30*C
    Reset Alarm                                                 'Wyłącz alarm

    If Godziny > 8 And Godziny < 20 Then                        'Dzień miedzy 8-20
         Locate 2 , 10
         Lcd Chr(2)                                              'znak dnia
         Locate 1 , 13
         Lcd Chr(4)                                             'znak pracy oswietlenia LED
         Set Led                                                'włącz oswietlenie LED
         Reset Noc                                              'wyłącz oswietlenie nocne
         If T1 < 27 Then                                        'jezeli temp < 27 włącz dodatkowo oświetlenie zarówka
         Set Dzien
         Else
         Reset Dzien                                            'w przeciwnym wypadku wylącz oświetlenie żarówką
         End If


         If T1 < 22 Then                                        'jezeli temp <22
         Locate 1 , 12                                          'znak wentylatora g
         Lcd Chr(4)
         Locate 1 , 14                                          'znak grzalki
         Lcd Chr(4)
         Set Wentylg                                            'wlacz wentylator g
         Set Grzalka                                            'wlacz grzalke
         End If

         If T1 > 26 Then                                        'jezeli temp > 26
         Locate 1 , 12                                          'wyczysc znak went
         Lcd " "
         Locate 1 , 14                                          'wyczysc znak grzalki
         Lcd " "
         Reset Wentylg                                          'wylacz wentylator g
         Reset Grzalka                                          'wylacz grzalke
         End If
    Else                                                        'Noc
         Locate 2 , 10
         Lcd Chr(3)                                             'znak nocy
         Reset Led                                              'wyłącz oswietlenie LED
         Reset Dzien                                            'wyłacz oswietlenie dzienne
         Set Noc                                                'włącz oswietlenie nocne

         If T1 < 20 Then                                        'jezeli temp <20
         Locate 1 , 12                                          'znak wentylatora g
         Lcd Chr(4)
         Locate 1 , 14                                          'znak grzalki
         Lcd Chr(4)
         Set Wentylg                                            'wlacz wentylator g
         Set Grzalka                                            'wlacz grzalke
         End If

         If T1 > 24 Then                                        'jezeli temp > 24
         Locate 1 , 12                                          'wyczysc znak went
         Lcd " "
         Locate 1 , 14                                          'wyczysc znak grzalki
         Lcd " "
         Reset Wentylg                                          'wylacz wentylator g
         Reset Grzalka                                          'wylacz grzalke
         End If
    End If


    If Minuty < 30 Then                                         'włączanie nawilżania co godzine na czas 30 minut
    Set Wentylf                                                 'włacz wentylator foggera
    Set Fogger                                                  'włącz fogger
    Locate 1 , 13                                               'znak wentylatora f
    Lcd Chr(4)
    Locate 1 , 15                                               'znak foggera
    Lcd Chr(4)
    End If
    If Minuty >= 30 Then
    Reset Wentylf                                               'wyłacz wentylator foggera
    Reset Fogger                                                'wyłącz fogger
    Locate 1 , 13                                               'znak wentylatora f
    Lcd " "
    Locate 1 , 15                                               'znak foggera
    Lcd " "
    End If
    End If

    ' Instrukcje bezpieczeństwa######

    If T1 >= 30 Then                                            'Jeżeli temp wieksza niż 30
    Set Alarm                                                   'włacz alarm
    Set Wentylg                                                 'wlacz wentylator grzalki
    Set Wentylf                                                 'wlacz wentylator nawilzacza
    Set Fogger                                                  'wlacz nawilzacz
    Reset Grzalka                                               'wylacz grzalke
    Reset Dzien                                                 'wylacz oswietlenie dzienne zarowka
    Reset Noc                                                   'wylacz oswietlenie nocne zarowka
    End If

    If T1 <= 16 Then                                            'Jezeli temperatura mniejsza niz 16
    Set Alarm                                                   'wlacz alarm
    Reset Wentylf                                               'wylacz wentylator nawilzacza
    Reset Fogger                                                'wylacz nawilzacz
    Set Dzien                                                   'wlacz oswietlenie dzienne
    Set Noc                                                     'wlacz oswietlenie nocne
    Set Grzalka                                                 'wlacz grzalke

    End If

    Loop



    'procedura do wyświetlania czasu

      Sub Wyswietl_czas
          If Nowa = 1 Then

             Locate 2 , 1
             Wart_bcd = Makebcd(godziny)                        'zmień wartość godzin na kod BCD
             Lcd Bcd(wart_bcd) ; ":"                            'wyświetl wartość godzin w kodzie BCD zamienionych na tekst

             Wart_bcd = Makebcd(minuty)
             Lcd Bcd(wart_bcd) ; ":"

             Wart_bcd = Makebcd(sekundy)
             Lcd Bcd(wart_bcd) ;

             Reset Nowa                                         'resetuj flagę
          End If
      End Sub

         'podprogram obsługi przerwania
         Odmierz_1s:
         Counter1 = Counter1 + 61630
         Incr Sekundy
         Set Nowa

         If Sekundy = 60 Then
            Sekundy = 0
            Incr Minuty

            If Minuty = 60 Then
               Minuty = 0
               Incr Godziny

               If Godziny = 24 Then
                  Godziny = 0
               End If
            End If
         End If
         Toggle Le
      Return



      'podprogram menu
      Sub Menu

      Cursor Off
      Cls
      Lcd "MENU"
      For C = 1 To 12
      Waitms 100
      Shiftlcd Right
      Next
      Wait 1
      Do

      Cls
      Locate 1 , 6
      Lcd "MENU"
      Lowerline
      Lcd "M-Manual"
      Wait 1
      Cls
      Locate 1 , 6
      Lcd "MENU"
      Lowerline
      Lcd "Menu - Powrot"
      Wait 1
      If Men = 0 Then
      Waitms 200
          If Men = 0 Then
          Return
          End If
      End If

      If M = 0 Then
      Waitms 200
          If M = 0 Then
          Gosub Manual
          End If
      End If
      Loop
    End Sub



     'Podprogram manual
     Sub Manual
     Cls
     Lcd "Manualne"
     Lowerline
     Lcd "sterowanie"
     Wait 1
     Cls
     Lcd "Menu-powrot"
     Wait 1
     Cls
     Lcd "H-Zmiana stanu"
     Lowerline
     Lcd "M-Nastepny"
     Wait 2
     Reset Wentylg
     Reset Wentylf
     Reset Led
     Reset Ext
     Reset Dzien
     Reset Noc
     Reset Fogger
     Reset Grzalka
     E = 0
     Do

     If Men = 0 Then
      Waitms 200
          If Men = 0 Then
          Return
          End If
      End If

      If M = 0 Then
      Waitms 200
          If M = 0 Then
          Incr E
          Waitms 50
          If E = 8 Then
          E = 0
          End If
          End If
      End If
      Cls
      If E = 0 Then
      Lcd "Wentylator grzal"
      If Wentylg = 1 Then
      Locate 2 , 1
      Lcd "ON"
      Else
      Lcd "OFF"
      End If
      End If
      If E = 1 Then
      Lcd "Wentylator fogge"
      If Wentylf = 1 Then
      Locate 2 , 1
      Lcd "ON"
      Else
      Lcd "OFF"
      End If
      End If
      If E = 2 Then
      Lcd "Led"
      If Led = 1 Then
      Locate 2 , 1
      Lcd "ON"
      Else
      Lcd "OFF"
      End If
      End If
      If E = 3 Then
      Lcd "EXT"
      If Ext = 1 Then
      Locate 2 , 1
      Lcd "ON"
      Else
      Lcd "OFF"
      End If
      End If
      If E = 4 Then
      Lcd "Fogger"
      If Fogger = 1 Then
      Locate 2 , 1
      Lcd "ON"
      Else
      Lcd "OFF"
      End If
      End If
      If E = 5 Then
      Lcd "Grzalka"
      If Grzalka = 1 Then
      Locate 2 , 1
      Lcd "ON"
      Else
      Lcd "OFF"
      End If
      End If
      If E = 6 Then
      Lcd "Dzien"
      If Dzien = 1 Then
      Locate 2 , 1
      Lcd "ON"
      Else
      Lcd "OFF"
      End If
      End If
      If E = 7 Then
      Lcd "Noc"
      If Noc = 1 Then
      Locate 2 , 1
      Lcd "ON"
      Else
      Lcd "OFF"
      End If
      End If

       If H = 0 Then
      Waitms 200
          If H = 0 Then
             If E = 0 Then
             Toggle Wentylg
             End If
             If E = 1 Then
             Toggle Wentylf
             End If
             If E = 2 Then
             Toggle Led
             End If
             If E = 3 Then
             Toggle Ext
             End If
             If E = 4 Then
             Toggle Fogger
             End If
             If E = 5 Then
             Toggle Grzalka
             End If
             If E = 6 Then
             Toggle Dzien
             End If
             If E = 7 Then
             Toggle Noc
             End If

          Waitms 100
          End If
      End If

     Loop
     End Sub

    [Bascom] Proszę o sprawdzenie kodu
  • Poziom 14  
    Witam
    Czy na prawde nikt nie wie co jest źle w tym programie?

    Mam już złożone cale urządzenie i czekam tylko na program, bo bez poprawienia programu urządzenie nie działa.
    Proszę o przejrzenie kodu i jakieś podpowiedzi gdzie szukać błędów bo mi się już pomysły skończyły.
  • AM TechnologiesAM Technologies
  • Poziom 14  
    Mi w symulatorze też działa. Nie działa sterowanie wyjściami po wgraniu do procka. Aktualnie uC pracuje na wewnętrznym kwarcu, czy dołożenie zewnętrznego rezonatora może zmienić coś w kwestii dziwnego działania wyjść?
  • Poziom 14  
    Układy są połączone kablem 2x5 żył o długości około 1m. Wygląda jak zwykłą skrętka komputerowa tyle że 10 żyłowa.
  • Pomocny post
    Poziom 32  
    Za pomocą miernika, oscyloskopu lub analizatora stanów logicznych sprawdź napięcia lub stan 0 i 1 na wyjściach.

    Pozdrawiam
    Józef
    PS. W ten sposób dowiemy się czy jest to problem w programie czy na schemacie.
  • Poziom 14  
    Ok jak będę wieczorem w domu to sprawdzę stany miernikiem(innych narzędzi pomiarowych nie posiadam)
    Pozdrawiam
  • Poziom 14  
    Właśnie sprawdziłem stany pinów wyjść uC. Miernik po podłączeniu jednego bieguna do masy układu, a drugiego do kolejnych pinów uC wykazał na pinach z przekaźnikami +5V bez żadnych odchyleń, na pinach migających zmiana co około 1s raz +0,2V raz +5V, na pinach z triakami włączonymi na stałe +4,8V.
  • Poziom 14  
    Jestem już na 100% pewien że dziwne zachowanie wyjść powoduje jakiś błąd programu. Nie wiem nadal gdzie jest ten błąd. I mam jeszcze pytanie odnośnie schematu. Po podłączeniu modułu wykonawczego do uP wszystkie przekaźniki się załączają i nie dają się wyłączyć programowo. Są włączone niezależnie od stanu portu. Czy zrobiłem jakiś błąd na schemacie? Po odłączeniu wtyczki przekaźniki się wyłączają ale wystarczy dotknąć pinów wtyczki aby się pojedynczo załączały.
  • Pomocny post
    Poziom 14  
    Masz popełniony błąd na schemacie.
    Tak się przekaźnikiem nie steruje tranzystory pnp E do 12V B przez rezystor do procesora który jest zasilany 5V, a aby zatkać tranzystor starczy E12V-B11.3V = EB 0.7V
    rozważań jest wiele ja ci przedstawię 2

    1 małe zmiany
    Musisz wstawić DIODY ZENERA 7.2V...9.1V w szereg z rezystorem R10...R13 pamiętaj o polaryzacji aby osiągnąć spadek napięcia
    [Bascom] Proszę o sprawdzenie kodu
    Może okazać się choć to mało prawdopodobne że to nie wszystko i tranzystory nie włączy przekaźnika, w takim przypadku trzeba będzie dodać rezystory wyłączające tranzystory
    [Bascom] Proszę o sprawdzenie kodu
    pamiętaj że stan niski 0.2V włącza przekaźnik a stan wysoki 5V wyłącza przekaźnik

    2 fachowo np tak
    [Bascom] Proszę o sprawdzenie kodu

    co do programu to najpierw wstaw te diody i sprawdź.
  • Pomocny post
    Poziom 32  
    pini0 napisał:
    2 fachowo np tak
    [Bascom] Proszę o sprawdzenie kodu

    co do programu to najpierw wstaw te diody i sprawdź.


    To jest sterowanie NPN a nie PNP.

    W załączeniu przesyłam sterowanie tranzystorem PNP

    Pozdrawiam
    Józef
  • Pomocny post
    Poziom 37  
    Dinop napisał:
    Nie wiem nadal gdzie jest ten błąd. I mam jeszcze pytanie odnośnie schematu. Po podłączeniu modułu wykonawczego do uP wszystkie przekaźniki się załączają i nie dają się wyłączyć programowo. Są włączone niezależnie od stanu portu. Czy zrobiłem jakiś błąd na schemacie? Po odłączeniu wtyczki przekaźniki się wyłączają ale wystarczy dotknąć pinów wtyczki aby się pojedynczo załączały.


    Schemat masz w zasadzie dobry, pod warunkiem że nie ma tam błedów natury technicznej (zwarć lub otwartych ścieżek).
    Możesz dodatkowo dodać przy każdym tranzystorze opornik R2 pomiędzy bazę i emiter jak na rysunku; wartość R2 nie jest krytyczna i możesz przyjąć: R2 = 10*R1.

    [Bascom] Proszę o sprawdzenie kodu

    Poparz jeszcze na fragment twojego programu:

    Code:

    Reset Wentylf                                              'wyłacz wentylator foggera
    Reset Fogger                                                'wyłącz fogger
    ................
    Reset Grzalka                                               'wylacz grzalke
    Reset Dzien                                                 'wylacz oswietlenie dzienne zarowka
    Reset Noc                                                   'wylacz oswietlenie nocne zarowka



    Nie sprawdzałem całości kodu, ale w tej częci jest akurat odwrotnie; Baza tranzystora zwarta do masy (stan niski lub Reset) powoduje 'załączenie' tranzystora/przekaźnika. Podejrzewam ze całośc kodu wymaga dokładniejszej weryfikacji.

    e marcus
  • Pomocny post
    VIP Zasłużony dla elektroda
    emarcus napisał:
    [Bascom] Proszę o sprawdzenie kodu
    Jeżeli V+>+5V to nie będzie działać prawidłowo - albo NPN od strony GND, albo jeszcze po drodze dioda Zenera na bazę.
  • Poziom 14  
    Zastosowałem metodę jaka radził pini0
    Cytat:
    2 fachowo np tak
    [Bascom] Proszę o sprawdzenie kodu

    Te wersje z diodami nie działały. Ta wersja z tranzystorem NPN działa świetnie.
    Jako, że nadal nie odkryłem dlaczego nie działają mi komendy reset, toggle , a set działa jak toggle wiec zmodyfikowałe kod wstawiając za
    set:

    Code:
    If Wentylf = 0 Then
    
             Set Wentylf                                        'wlacz wentylator f
          End If

    a za reset:
    Code:
    If Wentylf = 1 Then
    
             Set Wentylf                                        'wylacz wentylator f
          End If

    jako toggle używam set bez if i wszytko działa jak powinno.
    Dzieki za pomoc wszytkim.
    Pozdrawiam[/img]