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

[AT89C2051][bascom] funkcja Format jej brak

13 Lut 2012 18:51 1842 5
  • Poziom 10  
    Witam

    pomoże ktoś?? próbuję skompilować program w bascom 8051 dla AT89C2051 i 2x ds18b20 i zatrzymuje się na formacie tekstu
    ( Cc = Format(cc , " 0.0") )

    format jest niezbędny i muszę go zrobić fusing odpada

    w bascom 8051 nie ma takiej opcji?? bo w avr działa mi to świetnie ale mam aż 35 sztuk 89c2051 i szkoda mi dawać do termometru AVR kiedy tamte leżą w pudełku i się marnują.

    dla I1 (1 -wszy czujnik) zrobiłem format przez rozdzielenie zmiennej cc ale nie działa to tak jak bym chciał ://

    zamieszczam kod :


    Code:
    $regfile = "89C2051.dat"
    
    $large
    $crystal = 14000000
    $baud = 4800

    '###############################################################################
    T1 Alias P3.3
    T2 Alias P3.5

    Config Lcd = 16 * 2
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db4 = P1.3 , Db5 = P1.4 , Db6 = P1.2 , Db7 = P1.5 , E = P1.7 , Rs = P1.6

    Dim I1 As Integer
    Dim I2 As Integer

    Dim I11 As Integer
    Dim I22 As Integer

    Dim Cc As String * 6
    Dim A As String * 2
    Dim Aa As String * 2

    Dim Zewmin As Integer
    Dim Zewmax As Integer
    Dim Wewmin As Integer
    Dim Wewmax As Integer


    Deflcdchar 0 , 8 , 20 , 8 , 32 , 3 , 4 , 4 , 3                ' znak stopnia celciusza
    Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32
    Deflcdchar 2 , 32 , 6 , 8 , 16 , 16 , 16 , 8 , 6

    Zewmin = 125 * 16
    Wewmin = 125 * 16
    Zewmax = -55 * 16
    Wewmax = -55 * 16

    Cursor Off
    Cls
    '###############################################################################

    Locate 1 , 1
    Lcd "  Termometr BY"
    Waitms 500
    Locate 2 , 1
    Lcd "   STANLEY :)"
    Wait 1

    '###############################################################################

    Do
    1wreset T1
    1wwrite &HCC T1
    1wwrite &HBE T1
    I1 = 1wread(2 , P3.3)

    1wreset T1
    1wwrite &HCC T1
    1wwrite &H44 T1
    Waitms 500

    '###############################################################################

    1wreset T2
    1wwrite &HCC T2
    1wwrite &HBE T2
    I2 = 1wread(2 , P3.5)

    1wreset T2
    1wwrite &HCC T2
    1wwrite &H44 T2
    Waitms 500
    Cls
    '###############################################################################
    I1 = I1 * 10
    I1 = I1 / 16

    If I1 >= I11 Then
    I11 = I1
    End If



    If I1 >= 100 Then
    Cc = Str(i1)
    A = Left(cc , 2)
    Aa = Right(cc , 1)
    Locate 1 , 1
    Lcd "W Pokoju: " ; A ; "," ; Aa ; Chr(1) ; Chr(2)
    End If



    If I1 < 100 Then
    Cc = Str(i1)
    A = Left(cc , 1)
    Aa = Right(cc , 1)
    Locate 1 , 1
    Lcd "W Pokoju: " ; A ; "," ; Aa ; Chr(1) ; Chr(2)
    End If



    I11 = I1
    '###############################################################################

    I2 = I2 * 10
    I2 = I2 / 16

    If I2 >= I22 Then
    I22 = I2
    End If

    Cc = Str(i2)
    Cc = Format(cc , " 0.0")
    Locate 2 , 1
    Lcd "Na Polu : " ; Cc



    I22 = I2
    '###############################################################################


      If I1 < Zewmin Then Zewmin = I1
      If I1 > Zewmax Then Zewmax = I1
      If I2 < Wewmin Then Wewmin = I2
      If I2 > Wewmax Then Wewmax = I2

    '###############################################################################
    Loop


    Pozdrawiam
  • Pomocny post
    Poziom 6  
    Witam

    Kolego Unreal89. Pracuję pod Bascomem 8051 i nie spotkałem się z funkcją, o której wspominasz. Przejrzałem pliki help'a i tam również nic nie znalazłem.

    Zainteresowany jestem z jakiego powodu odpada komenda "fusing"? Dla czego pytam? Pozwolę sobie obszerniej skomentować zaprezentowany listing.

    1. Termometr DS18B20 przechowuje informacje o temperaturze w formacie "16-bit sign-extended two's complement". Nie wiem jak precyzyjnie to przetłumaczyć, więc pozostaję przy nazwie angielskiej. Oznacza to, że odczyt jest 16 bitowy ze znakiem. Wybór zmiennej typu integer do odczytu jest trafny. Wczytuje się to na dwa razy (transfer po 8 bitów idzie), najprościej funkcjami Low i High. Później wystarczy zmienną typu single = odczyt_w_integerze / 16 i jest dokładna temperatura, później fusing i wyświetlenie na lcd. Nie potrzeba żadnej innej konwersji.

    2. Pragnę zwrócić uwagę, że najpierw warto zainicjować konwersję temperatury a dopiero po odpowiednim czasie zmierzoną temperaturę odczytać. Dla pełnej, 12-bitowej rozdzielczości termometru 18B20 konwersja trwa około 750ms, więc dla oszczędności kodu i czasu można to zrobić tak: zainicjować pomiar czujnika 1, zainicjować pomiar czujnika 2, poczekać 1sek, odczytać wyniki, przekształcić, wyświetlić i od nowa.

    Mam nadzieję, że to pomogło.

    Pozdrawiam
    Marek
  • Pomocny post
    Moderator na urlopie...
    Ad 2. magistrala 1wire pozwala na wysyłanie komendy do wszystkich podpiętych urządzeń z pominięciem adresowania - wtedy 1 komendą mamy zlecone dokonanie pomiaru przez wszystkie czujniki.

    Co do problemu - możesz wykorzystać arytmetykę stałopozycyjną i ręcznie dokonywać konwersji.
  • Poziom 10  
    Witam

    co do tej funkcji format to faktycznie nie ma w 8051 w AVR już jest

    zrobiłem za pomocą instrukcji fusing i działa

    w każdym razie dzięki za odpowiedzi być może jakiś user początkujący wykorzysta te informacje w swoim projekcie

    Pozdrawiam.
  • Poziom 6  
    Kolega Piotrva ma rację. Jest możliwa jednoczesne wydanie polecenia konwersji temperatury wszystkim podłączonym do jednej linii termometrom. W tym konkretnym przykładzie jednak to nie zadziała, gdyż kolega Unreal89 zdecydował się na podłączenie dwóch czujników oddzielnie do dwóch różnych nóżek procesora.

    O ile - faktycznie - dla dwóch termometrów na jednej linii oszczędza się czas przy globalnym poleceniu konwersji temperatury, to jednak już sam odczyt wartości temperatury wymaga dokładnego zaadresowania konkretnego czujnika. A to z kolei implikuje konieczność wczytania na początku działania programu 64-o bitowych numerów seryjnych termometrów gdzieś do EEPROMU albo innej formy pamięci podręcznej, by móc nimi operować przy odczycie. Jest to procedura wymagająca prawidłowego napisania a jednocześnie zjada cenne bajty pamięci programu, o ramie nie wspominając. Do domowego - jak mniemam - zastosowania znacznie prostszym i skuteczniejszym rozwiązaniem jest podłączenie termometrów na dwóch niezależnych szynach danych.

    Jeszcze jedna uwaga odnośnie napięcia zasilania czujników. Nie ma moim zdaniem sensu oszczędzać na kablu - szczególnie, że zalecane jest stosowanie klasycznej skrętki - i warto podłączyć czujniki na tzw. magistrali 2-wire. Czyli masa, sygnał danych i + zasilania. W tym trybie termometry pracują stabilniej i nieco szybciej. Cechują się również większą dokładnością w skrajnych zakresach temperatur. W przypadku połączenia jedynie dwuprzewodowego należy podłączyć nóżkę zasilającą czujnika do nóżki masy a tuż po wydaniu komendy konwersji temperatury natychmiast należy ustawić stan wysoki na nóżce procesora, która odpowiada za komunikację 1-Wire - w ten sposób zapewnia się zasilanie dla termometru na czas konwersji, który pobiera zasilanie z chwilowo nieużywanej linii transmisyjnej.

    Pozdrowienia
    Marek
  • Moderator na urlopie...
    Eeetam, to wcale nie taki problem z adresowaniem, choć w pewnych przypadkach użycie kilku linii ma zalety - np jednoznaczna identyfikacja czujników, ale nie jest to wcale prostsze czy trudniejsze.
    Co do zasilania to prowadząc 3 przewody można prowadzić dłuższe kable niż przy zasilaniu pasozytniczym.