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

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

Tom_x 23 Maj 2008 15:17 1869 3
  • #1 23 Maj 2008 15:17
    Tom_x
    Poziom 11  

    Witam!
    Jak wspomniałem, mam drobny problem z odbiorem sygnału lasera. Mianowicie mam w sumie wgrany taki oto kod:

    Code:

    '---------------------------------------------- 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 :)

    0 3
  • #2 24 Maj 2008 10:37
    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.

    0
  • #3 24 Maj 2008 10:54
    gothye
    Poziom 33  

    albo wykorzystaj timer uC zamiast przerw

    0
  • #4 27 Maj 2008 19:36
    Tom_x
    Poziom 11  

    W sumie już wcześniej udało się to poprawić ale thx :) chodziło o waity :)

    0