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

[ATmega16][BASCOM] komunikacja z ADNS-2051

electroNICK 10 Gru 2008 19:37 1653 1
REKLAMA
  • #1 5842962
    electroNICK
    Poziom 14  
    Witam!! Potrzebuję odczytać zawartość rejestrów układu ADNS-2051 (sensor firmy Agilent z myszki optycznej). Komunikacja z układem odbywa się za pomocą linii SCLK i SDIO. W internecie znalazłem program do komunikacji z układem ADNS-2610 (układ bardzo podobny tylko inne adresy rejestrów). Program po lekkiej modyfikacji niestety nie chce się komunikować a ADNS-2051. Nie mogę odczytać ani zapisać żadnego rejestru. Docelowo program ma znajdować adres najjaśniejszego pixela za pomocą opcji pixel dump. Jestem raczej początkującym programistą więc proszę kogoś o sprawdzenie poniższego programu i wskazanie gdzie tkwi błąd. Poniżej zamieszczam link do datasheeta ADNS-2051.
    http://www.chem.duke.edu/~boris/datasheets/ADNS-2051%20optical%20mouse%20sensor.pdf

    $regfile = "m16def.dat"
    $crystal = 8000000
    
    
    Ddr_sck Alias Ddrd.6
    Ddr_sdio Alias Ddrd.7
    
    Port_sck Alias Portd.6
    Port_sdio Alias Portd.7
    Pin_sdio Alias Pind.7
    
    Declare Sub Adns2610_init()
    Declare Sub Adns2610_write_byte(byval Write_byte As Byte)
    Declare Function Adns2610_read_byte() As Byte
    Declare Sub Adns2610_write_operation(byval Address_byte As Byte , Byval Data_byte As Byte)
    Declare Function Adns2610_read_operation(byval Address_byte As Byte) As Byte
    Config Lcd = 16 * 2
    
    Call Adns2610_init()
    
    
    
    
    
    
    
    Dim Read_adress As Byte
    Dim Read_data As Byte
    
    
    Read_data = 0
    Read_adress = 0
    
    
    
    Cursor Off
    
    
    Do
    
    
       Read_data = Adns2610_read_operation(&H07)
    
       Lcd Read_data
       Waitms 200
       Cls
    
    
    
    Loop
    End
    
    
    Sub Adns2610_init:
    
       Ddr_sck = 1
       Ddr_sdio = 1
    
       Port_sck = 1
       Port_sdio = 1
    
       Call Adns2610_write_operation(&H00 , &H80)
       Call Adns2610_write_operation(&H00 , &H01)
    
    End Sub
    
    Sub Adns2610_write_byte(byval Write_byte As Byte)
    
       Local I As Byte
    
       Ddr_sdio = 1
    
       For I = 7 To 0 Step -1
    
          Port_sck = 0
    
          Port_sdio = Write_byte.i
    
          Waitus 1
    
          Port_sck = 1
    
          Waitus 1
    
       Next I
    
       Ddr_sdio = 0
       Port_sdio = 0
    
    End Sub
    
    Function Adns2610_read_byte() As Byte
    
       Local I As Byte
    
       Local Data_byte As Byte
    
       Waitus 250
    
       For I = 7 To 0 Step -1
    
          Port_sck = 0
    
          Waitus 1
    
          Port_sck = 1
    
          Data_byte.i = Pin_sdio
    
       Next I
    
       Adns2610_read_byte = Data_byte
    
    End Function
    
    Sub Adns2610_write_operation(byval Address_byte As Byte , Byval Data_byte As Byte)
    
       Address_byte = Address_byte Or &B10000000
    
       Call Adns2610_write_byte(address_byte)
       Call Adns2610_write_byte(data_byte)
    
    End Sub
    
    Function Adns2610_read_operation(byval Address_byte As Byte) As Byte
    
       Call Adns2610_write_byte(address_byte)
    
       Adns2610_read_operation = Adns2610_read_byte()
    
    End Function
  • REKLAMA
  • #2 5920708
    electroNICK
    Poziom 14  
    Czyżby nikt na elektrodzie nie potrafił mi pomóc?? ;) W końcu uruchomiłem ten program ( w zasadzie napisałem go od początku). Niestety znowu mam problem. Program zapisuje (chyba) poprawnie rejestr konfiguracyjny 0x0a (dioda myszki nie przechodzi w stan uśpienia). Ponadto poprawnie odczytuje zawartość rejestru najjaśniejszego pixela 0x07 i średniej wartości pixela 0x06. Nie mogę jednak uruchomić opcji pixel dump i odczytać obrazu z sensora. Po zapisaniu do rejestru konfiguracyjnego 0x0a wartości 00001001 w rejestrach danych 0x0c i 0x0d nic nie ma (0). Proszę o pomoc. Może tym razem ktoś podoła temu zadaniu? :)
    Poniżej kod programui polski datasheet do ADNS-2051 wraz z opisem komunikacji.
    http://www.konar.ict.pwr.wroc.pl/uploads/download/raporty/Kedzierski_Ostrowski.pdf



    $regfile = "m16def.dat"
    $crystal = 8000000
    
    
    Ddr_sck Alias Ddrd.7
    Ddr_sdio Alias Ddrd.6
    
    Port_sck Alias Portd.7
    Port_sdio Alias Portd.6
    Pin_sdio Alias Pind.6
    
    Declare Sub Zapisb                                          'podprogram zapisu bajtu
    Declare Sub Odczytb                                         'podprogram odczytu bajtu
    Declare Sub Zapis                                           'podprogram procedury zapisu
    Declare Sub Odczyt                                          'podprogram procedury odczytu
    Declare Sub Inicjalizacja                                   'inicjalizacja
    
    Dim A As Byte
    Dim Adres As Byte
    Dim Dana As Byte
    Dim Odczytana As Byte
    
    Dim Wart As Byte
    Dim Adrpix As Byte
    Config Lcd = 16 * 2
    Cls
    Lcd "Uruchamianie..."
    Call Inicjalizacja
    Wait 1
    
    
    Cursor Off
    
    Do
    Cls
    Adres = &B10001010                                          'zapis konfiguracji
    Dana = &B00000001
    
    Call Zapis
    Waitus 120
    
    Adres = &B10001010
    Dana = &B00001001                                           'uruchomienie trybu pixel dump
    
    Call Zapis
    Waitms 10
    
    
    Adres = &H0D                                                'odczyt wartości pixela adres 0x0D
    Call Odczyt
    Adrpix = Odczytana
    Lcd Adrpix
    
    Waitus 120                                                  'odczyt adresu pixela  adres 0x0C
    Adres = &H0C
    
    Call Odczyt
    Wart = Odczytana
    
    Lowerline
    Lcd Wart
    Waitms 100
    Cls
    
    Loop
    
    
    Sub Inicjalizacja                                           'inicjalizacja
    Ddr_sck = 1
    Ddr_sdio = 1
    
    Port_sck = 1
    Port_sdio = 1
    End Sub
    
    Sub Zapis                                                   'procedura zapisu
    A = Adres
    Call Zapisb
    A = Dana
    Call Zapisb
    End Sub
    
    
    
    
    Sub Odczyt                                                  'procedura odczytu
    A = Adres
    Call Zapisb
    Port_sdio = 1
    Port_sck = 1
    Call Odczytb
    
    End Sub
    
    
    
    Sub Zapisb                                                  'zapis bajtu A
    
    Ddr_sdio = 1
    Ddr_sck = 1
    
    Local I As Byte
    For I = 7 To 0 Step -1
    
          Port_sck = 1
    
          Port_sdio = A.i
    
          Waitus 1
    
          Port_sck = 0
    
          Waitus 1
    
       Next I
    
    
    
    End Sub
    
    
    Sub Odczytb                                                 'odczyt bajtu wartość w zmiennej odczytana
    
    
    Local I As Byte
    Waitus 120
    Ddr_sdio = 0
    Ddr_sck = 1
    For I = 7 To 0 Step -1
    
          Port_sck = 0
          Waitus 1
          Port_sck = 1
          Odczytana.i = Pin_sdio
    
       Next I
    
    Ddr_sdio = 1
    Port_sdio = 0
    End Sub
    
    End
REKLAMA