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

[Atmega8][BASCOM] Odbiór lasera (reaguje z opóźnieniem)

Tom_x 23 Maj 2008 15:17 2217 3
  • #1 5172081
    Tom_x
    Poziom 11  
    Witam!
    Jak wspomniałem, mam drobny problem z odbiorem sygnału lasera. Mianowicie mam w sumie wgrany taki oto kod:
    
    '---------------------------------------------- REJESTRY I CZESTOTLIWOSC ZEGARA
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    '---------------------------------------------- KONFIGURACJA LCD
    
    Config Lcd = 16 * 2
    
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    
    '---------------------------------------------- KONFIGURACJA MAGISTRALI 1WIRE
    Config 1wire = Portb.0
    
    '---------------------------------------------- KONFIGURACJA ODBIORNIKA LASERA
    Config Int0 = Low Level
    Config Int1 = Low Level
    
    On Int0 Laser
    On Int1 Czujnik_swiatla
    
    '---------------------------------------------- KONFIGURACJA DIOD
    
    Config Portd.0 = Output
    Config Portd.1 = Output
    Config Portd.4 = Output
    
    '---------------------------------------------- KONFIGURACJA PRZYCISKU
    Config Pind.7 = Input
    
    
    '---------------------------------------------- ZMIENNUŻYTE W PROGRAMIE
    Dim Odczyt As Integer                                       'ODCZYT DS'A
    Dim Tc As Single                                            'ZMIENNE TEMPERATURY
    Dim Tc2 As Single                                           'ZMIENNE TEMPERATURY
    Dim Roznica As Single                                       'ZMIENNE TEMPERATURY
    Dim Czas As Integer
    Dim Temp As Integer
    Dim Tmp As Bit
    Dim Flaga As Bit
    Dim Flaga1 As Bit
    Declare Sub Alarm(byval A As Byte)
    Declare Sub Odczyt
    
    
    Set Flaga
    Set Flaga1
    
    Enable Interrupts
    Enable Int0
    Enable Int1
    
    
    '---------------------------------------------- ZNAK STOPNI
    Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32
    Deflcdchar 1 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
    
    Set Portd.7
    Tmp = 0
    
    '---------------------------------------------- PROGRAM GŁÓWNY
    
    Cls
    
       Cursor Off
       Locate 1 , 1
       Lcd " TEMPERATURA     "
       Locate 2 , 1
       Lcd "                "
    
       Czas = 0
       Roznica = 0
    
       Call Odczyt
       Tc2 = Tc
       Portd.0 = 1
       Portd.1 = 1
       Portd.4 = 1
    
    
    Do
    
       If Flaga = 1 Then
          Reset Flaga
          Enable Int0
       Elseif Flaga = 0 Then
          Locate 1 , 1
          Call Alarm(2)
          Enable Int0
       End If
    
       If Flaga1 = 1 Then
          Reset Flaga1
          Enable Int1
       Elseif Flaga1 = 0 Then
          Locate 1 , 1
          Call Alarm(3)
          Enable Int1
       End If
    
       Call Odczyt
    
    
    
       If Czas > 10000 Then
          Roznica = Tc2 - Tc
          Tc2 = Tc
          Czas = 0
       End If
    
       Locate 2 , 1
       Lcd " " ; Fusing(tc , "#.#") ; Chr(0) ; "C             "
    
    
       If Roznica > 0.5 Then
          Call Alarm(1)
       Elseif Roznica < -0.5 Then
          Call Alarm(1)
       End If
    
       Czas = Czas + 1250
    Loop
    
    End
    
    
    Sub Odczyt
    
       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 500
       1wreset
       1wwrite &HCC
       1wwrite &HBE
    
       Temp = 1wread(2)
       Tc = Temp
       Tc = Tc * 10
       Tc = Tc \ 16
       Tc = Tc \ 10
    
    End Sub
    
    
    
    Sub Alarm(byval A As Byte)
    
          Select Case A
             Case 1:
                Cls
                Locate 1 , 1
                Lcd "UWAGA TEMP"
                Locate 2 , 1
                Lcd " " ; Fusing(tc , "#.#") ; Chr(0) ; "C         "
             Case 2:
                Cls
                Locate 1 , 1
                Lcd "UWAGA LASER"
                Locate 2 , 1
                Lcd " " ; Fusing(tc , "#.#") ; Chr(0) ; "C         "
             Case 3:
                Cls
                Locate 1 , 1
                Lcd "UWAGA SWIATLO"
                Locate 2 , 1
                Lcd " " ; Fusing(tc , "#.#") ; Chr(0) ; "C         "
          End Select
    
          Do
             Sound , Portb.1 , 100 , 200
             Portd.0 = 0
             Waitms 100
             Portd.0 = 1
             Sound , Portb.1 , 100 , 200
             Portd.1 = 0
             Waitms 100
             Portd.1 = 1
             Sound , Portb.1 , 100 , 200
             Portd.4 = 0
             Waitms 100
             Portd.4 = 1
    
             If Pind.7 = 0 Then
                Waitms 25
                If Pind.7 = 0 Then
                   Locate 1 , 1
                   Lcd "ALARM WYLACZONY"
                   Waitms 250
                   Tmp = 1
                End If
             End If
    
             If Tmp = 1 Then
                Tmp = 0
                Exit Do
             End If
    
          Loop
    
          Waitms 450
          Sound , Portb.1 , 100 , 200
          Locate 1 , 1
          Lcd " TEMPERATURA     "
          Roznica = 0
          Portd.0 = 1
          Portd.1 = 1
          Portd.4 = 1
    
    End Sub
    
    
    Laser:
    Disable Int0
    Enable Interrupts
    Set Flaga
    Return
    
    Czujnik_swiatla:
    Disable Int1
    Enable Interrupts
    Set Flaga1
    Return
    


    Kod trochę długi jest, ale wkleiłem wszystko, bo nie wiem co powoduje błąd. A mianowicie błąd ten polega na tym, że laser nie reaguje "od razu". W sensie że trzeba poświecić mu 2-4 sekundy żeby alarm się włączył.

    Wszystko raczej dobrze zlutowane bo ogólnie rzecz biorąc działa, teraz myślę, że to kwestia poprawki w programie.

    Z bascomem i elektroniką nie miałem zbyt wiele do czynienia więc prosiłbym o wsparcie :)
  • #2 5174798
    Ch.M.
    Poziom 27  
    Na pierwszy rzut oka widac czemu kod wykonuje się długo: bo jest jak na ten kompilator ogromny, używasz wielu peryferii i opóźnień programowych. Spróbuj poskracac opóźnienia, np. ten przy ponownym odczytywaniu 1wire: myślę że nawet możesz wywali ten postój. Poexperymentuj z wszystkimi czasami zaczynając od wywalenia, a jeśli program zacznie się sypac to po prostu skracaj o połowe, o kolejną połowę itd.
  • #3 5174837
    gothye
    Poziom 33  
    albo wykorzystaj timer uC zamiast przerw
  • #4 5187639
    Tom_x
    Poziom 11  
    W sumie już wcześniej udało się to poprawić ale thx :) chodziło o waity :)
REKLAMA