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

[ATmega8][bascom][i2c]czujnik ultradźwiękowy MOBOT- US V2

kielon23 02 Sie 2010 15:48 2885 6
REKLAMA
  • #1 8357497
    kielon23
    Poziom 10  
    Mam problem z komunikacją z czujnikiem MOBOT- US V2
    http://www.mobot.pl/download/Sonar_Mobot-us_V2.0_instrukcja.pdf
    za pośrednictwem interfejsu i2c z atmega8. Czujnik mam podłączony do zestawu uruchomieniowego zl2avr w ten sposób, ze piny scl i sda (port.c5 i port.c4) do czujnika(pin 7, pin 9 )przez rezystory 4k7, pin Reset czujnika na portc.3 atmegi. Zasilanie idzie oddzielnie. Czujnik zaczyna działać dokonuje pierwszego pomiaru (ustawia się) i czeka na polecenia.

    Przy podłączeniu linii sonaru sda i scl do mikrokontrolera według schematu:
    [ATmega8][bascom][i2c]czujnik ultradźwiękowy MOBOT- US V2

    czujnik nie pracuje poprawnie nie wiem czemu. Zapala się tylko dioda oznaczająca zasilanie, lecz jest bardzo przygaszona jakby czujnik nie dostawał odpowiedniego napięcia. Miernikiem sprawdzałem i na przewodach jest 5V.

    Kolejny problem to sterowanie. Posiłkując się na czym tylko da napisałem program do obsługi czujnika w bascomie, ale niestety nie działa. Jak ktoś zauważy jakiś błąd proszę o pomoc. Niżej załączam kod programu.



    
    $regfile = "m8def.dat"
    $crystal = 8000000
    $lib "i2c_twi.ibx"
    
    config lcd = 16*2
    config lcdpin= pin, db4= portb.3, db5=portb.2, db6=portb.1, db7=portb.0, e=portb.4, rs=portb.5
    
    sonar_r alias portc.3              'konfiguracja pinu do restartu sonaru
    sonar_adres_w alias &H01       'z danych katalogowych adres sonaru 
    
    dim sonar_odczyt as word       ' zmienna pod która przypisujemy pomiar z sonaru
    
    declare sub sonar_reset
    
    enable interrupts
    config scl=portc.5
    config sda=portc.4
    config twi = 100000
    
    i2cinit
    call sonar_reset
    do
    i2cstart
    i2cwbyte sonar_adres_w
    i2cwbyte &H10                     'wysłanie do sonaru 
    i2cwbyte &H02                     'polecenia wykonania pomiaru
    i2cstop
    waitms 30
    
    dim pomiar(2) as byte
    
    i2cstart
    i2cwbyte  sonar_adres_w
    i2cwbyte  &H20                        'polecenie odebrania pomiaru z sonaru (2bity)
    i2cstop
    
    i2cstart
    i2cwbyte sonar_adres_w            ' adres odczytania pomiaru
    i2crbyte pomiar(1)                    '1 bit pomiaru
    i2crbyte pomiar(2)                     '2 bit pomiaru
    i2cstop
    
    sonar_odczyt= makeint(pomiar(1), pomiar(2))      
    lcd sonar_odczyt
    loop
    
    sub sonar_reset
    sonar_r=0
    waitms 10
    sonar_r=1
    waitms 40
    end sub
    


    Wydaje mi się ze problem może tkwić w adresowaniu czujnika i adresu odbioru pomiaru. Oba ustawiam na takie same &H01, lecz nigdzie w dokumentacji nie znalazłem adresu zapisu do sonaru i odczytu z sonaru.[/img]
  • REKLAMA
  • #2 8357726
    Wojtek75
    Poziom 24  
    kielon23 napisał:
    Wydaje mi się ze problem może tkwić w adresowaniu czujnika i adresu odbioru pomiaru. Oba ustawiam na takie same &H01, lecz nigdzie w dokumentacji nie znalazłem adresu zapisu do sonaru i odczytu z sonaru.

    Na pierwszej stronie PDF'a masz napisane jak ustawić adres a na drugiej jak go ustalić.
  • REKLAMA
  • #3 8357760
    HIOB
    Poziom 17  
    Witam,

    Proponuje sprawdzić raz jeszcze wszystkie połączenia, sprawdzić czy masz zworkami ustawiony odpowiedni adres urządzenia (jeżeli wszystkie rozwarte to adres = 0x01) itp. Spróbuj też zmniejszyć prędkość transmisji.

    Sam program wygląda ok...

    Pozdrawiam,
    Piotr.
  • REKLAMA
  • #4 8357776
    kielon23
    Poziom 10  
    W polu adresowy nie mam nic zwartego, czyli adres sonaru jest 0x01 Połączenie sprawdzałem kilka razy na wszystkie możliwe sposoby i dalej nic ;/
  • #5 8358066
    HIOB
    Poziom 17  
    Witam,

    ...przecież nie sprawdzasz przerwania od zakończenia pomiaru, sygnalizowanego na linii "RDY".

    Proponuje zrobić coś takiego:

    
    $regfile = "m8def.dat" 
    $crystal = 8000000 
    $lib "i2c_twi.ibx" 
    
    config lcd = 16*2 
    config lcdpin= pin, db4= portb.3, db5=portb.2, db6=portb.1, db7=portb.0, e=portb.4, rs=portb.5 
    
    sonar_r alias portc.3              'konfiguracja pinu do restartu sonaru 
    sonar_adres_w alias &H01       'z danych katalogowych adres sonaru 
    
    dim sonar_odczyt as word       ' zmienna pod która przypisujemy pomiar z sonaru 
    
    declare sub sonar_reset 
    
    enable interrupts 
    config scl=portc.5 
    config sda=portc.4 
    config twi = 10000     [b]// zmniejsz częstotliwość[/b]
    
    i2cinit 
    call sonar_reset 
    do 
    i2cstart 
    i2cwbyte sonar_adres_w 
    i2cwbyte &H10                     'wysłanie do sonaru 
    i2cwbyte &H02                     'polecenia wykonania pomiaru 
    i2cstop 
    
    waitms 1000    [b]// 1 sekunda zwloki[/b]
    
    dim pomiar(2) as byte 
    
    i2cstart 
    i2cwbyte  sonar_adres_w 
    i2cwbyte  &H20                        'polecenie odebrania pomiaru z sonaru (2bity) 
    i2cstop 
    
    waitms 1000    [b]// 1 sekunda zwloki[/b]
    
    i2cstart 
    i2cwbyte sonar_adres_w            ' adres odczytania pomiaru 
    i2crbyte pomiar(1)                    '1 bit pomiaru 
    i2crbyte pomiar(2)                     '2 bit pomiaru 
    i2cstop 
    
    sonar_odczyt= makeint(pomiar(1), pomiar(2))      
    lcd sonar_odczyt 
    
    waitms 1000    // 1 sekunda zwloki
    loop 
    
    sub sonar_reset 
    sonar_r=0 
    waitms 10 
    sonar_r=1 
    waitms 40 
    end sub
    


    Jeżeli to zadziała to w miejsce 2 opóźnienia wstaw nieskończona pętlę, która zostanie przerwana jeżeli RDY = 1.

    Pozdrawiam,
    Piotr.
  • REKLAMA
  • #6 8407424
    kielon23
    Poziom 10  
    Problem z komunikacja rozwiązany, diabeł tkwił w adresowaniu i podłączeniu czujnika. Zmieniam mu parametry itp. Mam natomiast problem z odczytaniem pomiaru. Za każdym razem czujnik zwraca mi wartość 511 (maksymalny zakres pomiarowy). Nie wiem czy wina tkwi w instrukcji składania bitów makeint, która składa bit starszy i młodszy(LSB i MSB) w jedna dana typu word lub integer według zależności: x=(256*MSB)+LSB, czy gdzieś indziej. Kiedy wyświetlam sam stary i młodszy bit dostaje zawsze wartość równą 2,a po złożeniu 511.
    poniżej zamieszczam kod:
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    $lib "i2c_twi.ibx" 
    baude= 9600
    
    config sda=portc.4
    config scl=ports.5
    sonar_reset alias portc.3
    config twi= 100000
    i2cinit
    
    dim sonar_odczyt as word
    
    do
    i2cstart
    i2cwbyte &H02           'adres sonaru
    i2cwbyte &H10           'rozkaz wykonania pomiaru
    i2cwbyte &H02           
    i2cstop 
    
    waitms 30
    
    dim pomiar(2) as byte
    
    i2cstart
    i2cwbyte &H02      
    i2cwbyte &H20           ' rozkaz odczytu pomiaru
    i2cstop
    
    i2cstart
    i2cwbyte &H02
    i2crbyte  pomiar(1)     
    i2crbyte  pomiar(2)
    i2cstop
    
    sonar_odczyt= mateint(pomiar(2),pomiar(1))
    print sonar_odczyt
    loop
    
  • #7 8410816
    kielon23
    Poziom 10  
    Problem rozwiązany, wystarczyło zmienić adres z odczytu danych z 0x02 na 0x03. Teraz wszystko chodzi jak należy.
REKLAMA