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

[Atmega16][C] - sterownik kamery sterowany po UART

wojgore 28 Kwi 2014 12:19 1365 8
  • #1 28 Kwi 2014 12:19
    wojgore
    Poziom 9  

    Witam,
    męczę się już dłuższy czas nad oprogramowaniem sterownika własnej roboty do kamery. Kamera przyjmuje komendy po protokole VISCA.
    Baud rate 9600; 8 bit słowo; parity none; 1 bit stopu.

    Napisałem program wysyłający odpowiednią komendę po wciśnięciu odpowiedniego przycisku, ale reakcji kamery nie było żadnej, więc postanowiłem podłączyć się pod komputer i sprawdzić co tak właściwie ten mój sterownik wysyła. Podpiąłem MAX232 pod sterownik. Odpaliłem Tera term i okazało się, że po wciśnięciu przycisku sterownik wysyła jakieś dane (nie bardzo te co chcę) po czym wysyła "00" w nieskończoność.

    Na sterowniku korzystam z kwarcu zewnętrznego 11.0592 MHz.

    Fuse bity to:
    l : EE
    h: D9

    Oto kod:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    i
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    PD0 - Rx
    PD1 - Tx
    PD2 - TE
    PD3 - RE

    Reszta portu D + port C i cześć portu A to przyciski.

    Byłbym wdzięczny za pomysły, bo moje wyczerpały się już jakiś czas temu.

    0 8
  • Pomocny post
    #2 28 Kwi 2014 13:12
    BlueDraco
    Specjalista - Mikrokontrolery

    Masz błędnie napisane procedury transmisji - bit TXC ma stałą wartość 1, więc nie czekasz an wysłanie znaku.

    W jakim celu wymyślasz własny błędny kod do transmisji bajtów, skoro w manualu Atmela masz gotowy poprawny:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Zamiast czterech napisz jedną procedurę z drugim parametrem - długością łańcucha.

    0
  • #3 28 Kwi 2014 13:43
    wojgore
    Poziom 9  

    No ok.
    Poprawiłem na tak:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Efekt: "00" do nieskończoności ustało, ale dalej wysyła nie to co trzeba.
    Na terminalu otrzymałem: "38 B5 E0 23 A1 55 4F 3B C3 65 73 0B F9 FD 87 85 6F 67 57 5D B5 3D 59 69 81 87 E1 00" zamiast 0x81, 0x01, 0x04, 0x07, 0x36, 0xFF.

    Dodatkowo zauważyłem, że nie działa moja blokada wciśnięcia przycisku (mimo, że w debugerze wszystko wyglądało, że działa ok). Po wciśnięciu przycisku wysyła non stop (z przerwą na delaya).

    0
  • #4 28 Kwi 2014 16:13
    BlueDraco
    Specjalista - Mikrokontrolery

    Czy w konfiguracji uC ustawiłeś taktowanie z zewnętrznego kwarcu?

    Z fragmentu programu, który pokazałeś, nie wynika, co ma być nadawane.

    Zacznij od przyrządzenia programu, który np. co sekundę wysyła stały ciąg. Kiedy to zadziała, poczytaj o drganiach styków i zabierz się za obsługę przycisków.

    0
  • #5 29 Kwi 2014 10:21
    wojgore
    Poziom 9  

    Zacząłem sprawdzanie od początku.
    Zwarłem Tx i Rx zaraz za kompem i już tu okazało się, że złączka od COMa jest felerna (wziałem ją z jakiegoś programatora, okazało się, że ma jakieś rezystory i tranzystor między liniami).
    Wymieniłem złączkę.
    Echo za kompem zadziałało.
    Zwarłem Tx i Rx za MAXem.
    Echo za MAXem zadziałało.
    Podpiąłem sterownik.
    Wysłałem pojedynczy znak po wciśnięciu przycisku.
    Zadziałało.
    Wysłałem ciąg.
    Przestało działać. Wysłałem tabelkę:
    prog_char zoom_wide1[]={0x81, 0x01, 0x04, 0x07, 0x36, 0xFF};
    za pomocą funkcji

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    a dostałem: 8F 28 F9 CC EB 41 35 DC E2 9E CD C6 7A 83 01 BC BD 48 CC 50 D1 A5 61 D3 4B 3F 3C 0F

    Odpowiadając na wcześniejsze pytanie. Ustawiłem fuse bity na
    l : EE
    h: D9
    co dla ATMegi16 jest ustawieniem dla zewnętrznego kryształu wysokiej częstotliwości, 0ms start upu.

    P.S.
    Ustawienia rejestrów zostały tak jak w pierwszym poście

    0
  • #6 29 Kwi 2014 12:14
    BlueDraco
    Specjalista - Mikrokontrolery

    Dane do wysłania masz w pamięci Flash zakończone bajtem 0xFF. Porcedura uart_send() wysyła łańcuch z RAM zakończony zerem.

    0
  • #7 29 Kwi 2014 12:23
    wojgore
    Poziom 9  

    W międzyczasie po zmienieniu funkcji wysyłu tablicy na jedną konkretną tablicę doszedłem do efektu, że odstaje już 6 bajtów tak jak chcę zamiast tego ciurka. Ale dalej nie są to te, które chcę wysłać.

    Jakiś pomysł jak to można rozgryźć?

    0
  • #8 29 Kwi 2014 17:16
    BlueDraco
    Specjalista - Mikrokontrolery

    Wróżka nie widząc kodu zgaduje, że wciąż wysyłasz dane z pamięci RAM, a nie z pamięci Flash, w której są one zapisane - typ prog_char w definicji danych i zwykły char w procedurze.

    0
  • #9 30 Kwi 2014 09:46
    wojgore
    Poziom 9  

    Ostatecznie zrobiłem to dość łopatologicznie.
    Funkcje wysyłu wyglądają teraz tak:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Główny problem rozwiązany. Reszta już powinna jakoś ruszyć

    0