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]Przerywania i ds1820 - problem z kodem

MaxDamage18 28 Paź 2009 23:40 1695 8
  • #1 28 Paź 2009 23:40
    MaxDamage18
    Poziom 9  

    Witam panowie, usiłuje napisać program do wytrawiarki, lecz jak już program jest prawie gotowy strasznie wolno chodzi i nie wykonuje czasami wszystkich poleceń. Program ma działać tak: po włączeniu, grzałka ma cały czas grzać do uzyskania temperatury zadanej, a pompka włączać się co jakiś czas w celu wymieszania. A po osiągnięciu temperatury zadanej, ma się włączyć buzzer i pikać, aż do naciśnięcia S1. Po naciśnięciu S1 buzer ma się wyłączyć, a grzałka ma pilnować temperatury oraz pompka ma być włączona cały czas. Program jest w bascomie, ustalanie temperatury zadanej poprzez enkoder ecw1j-b24. Nie wiem czym to jest spowodowane, że program strasznie wolno działa i nie wykonuje całego kodu. Może to przez jednoczesną obsługę Lcd, przerywań i ds-a. Na s1 czyli portb.2 mam cały czas stan niski, nawet jak swich jest odłączony. Jak by ktoś był tak miły i znał się dobrze na bascomie i poukładał im ten program tak jak należy byłbym bardzo wdzięczny. Niestety napisać coś korzystającej z jednej rzeczy np. sam termometr na ds-e umiem i inne rzeczy, lecz mam problem z pisaniem bardziej złożonych programów. Bardzo dziękuje za pomoc z góry.

    oto kod:

    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 256
    $swstack = 256
    $framesize = 500

    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
    Config 1wire = Portb.0
    Config Portb.7 = Output
    Config Portb.6 = Output
    Config Portb.5 = Output
    Config Portb.2 = Input



    Cha Alias Pind.2
    Chb Alias Pind.3

    Config Cha = Input
    Config Chb = Input
    Config Pind.6 = Output



    Config Int0 = Falling
    Const Debouncetime = 1

    Dim Wtime As Byte
    'Dim Encounter As Integer

    Set Chb

    On Int0 Getencoder

    Cls

    Wtime = 100
    'T1 = 112




    'Set Portd.7

    Grzalka Alias Portb.7
    Pompka Alias Portb.6
    Buz Alias Portb.5
    S1 Alias Portb.2

    Dim Temp(2) As Byte
    Dim B As Integer
    Dim C As Integer
    Dim X As Bit
    Dim T1 As Byte
    Dim S1 As Bit
    Dim A1 As Bit
    Declare Sub Odcz_temp
    Declare Sub Buzer
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    Deflcdchar 1 , 4 , 10 , 10 , 10 , 17 , 21 , 31 , 14






    'Encounter = T1
    T1 = 30

    X = 0
    Buz = 0
    Cursor Off

    Cls
    Locate 1 , 1
    Lcd Chr(1)
    Locate 1 , 2
    Lcd "r"
    Locate 1 , 3
    Lcd "="
    Locate 1 , 6
    Lcd Chr(0)
    Locate 1 , 7
    Lcd "C"
    Locate 1 , 9
    Lcd Chr(1)
    Locate 1 , 10
    Lcd "z"
    Locate 1 , 11
    Lcd "="
    Locate 1 , 14
    Lcd Chr(0)




    Locate 1 , 15
    Lcd "C"

    'Portd = &B11
    Enable Interrupts
    Enable Int0

    Do










    Locate 1 , 4
    Lcd Temp(1)
    Locate 1 , 12
    Lcd T1

    If Temp(1) > T1 Then
    Reset Grzalka
       If X = 0 Then
          Gosub Buzer
       End If
    End If



    Waitms 750

    If Temp(1) < T1 Then
    Set Grzalka

    End If

    If S1 = 1 Then
       Waitms 25
       If S1 = 1 Then
          X = 1
          Else
          X = 0
       End If
    End If
    A1 = 0


    If X = 0 Then
    Gosub Pnag
    Locate 2 , 2
    Lcd "NAGRZEWANIE"
    End If


    If X = 1 Then
       Set Pompka
       Locate 2 , 2
       Lcd "WYTRAWIANIE"
    End If

    If T1 > 55 Then
    T1 = 55
    End If

    If T1 < 20 Then
    T1 = 20
    End If
    A1 = 1

    Gosub Odcz_temp

    Loop

    End

    Sub Odcz_temp

       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 750
       1wreset
       1wwrite &HCC
       1wwrite &HBE

       Temp(1) = 1wread(2)

       1wreset
       If Err = 1 Then
          Cls
          Lcd "Brak ukladu"

          Do
          Loop

       End If
       If Temp(2) > 0 Then

          Temp(1) = 256 - Temp(1)
       End If
       Temp(1) = Temp(1) / 2



    End Sub

    Sub Buzer

       Do
          Buz = 0
          Waitms 300
          Buz = 1

          If S1 = 0 Then
             Waitms 25
                'If S1 = 0 Then
                  ' X = 1
                  ' Exit Sub
                  ' Exit Do
               ' End If
          End If

           Gosub Odcz_temp

            Locate 1 , 4
    Lcd Temp(1)
    Locate 1 , 12
    Lcd T1

       Loop

    End Sub




    Pnag:
    Set Pompka
    Wait 5
    Reset Pompka

    Return


    Getencoder:


      Waitms Debouncetime
      If Cha = 0 Then
        If Chb = 0 Then Incr T1 Else Decr T1
      End If
      Gifr = 64
    Return


















    0 8
  • #3 29 Paź 2009 00:26
    SebMarszal
    Poziom 13  

    Witam.
    Może powolne działanie spowodowane jest złym ustawieniem fusbitów.
    Jeżeli nie ma błędów w programie, to złe działanie może być spowodowane tym że czasami Bascom robi różne dziwne rzeczy. Proponuje przesiąść się na inny kompilator
    Pozdrawiam

    0
  • #4 29 Paź 2009 15:06
    MaxDamage18
    Poziom 9  

    No Tak ale inny kompilator wiąże, się znowu uczeniem się podstaw i rozmyślaniu gdzie zrobiłem błąd. Według mnie nie ma to sensu, kiedy nie mam opanowanego w 50% bascoma. Myślę, iż powyższy kod który, napisałem jest nie do końca optymalny dla procesora i stąd moja prośba do was. Może da się zrobić tak, że jak enkoder jest w spoczynku czyli przerywania są wyłączone to wtedy sprawdzam temperaturę i na odwrót. Lecz ja za bardzo nie wiem jak to zrobić.

    0
  • #5 29 Paź 2009 17:06
    11111olo
    Poziom 43  

    Witam.
    Powinieneś zastosować przerwanie np. Timer1 do zliczania czasu.
    Sprawdzanie temperatury powinno dobywać się co sekundę lub dłużej.
    Załaczanie/odłaczanie pompki i innych elementów musi odbywać się w przerwaniu i powinno być sprawdzane wraz ze zmianą temperatury.
    Co do wyświetlania można zrobić to w przerwaniu lub nie.

    0
  • #6 29 Paź 2009 17:14
    landy13
    Poziom 29  

    Code:
    $hwstack = 256
    
    $swstack = 256
    $framesize = 500
    Nie za rozrzutnie to trochę ustawione?

    0
  • #7 29 Paź 2009 20:10
    MaxDamage18
    Poziom 9  

    11111olo napisał:
    Witam.
    Powinieneś zastosować przerwanie np. Timer1 do zliczania czasu.
    Sprawdzanie temperatury powinno dobywać się co sekundę lub dłużej.
    Załaczanie/odłaczanie pompki i innych elementów musi odbywać się w przerwaniu i powinno być sprawdzane wraz ze zmianą temperatury.
    Co do wyświetlania można zrobić to w przerwaniu lub nie.


    No właśnie o tym myślałem, lecz moja wiedza nie pozwala mi tego napisać bez żadnej pomocy. Więc chciałbym Cię prosić o napisanie chodź kawałka mojego kodu z uwzględnieniem twojego pomysłu. Oczywiście nie chodzi mi o gotowca lecz o wzór.

    Ps.1 Nikt mi widze nie chce pomóc :cry:

    0
  • #8 30 Paź 2009 07:41
    jacobsek
    Poziom 22  

    witam.
    Kol.Seb jeśli stosuje się zestaw podstawowych słów w bascomie, unikając gotowców i tworząc własne procedurki, to można napisać sensowny program i w bascomie tak jak w C i nie będzie robił dziwnych rzeczy.
    A co do pomocy w temacie to już ją uzyskałeś, tak jak napisano unikaj waitms itp. opóźnień, zrób sobie swoją pętlę opóźniającą w której coś się da robić w tym czasie, coś kontrolować, 750mS bezczynności to tu to tam, dla programu to wieczność i tak pisany program w końcu się wyłoży. W pętli głównej masz waitms 750 i jeszcze wykonujesz z niej skok do procedury gdzie jast kolejne 750, jak w takim razie wyobrażasz sobie wykrycie naciśnięcia przycisku?, w tak skonstruowanym programie masz wrażenie że przycisk raz zadziała a pięć razy nie, a gdybyś np. w pętli opóźniającej sprawdzał jego stan to masz pewne i szybkie wykrycie jego naciśnięcia, na tym polega różnica w NIE stosowaniu waitmsów.
    Co do stosu i ramki to wystarczy stos 60 a ramka 40 na spokojnie.
    Pozdrawiam.

    0
  • #9 30 Paź 2009 15:10
    1MAc
    Poziom 16  

    Cytat:
    No właśnie o tym myślałem, lecz moja wiedza nie pozwala mi tego napisać bez żadnej pomocy. Więc chciałbym Cię prosić o napisanie chodź kawałka mojego kodu z uwzględnieniem twojego pomysłu. Oczywiście nie chodzi mi o gotowca lecz o wzór.


    Dla mnie wygląda to (na pierwszy rzut oka) na spory chaos w programie.
    np wielokrotne wołanie odczytu temperatury - i to z podprogramów.
    To się zmienia na tyle wolno, że (może) wystarczy od czasu do czasu sprawdzić go w głównej pętli a do subów przekazywać tylko zmienne.
    Ale to tak na pierwszy rzut oka.

    MAc

    0