logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Pomoc w sprawdzeniu programu [BASCOM]

czopik2004 24 Maj 2009 20:13 2891 8
  • #1 6570119
    czopik2004
    Poziom 19  
    Witam!
    Do zasilacza 2x electronic lab chciałem dodać nieco rozszerzony woltomierz/amperomierz. Dodałem włączanie wentylatora po przekroczeniu temperatury 45*C i sygnalizację alarmu zwarcia (podpięcie się pod diodę LED w zasilaczu). Czy to tak będzie działać?
    Jakie jeszcze ewentualne sugestie Koledzy mają?

    Program wygląda tak...
    
    $regfile = "M8def.dat"                                      'Plik układu
    $crystal = 8000000                                          'Zegar
    
    Rem Konfig. LCD
    
    Config Lcd = 16 * 2 : Cursor Off
    Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.6 , Rs = Portd.5
    
    Rem Konfig. ADC
    
    Config Adc = Single , Prescaler = Auto , Reference = Internal
    
    Rem Konfig. 1Wire
    
    Config 1wire = Pinb.1
    
    Rem Konfig. Pinów
    
    Config Pinb.0 = Output                                      ' Wentylator
    Reset Pinb.0
    Config Pinb.2 = Output                                      ' Buzzer
    Config Pinb.3 = Input                                       ' Wejście z diody ograniczenia
    Reset Pinb.3
    Config Pinb.4 = Input                                       ' Wejście z diody ograniczenia 2
    Reset Pinb.4
    
    Rem ------------------------------ Znak stopnia
    
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    
    Rem Zmienne
    
    Dim Temp(2) As Byte
    Dim Wart_ac As Word
    Dim V As Single
    Dim Wart_nap As String * 3
    
    Rem ------------------------------ Program
    Cls
    
    Start Adc
    
    Do
    
    Rem  ----------------------------- Napięcie 1
    
    Wart_ac = Getadc(0)
    Locate 1 , 1
    V = Wart_ac * 0.0275
      If V > 10 Then
         Wart_nap = Fusing(v , "##.&&")
         Else
         Wart_nap = Fusing(v , "#.&&")
      End If
    Lcd "U1=" ; Wart_nap ; "V"
    
    Rem  ----------------------------- Prąd 1
    
    Wart_ac = Getadc(1)
    Locate 2 , 1
    V = Wart_ac * 0.039
      If V > 10 Then
          Wart_nap = Fusing(v , "##.&&")
          Else
          Wart_nap = Fusing(v , "#.&&")
      End If
    Lcd "I1=" ; Wart_nap ; "A"
    
    Rem  ---------------------------- Napięcie 2
    
    Wart_ac = Getadc(2)
    Locate 1 , 10
    V = Wart_ac * 0.0275
      If V > 10 Then
           Wart_nap = Fusing(v , "##.&&")
           Else
           Wart_nap = Fusing(v , "#.&&")
      End If
    Lcd "U2=" ; Wart_nap ; "V"
    
    Rem  ---------------------------- Prąd 2
    
    Wart_ac = Getadc(3)
    Locate 2 , 10
    V = Wart_ac * 0.039
      If V > 10 Then
         Wart_nap = Fusing(v , "##.&&")
         Else
         Wart_nap = Fusing(v , "#.&&")
      End If
    Lcd "I2=" ; Wart_nap ; "A"
    Wait 5
    
    Rem ---------------------------- Odczyt temperatury
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 750
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Temp(1) = 1wread(1)
    
    Rem ------------------------------ Nie ma układu
    
        If Err = 1 Then
          Cls
          Lcd "Brak układu"
              Do
              Loop
        End If
    Rem ----------------------------- Obliczanie temperatury
    Temp(1) = Temp(1) / 2
    Cls
    Lcd "Temp:" ; Temp(1) ; Chr(0) ; "C"
    Wait 10
    
    Rem ------------------------------ Próg wentylatora
    
        If Temp(1) > 45 Then
           Set Pinb.0
        End If
    
    Rem ----------------------------- Buzzer
    
        If Pinb.3 = 1 Or Pinb.4 = 1 Then
           Sound Pinb.2 , 3 , 10000
        End If
    
    Loop


    Z góry dziękuję za pomoc i pozdrawiam: Kamil
  • #2 6570751
    dawid512
    Poziom 32  
    Na pierwszy rzut oka:
    Config Pinb.0 Input                                         ' Wentylator 
    Wg. mnie ten pin powinien być skonfigurowany jako wyjście i powinien miec ustawiony stan początkowy. Po za tym w tym zapisie jest błąd: brakuje "=". Nie jest to jedyny zły zapis.
  • #3 6571458
    czopik2004
    Poziom 19  
    Teraz lepiej? Według mnie tak powinno to być ustawione. Jak z resztą programu? Chciałbym zauważyć, że to pierwszy poważniejszy program na procesor.

    Pozdrawiam!
  • #4 6572273
    dawid512
    Poziom 32  
    Poprawiłem lekko kod i dodałem kilka komentarzy.
    $regfile = "M8def.dat"                                      'Plik układu
    $crystal = 8000000                                          'Zegar  ( Jesteś pewien że masz 8MHz? Jeżeli nie grzebales w fuse bitach to masz 1MHz)
    
    Rem Konfig. LCD
    
    Config Lcd = 16 * 2 : Cursor Off
    Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.6 , Rs = Portd.5
    
    Rem Konfig. ADC
    
    Config Adc = Single , Prescaler = Auto , Reference = Internal
    
    Rem Konfig. 1Wire
    
    Config 1wire = Pinb.1
    
    Rem Konfig. Pinów
    
    Config Pinb.0 = Output : Reset Portb.0                      ' Wentylator
    Config Pinb.2 = Output : Reset Portb.2                      ' Buzzer ( jeżeli buzzer odpalany jest stanem niskiem to zmień stan początkowy)
    Config Pinb.3 = Input : Reset Portb.3                       ' Wejście z diody ograniczenia   | Jeżeli chcesz wykrywać stan wysoki to niezbędny jest
    Config Pinb.4 = Input : Reset Portb.4                       ' Wejście z diody ograniczenia 2 |zewnętrzny rezystor podciągający piny PB3 i PB4 do masy
    
    
    
    Rem ------------------------------ Znak stopnia
    
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    
    Rem Zmienne
    
    Dim Temp(2) As Byte
    Dim Wart_ac As Word
    Dim V As Single
    Dim Wart_nap As String * 5  ' 5 ponieważ używasz 5 znaków np. tu Wart_nap = Fusing(v , "##.&&")
    
    Rem ------------------------------ Program
    Cls
    
    Start Adc
    
    Do
    
    Rem  ----------------------------- Napięcie 1
    
    Wart_ac = Getadc(0)
    Locate 1 , 1
    V = Wart_ac * 0.0275
      If V > 10 Then
         Wart_nap = Fusing(v , "##.&&")
         Else
         Wart_nap = Fusing(v , "#.&&")
      End If
    Lcd "U1=" ; Wart_nap ; "V"
    
    Rem  ----------------------------- Prąd 1
    
    Wart_ac = Getadc(1)
    Locate 2 , 1
    V = Wart_ac * 0.039
      If V > 10 Then
          Wart_nap = Fusing(v , "##.&&")
          Else
          Wart_nap = Fusing(v , "#.&&")
      End If
    Lcd "I1=" ; Wart_nap ; "A"
    
    Rem  ---------------------------- Napięcie 2
    
    Wart_ac = Getadc(2)
    Locate 1 , 10
    V = Wart_ac * 0.0275
      If V > 10 Then
           Wart_nap = Fusing(v , "##.&&")
           Else
           Wart_nap = Fusing(v , "#.&&")
      End If
    Lcd "U2=" ; Wart_nap ; "V"
    
    Rem  ---------------------------- Prąd 2
    
    Wart_ac = Getadc(3)
    Locate 2 , 10
    V = Wart_ac * 0.039
      If V > 10 Then
         Wart_nap = Fusing(v , "##.&&")
         Else
         Wart_nap = Fusing(v , "#.&&")
      End If
    Lcd "I2=" ; Wart_nap ; "A"
    Wait 5
    
    Rem ---------------------------- Odczyt temperatury
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 750
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Temp(1) = 1wread(1)
    
    Rem ------------------------------ Nie ma układu
    
        If Err = 1 Then
          Cls
          Lcd "Brak układu"
              Do
              Loop
        End If
    Rem ----------------------------- Obliczanie temperatury
    Temp(1) = Temp(1) / 2
    Cls
    Lcd "Temp:" ; Temp(1) ; Chr(0) ; "C"
    Wait 10
    
    Rem ------------------------------ Próg wentylatora
    
        If Temp(1) > 45 Then
           Set Portb.0
        End If
    
    Rem ----------------------------- Buzzer
    
        If Pinb.3 = 1 Or Pinb.4 = 1 Then
           Sound Pinb.2 , 3 , 10000
        End If
    
    Loop
    
  • #5 6572288
    czopik2004
    Poziom 19  
    Dziękuję :)
    Czyli ogólnie program napisałem ok, tylko wymagał kilku drobnych poprawek, tak? Jak tylko dojdę do porządku z zasilaczem i płytką, to przetestuję.
    Jeśli ktoś jeszcze miałby jakieś sugestie, to są one mile widziane.

    Dziękuję i pozdrawiam!
  • #6 6589469
    czopik2004
    Poziom 19  
    Witam ponownie!
    Mam taki oto program. Problem polega tu na tym, że nie chce się skompilować. Wywala mi dwa błędy (trzy razy)
    Error : 31 Line : 0 Invalid datatype [[0011] 0] , in File :
    Error : 93 Line : 0 Variable not dimensioned [ 0-> 0] , in File :
    Error : 31 Line : 0 Invalid datatype [[0011] 0] , in File :
    Error : 93 Line : 0 Variable not dimensioned [ 0-> 0] , in File :
    Error : 31 Line : 0 Invalid datatype [[0011] 0] , in File :
    Error : 93 Line : 0 Variable not dimensioned [ 0-> 0] , in File :
    Miło by było, jakby ktoś wiedział o co mu chodzi, bo siedzę nad tym już całą noc.


    $regfile = "M8def.dat"                                      'Plik układu
    $crystal = 8000000                                          'Zegar
    
    Rem Konfig. LCD
    
    Config Lcd = 16 * 2
    Cursor Off
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
    
    Rem Konfig. ADC
    
    Config Adc = Single , Prescaler = Auto , Reference = Internal
    
    Rem Konfig. 1Wire
    
    Config 1wire = Pinb.1
    
    Rem Konfig. Pinów
    
    Config Pinb.0 = Output : Reset Portb.0                      ' Wentylator
    Config Pinb.2 = Output : Reset Portb.2                      ' Buzzer ( jeżeli buzzer odpalany jest stanem niskiem to zmień stan początkowy)
    Config Pinb.3 = Input : Reset Portb.3                       ' Wejście z diody ograniczenia   | Jeżeli chcesz wykrywać stan wysoki to niezbędny jest
    Config Pinb.4 = Input : Reset Portb.4                       ' Wejście z diody ograniczenia 2 |zewnętrzny rezystor podciągający piny PB3 i PB4 do masy
    
    Rem ------------------------------ Znak stopnia
    
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    
    Rem Zmienne
    
    Dim Temp(2) As Byte
    Dim Wart_ac As Word
    Dim V As Single
    Dim Wart_nap As String * 5
    
    Rem ------------------------------ Program
    
    Start Adc
    Do
    Cls
    
    Rem  ----------------------------- Napięcie 1
    
    Wart_ac = Getadc(0)
    Locate 1 , 1
    V = Wart_ac * 0.0275
    If V > 10 Then
         Wart_nap = Fusing(v , "##.&&")
         Else
         Wart_nap = Fusing(v , "#.&&")
      End If
    Lcd "U1=" ; Wart_nap ; "V"
    
    Rem  ----------------------------- Prąd 1
    
    Wart_ac = Getadc(1)
    Locate 2 , 1
    V = Wart_ac * 0.039
             If V > 10 Then
         Wart_nap = Fusing(v , "##.&&")
         Else
         Wart_nap = Fusing(v , "#.&&")
      End If
    Lcd "I1=" ; Wart_nap ; "A"
    
    Rem  ---------------------------- Napięcie 2
    
    Wart_ac = Getadc(2)
    Locate 1 , 10
    V = Wart_ac * 0.0275
           If V > 10 Then
         Wart_nap = Fusing(v , "##.&&")
         Else
         Wart_nap = Fusing(v , "#.&&")
      End If
    Lcd "U2=" ; Wart_nap ; "V"
    
    Rem  ---------------------------- Prąd 2
    
    Wart_ac = Getadc(3)
    Locate 2 , 10
    V = Wart_ac * 0.039
         If V > 10 Then
         Wart_nap = Fusing(v , "##.&&")
         Else
         Wart_nap = Fusing(v , "#.&&")
      End If
    Lcd "I2=" ; Wart_nap ; "A"
    Wait 5
    
    Rem ---------------------------- Odczyt temperatury
     1wreset
     1wwrite &HCC
     1wwrite &H44
     Waitms 750
     1wreset
     1wwrite &HCC
     1wwrite &HBE
     Temp(1) = 1wread(1)
    
    Rem ------------------------------ Nie ma układu
    
     If Err = 1 Then
          Cls
          Lcd "Brak układu"
              Do
              Loop
     End If
    Rem ----------------------------- Obliczanie Temperatury
     Temp(1) = Temp(1) / 2
     Cls
     Lcd "Temp:" ; Temp(1) ; Chr(0) ; "C"
     Wait 10
    
    Rem ------------------------------ Próg wentylatora
    
        If Temp(1) > 45 Then
          Set Portb.0
        End If
    
    Rem ----------------------------- Buzzer
    
        If Pinb.3 = 1 Or Pinb.4 = 1 Then
           Sound Pinb.2 , 3 , 10000
        End If
    Loop
    End
    

    Pozdrawiam!
  • #7 6590239
    sp3ots
    Poziom 38  
    Witam !
    Program nie kompiluje się, bo w nocy byłeś głodny i "zjadłeś" jeden mały przecinek w linii: Config Lcdpin
    Poszukaj go ...
    Pozdrawiam. Stefan
    ps. aby zaremować linię nie trzeba pisać REM wystarczy postawić taką małą kreseczkę '
  • #8 6591698
    czopik2004
    Poziom 19  
    Dziękuję Koledze.
    Teraz pojawił się problem mojego niedoinformowania. Jak w BASCOMIE AVR (1.11.9.0) ustawić fuse bity? Jakaś stronka o tym może, czy coś?
    Z góry dziękuję za pomoc.
    Pozdrawiam!
REKLAMA