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

[ATTINY2313][BASCOM] Tablica i kolejny problem..

Wersik 13 Lis 2009 00:19 1920 2
  • #1 7253311
    Wersik
    Poziom 12  
    Witam. Zbudowałem termometr w oparciu o DS18b20.
    Chciałbym zapisywać co 1200 pomiar do tablicy 3-elementowej.
    Po zapełnieniu tablicy 3 pomiarami:

    pierwszy pomiar = 1 element tablicy
    drugi pomiar = 2 element tablicy
    trzeci pomiar = 3 element tablicy

    chciałbym porównać wartości i sprawdzić, czy temperatura wzrosła, czy spadła. Wszystko wydaje się proste, aż do momentu gdy dochodzimy do 4 pomiaru. w tym momencie musimy :
    drugi pomiar postawić na miejsce pierwsze,
    trzeci pomiar na miejsce drugie
    i aktualny pomiar na miejsce trzecie.

    Generalnie przesuwany elementy tablicy w lewo.

    Jak coś takiego napisać?

    Tutaj fragment mojego dotychczasowego kodu:

    
    $regfile = "attiny2313.dat"                                 'ATTINY2313
    $crystal = 16000000                                         'Nasz kwarc to 16Mhz
    
    Config Lcd = 16 * 2                                         'Typ wyświetlacza
    
    Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.4 , Rs = Portd.5       'Ustawienia pinów wyświetlacza
    
    Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32            'Znak stopnia Celsjusza
    
    Config 1wire = Portb.0                                      'Wskazanie magistrali 1Wire
    Dim Temp As Integer , Napis As String * 6                   'Zmienne
    Dim Licznik As Integer
    Dim Pomiar(3) As Integer
    Dim Index_tab As Integer
    
    Cursor Off                                                  'Wyłączenie kursora na wyswietlaczu
    Cls                                                         'Wyczyszczenie wyświetlacza
    
    Pomiar(1) = 0
    Pomiar(2) = 0
    Pomiar(3) = 0
    
    Index_tab = 1
    Licznik = 0
    
    
    Do                                                          'Petla nieskonczona
    
    1wreset                                                     'Reset 1Wire
    1wwrite &HCC                                                'Komenda Skip ROM (poniewaz mamy podlaczony tylko jeden czujnik)
    1wwrite &H44                                                'Komenda konwersji temperatury
    
    Waitms 750                                                  'Trwa konwersja
    
    1wreset                                                     'Reset 1Wire
    1wwrite &HCC                                                'Komenda Skip ROM (poniewaz mamy podlaczony tylko jeden czujnik)
    1wwrite &HBE                                                'Odczyt (Read Scratchpad)
    
    Temp = 1wread(2)                                            'Odczyt 2 bajtów dotyczacych temp.)
    
       Temp = Temp * 10                                         'Konwersja do stopni Celsjusza
       Temp = Temp / 16
    
       Incr Licznik
    
    
    If Licznik = 1200 Then
    
    
       Pomiar(index_tab) = Temp
       Incr Index_tab
    
       Licznik = 0
    
    End If
    
    
    
    
       Napis = Str(temp)                                        'Napis = łańcuch znakow ze zmiennej temp.
       Napis = Format(napis , " 0.0") 'wstawienie Kropki W Formacie Wyświetlanej Temp. "
       Locate 1 , 1                                             'Ustaw kursor w 1 wierszu i 1 kolumnie wyświetlacza
       Lcd "  Temperatura:  " 'wypisz : Temperatura "
       Locate 2 , 1                                             'Ustaw kursor w 1 wierszu i 1 kolumnie wyświetlacza
       Lcd "     " ; Napis ; " " ; Chr(0) ; "C         "        'Wypisanie temperatury
    
    
    Loop                                                        'Koniec petli nieskonczonej
    
    End                                                         'Koniec
  • Pomocny post
    #2 7253543
    Paweł Es.
    VIP Zasłużony dla elektroda
    
    ' Na początku kodu
    
    Index_tab=0
    
    ......
    ......
    
    If Licznik = 1200 Then 
    
       IF Index_tab=3 Then   ' przesuniecie w tył jeżeli pozyskano co najmniej 3 pomiary
          Pomiar(1)=Pomiar(2)
          Pomiar(2)=Pomiar(3)
       Else
     ' Fragment kodu wykonywany dla Index_tab=0,1 i 2
    
          Incr Index_tab 
          IF Index_tab>3 Then Index_tab=3
     
       End If
    
    Pomiar(index_tab) = Temp  ' Zapis aktualnego pomiaru 
    
    Licznik = 0 
    
    End If 


    dodatkowo Index_tab=3 odblokowuje fragment kodu analizujacy spadki czy wzrosty
    temperatury

    Poza tym po co robić 1199 pustych odczytów o ile ich nie uśredniasz w czasie, nie lepiej robić 1 odczyt co 1200 sekund ?
  • #3 7255384
    Wersik
    Poziom 12  
    Dzięki!
    Dokładnie o coś takiego mi chodziło.

    @Paweł Es., pomiary są wykonywane co 750ms i na bieżąco wyświetlane na wyświetlaczu, dlatego dopiero co 1200 pomiar jest brany do porównania.

    Niestety nie mogę zapisywać 3 pomiarów i później ich porównywać ponieważ zabrakło pamięci Flash dla ATtiny2313. Muszę ograniczyć się do 2 pomiarów.

    Pojawił się kolejny problem z instrukcją warunkową.
    Poniższy fragment kodu ma za zadanie sprawdzenie, czy wartość pomiaru powiększonego bądź pomniejszonego o wartość 3 jest większa bądź mniejsza od kolejnego pomiaru :

    
    
    If Pomiar(1) + 3 < Pomiar(2) Then
    
       Status = Chr(1)
    
    Elseif Pomiar(1) - 3 > Pomiar(2) Then
    
       Status = Chr(2)
    
    Else
    
    Status = Chr(3)
    
    End If
    


    Kompilator wskazuje błąd :

    Error : 35 Line : 71 3 parameters expected
    Error : 35 Line : 79 3 patameters expected
    Error : 28 Line : 83 IF THEN expected
    Error : 28 Line : 83 IF THEN expected

    Oto cały kod programu :

    
    $regfile = "attiny2313.dat"                                 'ATTINY2313
    $crystal = 16000000                                         'Nasz kwarc to 16Mhz
    
    Config Lcd = 16 * 2                                         'Typ wyświetlacza
    
    Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.4 , Rs = Portd.5       'Ustawienia pinów wyświetlacza
    
    Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32            'Znak stopnia Celsjusza
    
    Config 1wire = Portb.0                                      'Wskazanie magistrali 1Wire
    Dim Temp As Integer , Napis As String * 6                   'Zmienne
    Dim Licznik As Integer
    Dim Pomiar(3) As Integer
    Dim Index_tab As Integer
    Dim Status As String * 6
    
    Deflcdchar 1 , 4 , 14 , 21 , 4 , 4 , 4 , 4 , 4              ' rosnie
    Deflcdchar 2 , 4 , 4 , 4 , 4 , 4 , 21 , 14 , 4              ' maleje
    Deflcdchar 3 , 32 , 32 , 4 , 2 , 31 , 2 , 4 , 32            ' stala
    
    Cursor Off                                                  'Wyłączenie kursora na wyswietlaczu
    Cls                                                         'Wyczyszczenie wyświetlacza
    
    Pomiar(1) = 0
    Pomiar(2) = 0
    
    Index_tab = 0
    Licznik = 0
    
    Status = Chr(4)
    
    Do                                                          'Petla nieskonczona
    
    1wreset                                                     'Reset 1Wire
    1wwrite &HCC                                                'Komenda Skip ROM (poniewaz mamy podlaczony tylko jeden czujnik)
    1wwrite &H44                                                'Komenda konwersji temperatury
    
    Waitms 750                                                  'Trwa konwersja
    
    1wreset                                                     'Reset 1Wire
    1wwrite &HCC                                                'Komenda Skip ROM (poniewaz mamy podlaczony tylko jeden czujnik)
    1wwrite &HBE                                                'Odczyt (Read Scratchpad)
    
    Temp = 1wread(2)                                            'Odczyt 2 bajtów dotyczacych temp.)
    
       Temp = Temp * 10                                         'Konwersja do stopni Celsjusza
       Temp = Temp / 16
    
       Incr Licznik
    
    
    If Licznik = 1200 Then
    
        If Index_tab = 2 Then
          Pomiar(1) = Pomiar(2)
    
        Else
    
       Incr Index_tab
       If Index_tab > 2 Then Index_tab = 2
    
       End If
    
    
       Pomiar(index_tab) = Temp
    
       Licznik = 0
    
    End If
    
    If Pomiar(1) + 3 < Pomiar(2) Then
    
       Status = Chr(1)
    
    Elseif Pomiar(1) - 3 > Pomiar(2) Then
    
       Status = Chr(2)
    
    Else
    
    Status = Chr(3)
    
    End If
    
       Napis = Str(temp)                                        'Napis = łańcuch znakow ze zmiennej temp.
       Napis = Format(napis , " 0.0") 'wstawienie Kropki W Formacie Wyświetlanej Temp. "
       Locate 1 , 1                                             'Ustaw kursor w 1 wierszu i 1 kolumnie wyświetlacza
       Lcd "  Temperatura:  " 'wypisz : Temperatura "
       Locate 2 , 1                                             'Ustaw kursor w 1 wierszu i 1 kolumnie wyświetlacza
       Lcd "     " ; Napis ; " " ; Chr(0) ; "C         "        'Wypisanie temperatury
    
       Locate 2 , 16
       Lcd Status
    
    Loop                                                        'Koniec petli nieskonczonej
    
    End                                                         'Koniec
    


    Domyślam się, że w instrukcji warunkowej nie można dokonywać operacji arytmetycznych, dlatego kompilator wskazuje błąd.

    Jak to poprawić?

    Pozdrawiam, Marek


    Edit:

    Problem rozwiązany:

    
    X = Pomiar(1) + 3
    Y = Pomiar(1) - 3
    
    
    
    
    If X < Pomiar(2) Then
    
       Status = Chr(1)
    
    Elseif Y > Pomiar(2) Then
    
       Status = Chr(2)
    
    Else
    
    Status = Chr(3)
    
REKLAMA