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

[BASCOM] [AT90S2313] - Woltomierz

Mortan1 14 Gru 2008 10:49 4213 13
REKLAMA
  • #1 5856650
    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:
    '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.
  • REKLAMA
  • #3 5856735
    Mortan1
    Poziom 14  
    Ale ja mam odczyt jednego napięcia, a nie trzech.
    Zmodyfikowałem trochę kod:
    
    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.
  • REKLAMA
  • Pomocny post
    #4 5860397
    wojtek2112
    Poziom 13  
    Witam .
    Z jaką częstotliwością pracuje twój mikroprocesor w tym układzie z PCF-em.
  • #5 5861193
    Mortan1
    Poziom 14  
    Częstotliwość: kwarc 4.000MHz
    Okres: 0,25us
  • Pomocny post
    #6 5861270
    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
  • REKLAMA
  • #7 5861353
    Mortan1
    Poziom 14  
    Schemat płytki:
    [BASCOM] [AT90S2313] - Woltomierz

    Czyli jak prawidłowo powinien wyglądać ten program?
  • Pomocny post
    #8 5861649
    PioTherm
    Poziom 15  
    Spróbuj czegoś takiego.

    I2cstart
    I2cwbyte 144
    I2cwbyte 0
    I2cstart
    I2cwbyte 145
    I2crbyte Odczyt , Nack
    I2cstop
  • #9 5880549
    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:
    
    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ę.
  • Pomocny post
    #10 5880566
    bogdan_p
    Poziom 39  
    wywal poza pętlę Do - Loop instrukcję czyszczącą wyświetlacz CLS , przed wyświetleniem wyniku dodaj instrukcji Locate
  • #11 5881442
    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?
  • REKLAMA
  • #13 5881674
    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...

    
    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
    
  • #14 5881973
    wojtek2112
    Poziom 13  
    Witam.
    Ja używam takiego kodu i PCF pracuje poprawnie.
    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
      
REKLAMA