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

[BASCOM] [AT90S2313] - Woltomierz

Mortan1 14 Gru 2008 10:49 3997 13
  • #1 14 Gru 2008 10:49
    Mortan1
    Poziom 14  

    Witam
    Korzystając z płytki testowej kitu AVT3500 z procesorem AT90S2313 i przetwornikiem PCF8591 8 bitowym postanowiłem zbudować prosty woltomierz. Maksymalne mierzone napięcie 2,55V.

    Napisałem prosty program:

    Code:
    'mój pierwszy woltomierz z przetwornikiem 8bit
    
    Dim Odczyt As Byte


    Cls
    Cursor Off

    Do
    I2cstart                                                    'start magistrali I2C
    I2cwbyte 145                                                'wysyła adres odbiorczy
    I2crbyte Odczyt , Nack                                      'odczytaj jeden bajt do zmiennej
    I2cstop                                                     'koniec pracy I2c
    Lcd Odczyt
    Wait 1
    Cls
    Loop
    End



    Woltomierz działa nie do końca poprawnie. Choć po tak prostej konstrukcji wcale się nie spodziewałem, że będzie wszystko ok.
    Napięcie mierzone jest prawidłowo, jedynym minusem jest "dochodzenie" schodkowo do właściwego napięcia. Przykładowo:
    mierzę starą baterię, która ma 1,24V, przykładając ją do woltomierza najpierw jest 0,54V, 0,78V, 1,16V i dopiero 1,24V. Nie wiem co może być tego przyczyną :|

    Chyba nie chodzi o to polecenie wait :?:

    Proszę o pomoc.

    0 13
  • Arrow Multisolution Day
  • #3 14 Gru 2008 11:19
    Mortan1
    Poziom 14  

    Ale ja mam odczyt jednego napięcia, a nie trzech.
    Zmodyfikowałem trochę kod:

    Code:

    Do
    Cls
    Lcd "0:" ; Odczyt0
    Locate 1 , 8 : Lcd "1:" ; Odczyt1
    Lowerline : Lcd "2:" ; Odczyt2
    Locate 2 , 8 : Lcd "3:" ; Odczyt3
    I2cinit                                                     'umożliwia pracę szyny
    I2cstart                                                    'sygnał startu magistrali I2C
    I2cwbyte 144                                                'wyślij adres "odbiorczy" PCF8591
    I2cwbyte &B01000100
    I2cwbyte 255
    I2cstart
    I2cwbyte 145
    I2crbyte Odczyt0 , Ack                                      'z przetwornika do zmiennej Odczyt
    I2crbyte Odczyt1 , Ack
    I2crbyte Odczyt2 , Ack
    I2crbyte Odczyt3 , Nack
    I2cstop                                                     'sygnał stopu magistrali I2C
    Waitms 500
    Loop
    End


    Dodałem kondensator 100nF, aby wyeliminować jakieś dziwne zachowania, gdy dotykam drucików - pokazują się dziwne napięcia.

    Ale nadal to samo - dochodzenie schodkowe do własciwego napięcia.

    0
  • Arrow Multisolution Day
  • Pomocny post
    #4 14 Gru 2008 22:52
    wojtek2112
    Poziom 12  

    Witam .
    Z jaką częstotliwością pracuje twój mikroprocesor w tym układzie z PCF-em.

    0
  • #5 15 Gru 2008 09:41
    Mortan1
    Poziom 14  

    Częstotliwość: kwarc 4.000MHz
    Okres: 0,25us

    0
  • Pomocny post
    #6 15 Gru 2008 10:11
    PioTherm
    Poziom 15  

    Popatrz dobrze w dokumentację przetwornika.
    http://astro.temple.edu/~cvecchio/PCF8591_6.pdf

    Pierwszy program raczej nie miał prawa działać.
    Drugi już trochę lepiej ale też mam wątpliwości czy wystawiane rozkazy na magistralę I2C są poprawne dla tego układu.

    Dodatkowo zamieściłbyś schemat. Do czego masz podpięte nogi adresowe A0,A1,A2 układu ? Do masy ?

    pzdr.
    Piotrek

    0
  • #7 15 Gru 2008 10:45
    Mortan1
    Poziom 14  

    Schemat płytki:
    [BASCOM] [AT90S2313] - Woltomierz

    Czyli jak prawidłowo powinien wyglądać ten program?

    0
  • Pomocny post
    #8 15 Gru 2008 13:21
    PioTherm
    Poziom 15  

    Spróbuj czegoś takiego.

    I2cstart
    I2cwbyte 144
    I2cwbyte 0
    I2cstart
    I2cwbyte 145
    I2crbyte Odczyt , Nack
    I2cstop

    0
  • #9 20 Gru 2008 10:49
    Mortan1
    Poziom 14  

    Przepraszam, że nie odpisywałem, ale miałem strasznie przeładowany tydzień i nie znalazłem na to czasu.

    Zmodyfikowałem program wg. Twojej rady:

    Code:

    Dim Odczyt As Byte
    Do
    Cls
    I2cstart
    I2cwbyte 144
    I2cwbyte 0
    I2cstart
    I2cwbyte 145
    I2crbyte Odczyt , Nack
    I2cstop
    Lcd Odczyt
    Loop : End


    Jest to czego się spodziewałem, na wyświetlaczu nic nie widać. Non stop jest czyszczony i wpisywany, tak że nie ma czasu nawet na zobaczenie wyniku. Pod kontem dostrzegłem jakąś trójkę.

    0
  • Pomocny post
    #10 20 Gru 2008 10:59
    bogdan_p
    Poziom 39  

    wywal poza pętlę Do - Loop instrukcję czyszczącą wyświetlacz CLS , przed wyświetleniem wyniku dodaj instrukcji Locate

    0
  • #11 20 Gru 2008 15:19
    Mortan1
    Poziom 14  

    Cytat:
    wywal poza pętlę Do - Loop instrukcję czyszczącą wyświetlacz CLS , przed wyświetleniem wyniku dodaj instrukcji Locate

    Nie rozumiem, jak wywalę to wynik wyświetli się tylko raz...

    Może źle Cię zrozumiałem, mógłbyś zamieścić kod?

    0
  • Pomocny post
    #12 20 Gru 2008 15:54
    Balu
    Poziom 38  

    Nie prawda.
    To, że ekran nie jest wyczyszczony, nie znaczy, że nie możesz czegoś innego tam wyświetlić.

    Zrób jak radzi bogdan_p.

    0
  • #13 20 Gru 2008 16:23
    Mortan1
    Poziom 14  

    Rzeczywiście po napisaniu takiego kodu wszystko gra. Wynik pokazuje się natychmiast. Dodałem jeszcze kondensator 22pF, ponieważ przy braku podłączenia z mierzonym napięciem, na wyświetlaczu pojawiały się jakieś dziwne wartości między 0,01-0,03V. Teraz jest ciągle 0. Myślę, że napięcie i tak "dochodzi" ponieważ po odjęciu baterii z pomiędzy punktów I0 i masy widać mryganie i schodzenie do 0.
    Spróbuje wyświetlać wynik nie na wyświetlaczu LCD, a wysyłać po RS232 do laptopa...

    Code:

    Dim Odczyt As Byte
    Cls
    Do
    I2cstart
    I2cwbyte 144
    I2cwbyte 0
    I2cstart
    I2cwbyte 145
    I2crbyte Odczyt , Nack
    I2cstop
    Locate 1 , 1 : Lcd Odczyt
    Loop : End

    0
  • #14 20 Gru 2008 17:42
    wojtek2112
    Poziom 12  

    Witam.
    Ja używam takiego kodu i PCF pracuje poprawnie.

    Code:
    kod
    
    $regfile = "attiny2313.dat"
    $crystal = 4000000
     $baud = 9600
    $hwstack = 32
    $swstack = 8
    $framesize = 24
     Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
    Config Sda = Portd.6
    Config Scl = Portd.5
    Dim Wynik As Byte
    Cursor Off
     Cls
       Do
       I2cinit
       I2cstart
       I2cwbyte 145
       I2crbyte Wynik , Nack
       I2cstop
       Locate 1 , 1
       Lcd Wynik
       Waitms 500
       Loop
       End
     

    0