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.

Atmega8+FT232 - Sterowanie diodą LED z poziomu aplikacji C++

DaKKi 02 Lip 2013 03:05 2154 5
  • #1 02 Lip 2013 03:05
    DaKKi
    Poziom 16  

    Witam,
    Cały dzień męczę się z napisaniem prostego programu.
    Założenie - wysterowanie diody z poziomu aplikacji C++ dla windowsa.
    Polutowałem układ Atmega8 -> FT232 -> USB, z terminala sterowanie idzie mi całkiem nieźle - oprogramowanie Atmegi porównuję zmienną odebraną z UARTa z liczbą 2, jeżeli jest równa zapala się dioda - działa, niestety tylko dla wartości 0-9.
    Kiedy z terminala (używam Realterma przy okazji) wysyłam liczbę 10-255 coś się wysypuje i dioda się zapala, ale już nie można jej w żaden sposób zgasić.
    Próbowałem zmieniać typ zmiennej przechowującej stan odebranej wartości, ale nie udało mi się rozwiązać problemu...

    Wsad ATMega8:

    Kod: c
    Zaloguj się, aby zobaczyć kod




    Drugi problem dotyczy sterowania z aplikacji napisanej przez kogoś w C++ - aplikacja jest prosta i wysyła coś przez rs232...w żaden sposób nie mogę jednak dojść co...próbowałem konwertować to i wyświetlać na wyświetlaczu LCD, jednak nie udało mi się rozszyfrować co kryje się pod "0" i "1", bo wartości AASCI to raczej nie są. Tak samo nie mogę uzależnić od tych odebranych wartości stanu portu, proszę o pomoc - w jaki sposób wysyłać za pomocą niżej zamieszczonego programu znaki w postaci szesnastkowej ?


    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam !

    0 5
  • Pomocny post
    #2 02 Lip 2013 08:08
    mickpr
    Poziom 39  

    Popraw ten kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Drugie if jest niepotrzebne. Nawiasy '{}' też nie - jeśli masz tylko jedną instrukcję.
    Kod: c
    Zaloguj się, aby zobaczyć kod
    Czy nie wygląda to prościej?
    Podobny "bład" popełniasz w drugim programie (tym na PC).
    DaKKi napisał:
    aplikacja jest prosta i wysyła coś przez rs232...w żaden sposób nie mogę jednak dojść co...próbowałem konwertować to i wyświetlać na wyświetlaczu LCD, jednak nie udało mi się rozszyfrować co kryje się pod "0" i "1", bo wartości AASCI to raczej nie są.
    Writeline wpisuje linię - czyli string (wartości ASCII) + znaki końca wiersza (na Windows są to \r\n);
    Ty zaś odbierasz pojedynczy znak - dlatego ten cały misz-masz.
    Zauważ, że ostatni znak jaki zawsze odbierzesz po wysłaniu komunikatu z PC - to znak ASCII '\n'.
    DaKKi napisał:
    w jaki sposób wysyłać za pomocą niżej zamieszczonego programu znaki w postaci szesnastkowej
    Skonwertuj sobie zmienną do postaci HEX jakąś funkcją (int2hex). Otrzymany ciąg prześlij i odbierz z pomocą Atmegi.
    Pamiętaj o znakach końca wiersza!!!
    Jeśli chcesz wysyłać bez znaków końca wiersza - zamień
    Kod: c
    Zaloguj się, aby zobaczyć kod
    na
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeszcze jedno - jeśli znaki chcesz wysyłać w postaci binarnej to będzie to zupełnie coś innego - a być może tobie o to właśnie chodzi? Sprecyzuj proszę. :)

    0
  • #3 02 Lip 2013 08:22
    94075
    Użytkownik usunął konto  
  • #4 02 Lip 2013 08:35
    BlueDraco
    Specjalista - Mikrokontrolery

    I pomyśleć, że chodzi po prostu o:

    PORTC = (i == 2) << 5;

    ;)

    0
  • #5 02 Lip 2013 08:46
    94075
    Użytkownik usunął konto  
  • #6 02 Lip 2013 18:41
    DaKKi
    Poziom 16  

    mickpr napisał:
    Popraw ten kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Drugie if jest niepotrzebne. Nawiasy '{}' też nie - jeśli masz tylko jedną instrukcję.
    Kod: c
    Zaloguj się, aby zobaczyć kod
    Czy nie wygląda to prościej?
    Podobny "bład" popełniasz w drugim programie (tym na PC).
    DaKKi napisał:
    aplikacja jest prosta i wysyła coś przez rs232...w żaden sposób nie mogę jednak dojść co...próbowałem konwertować to i wyświetlać na wyświetlaczu LCD, jednak nie udało mi się rozszyfrować co kryje się pod "0" i "1", bo wartości AASCI to raczej nie są.
    Writeline wpisuje linię - czyli string (wartości ASCII) + znaki końca wiersza (na Windows są to \r\n);
    Ty zaś odbierasz pojedynczy znak - dlatego ten cały misz-masz.
    Zauważ, że ostatni znak jaki zawsze odbierzesz po wysłaniu komunikatu z PC - to znak ASCII '\n'.
    DaKKi napisał:
    w jaki sposób wysyłać za pomocą niżej zamieszczonego programu znaki w postaci szesnastkowej
    Skonwertuj sobie zmienną do postaci HEX jakąś funkcją (int2hex). Otrzymany ciąg prześlij i odbierz z pomocą Atmegi.
    Pamiętaj o znakach końca wiersza!!!
    Jeśli chcesz wysyłać bez znaków końca wiersza - zamień
    Kod: c
    Zaloguj się, aby zobaczyć kod
    na
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeszcze jedno - jeśli znaki chcesz wysyłać w postaci binarnej to będzie to zupełnie coś innego - a być może tobie o to właśnie chodzi? Sprecyzuj proszę. :)


    Dzięki, zamiana
    Kod: c
    Zaloguj się, aby zobaczyć kod
    na
    Kod: c
    Zaloguj się, aby zobaczyć kod
    rozwiązała problem - w programie odczytuje szesnastkowy kod AASCI wysłanego znaku .


    @up - od czegoś trzeba zacząć, na miganiu diodą nie poprzestanę rzecz jasna, imho komunikacja z Atmegą z poziomu aplikacji windowsowskich ma ogromny potencjał ;)

    Pozdro!

    0