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

ds1267 c avr - ds1267 zamiana kodu z bascom na C avr

novak512 07 Lis 2012 18:23 2577 10
REKLAMA
  • #1 11500765
    novak512
    Poziom 12  
    Witam.
    Próbuję uruchomić potencjometr cyfrowy - DS1267.
    Na elektrodzie znalazłem temat użytkownika bartods Link. Udało mu się sterować potencjometrem w języku bascom.
    Ja w swoim projekcie używam języka C dlatego staram się przetłumaczyć obsługę na ten właśnie język.

    Poniżej wklejam kod który już udało mi się przetłumaczyć, w zaznaczonych miejscach natrafiłem na problem i nie wiem jak sobie z tym poradzić.

    Prosiłbym o jakiekolwiek wskazówki.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    reasumując, mam problem z tymi liniami kodu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 11504221
    Krauser
    Poziom 26  
    Częstotliwość taktowania trzeba ustawić bo korzysta z niej _delay_ms()
    Zmienne:
    Byte - 1 bajt - uint8_t
    Word - 2 bajty - uint16_t
    Long - 4 bajty - uint32_t
    czytelniej:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 11518528
    novak512
    Poziom 12  
    Witam,
    Niestety coś jeszcze jest nie tak.
    Potencjometr jakby się uruchamia. Zaraz po uruchomieniu programu ustawia go w odpowiedniej pozycji by po chwili zmniejszyć rezystancję do 0. Wychodzi na to, że komunikacja już jest, natomiast coś działa nieprawidłowo.

    Wydaję mi się, że coś jest nie tak w pętli wysyłającej ("zamiennik" Shiftout).
    Prosiłbym o jakieś porady. Dodam, że uruchamiałem ten program w Bascomie wiec sprzętowo wszystko działa jak powinno.

    pozdrawiam

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #4 11518578
    michal.bedzin
    Poziom 15  
    Z tego co widzę to źle ustawiasz stan niski na pinach. Dla CLK_PIN najlepiej zrobić to na XOR bitwise ^= . Swoją drogą dobrze jest zajrzeć jednak do dokumentacji scalaka. Wyraźnie jest pokazane, że najpierw musi być ustalony stan na DQ i dopiero narastające zbocze CLK (fig. 9b). Dodatkowo zapominasz o bicie wskazującym który stack wybierasz. Na sam koniec - dane powinny być wysyłane od najmłodszego bitu a nie najstarszego.
  • #5 11538917
    novak512
    Poziom 12  
    Witam,
    Zdaję relację z aktualnych postepów i tego co udało mi się uruchomić.

    Załatwiłem sobie dostep do analizatora stanów logicznych (i jednocześnie postanowiłem sobie zbudować sobie coś podobnego bo jak się okazuje to cudowne narzędzie).

    Wstawiam zdjęcia 3 ramek. Z kodu oryginalnego napisanego w Bascomie, kodu przed i po poprawkach (już język C). Jedyne co zmieniłem względem kodu z 2 postów wyżej to dodałem opcję _delay(X); aby wydłużyć '0' logiczne na linii CLK.

    Dalej natomiast mam problem z samą transmisją na PIN DQ gdyż program nie wysyła kompletnie nic.

    Mógłbym prosić o drobna poradę jak rozwiązać ten problem?
    pozdrawiam

    ds1267 c avr - ds1267 zamiana kodu z bascom na C avr ds1267 c avr - ds1267 zamiana kodu z bascom na C avr ds1267 c avr - ds1267 zamiana kodu z bascom na C avr
  • REKLAMA
  • #6 11539084
    michal.bedzin
    Poziom 15  
    A nie widzisz że nie wystawiasz w ogóle danych na linię DQ ? I czy w ogóle masz zamiar zrobić to co Ci napisałem w poście wyżej?
  • #7 11539125
    novak512
    Poziom 12  
    michal.bedzin napisał:
    Z tego co widzę to źle ustawiasz stan niski na pinach. Dla CLK_PIN najlepiej zrobić to na XOR bitwise ^=


    Tak, to poprawiłem zaraz po Twojej wiadomości. Nie wiem czy dokładnie o to chodziło ale stan niski działa (wg mnie poprawnie).
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    michal.bedzin napisał:
    Swoją drogą dobrze jest zajrzeć jednak do dokumentacji scalaka. Wyraźnie jest pokazane, że najpierw musi być ustalony stan na DQ i dopiero narastające zbocze CLK (fig. 9b).


    Od tego zacząłem pracę z układem scalonym. Długo, długo przed tym, zanim poprosiłem o pomoc na forum.

    michal.bedzin napisał:
    Dodatkowo zapominasz o bicie wskazującym który stack wybierasz. Na sam koniec - dane powinny być wysyłane od najmłodszego bitu a nie najstarszego.


    Tak wiem o tym, najpierw chciałbym wysłać cokolwiek na PIN DQ (nawet jeśli te 17 bitów ma być wysłane ze złej strony, bez bitu Stack Select, itp.).

    Z tego co rozumiem z przebiegów czasowych oraz dokumentacji wychodzi że muszę wysyłać bit stack select, 8 bitów dla pot1 oraz 8 bitów dla pot0.

    Mam tylko problem z "wypchnięciem" tych 17 bitów na pin dq (nawet w złej kolejności, to chcę rozwiązać w drugiej kolejności, myślę że podejście nie jest najgorsze).

    pozdrawiam
  • #8 11539843
    michal.bedzin
    Poziom 15  
    Dokładnie tak powinno być. Najpierw Stack bit, potem Pot1 (od LSB do MSB) i na koniec Pot0 (ta sama kolejność).
    Jeżeli dalej masz taki kod jak powyżej to dalej będziesz miał źle wysyłane (nawet jeżeli coś dasz na DQ). Z Clk chodzi i to że najpierw musi Ci się pojawić zmienna na DQ, a następnie kombinować z narastającym zboczem zegara, poczekać chwilę, aż wystarczy na Setup Time (tobie to chyba nie grozi bo masz wolny kwarc, ale lepiej sprawdzić czy nie trzeba wstawić _delay_us(x) jakiegoś). Pokaż jeszcze raz cały kod. Nie widzę teraz jakie mogą być jeszcze błędy (powyżej pomyliłeś się np. PORD zamiast PORTD i nie wiem ile może być jeszcze literówek :P )
  • #9 11540001
    novak512
    Poziom 12  
    hehe no racja, akurat to wcześniej pisałem a nie kopiowałem z kodu ale nie wątpię że w kodzie się nie pomyliłem. ;)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    jak widać, niewiele zmieniłem w kodzie plus dodania _delaya oraz ustawienia zmiennej R,L jako stała wartość.

    Cały czas szukam rozwiązania, jak wysłać zmienną Send_volume (to właściwie taki wektor) na PORT DQ. Nie wiem w ogóle jak to zrealizować. ;/ Niby mógłbym mieć pętlę wykonująca się 17 razy (17 bitów bit po bicie), ale jak wtedy wybrać i wysłac tylko dany bit ze zmiennej Send_Volume? W Bascomie jest funkcja Shiftout czyli wysłanie jakiegoś tam ciągu bitowego. Jak to zrealizować w C?
  • Pomocny post
    #10 11540461
    michal.bedzin
    Poziom 15  
    A jednak są literówki :D
    I w sumie dzięki temu chyba znalazłem błąd, który rozwiąże całość. Sprawdzałeś 16 bit Send_volume a wcześniej przesuwasz Volume o 16 bitów (co oznacza, że bity jakie sprawdzasz są "0"). Warunek do sprawdzania czy DQ ma być 1/0 musi być
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Ja na twoim miejscu zrobiłbym w ogóle funkcję do której przekazywałbym jako argumenty wartości jakie chcę wysłać oraz który stack wybieram

    czyli coś tej maści:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Całość powinna działać (chociaż nie gwarantuję - pisałem na szybko "na kolanie" :P). Teoretycznie powinno także działać jak pousuwasz delay'e (bo potrzeba zmian chyba 20 MHz, żeby przestało działać), ale tak na wszelki wypadek lepiej je dać na początek. Można tą funkcję zoptymalizować jeszcze (tak jak mówię pisałem na szybko). Czyli zrobić coś takiego i wysyłać 17 razy jak w przykładzie powyżej
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zasada jest jedna - trzeba debugować kod po kolei - nie wszystko na raz. Zobaczyć czy ustawiania pinów jest OK, czy dobrze generuję Clock (czyli czy jest taki jak w dokumentacji, a nie jakiś impulsowy), itp...

    Tak BTW. Wracając do analizatora stanów logicznych, to fakt jest to super narzędzie do sprawdzania pracy, chociaż ja korzystam z własnego na FPGA.
  • #11 15030919
    eleminus
    Poziom 10  
    Odświeżę ponieważ mam ten sam problem.

    @novak512 Mógłbyś wstawić pełny kod, jeżeli jeszcze posiadasz?
REKLAMA