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

Uart dlaczego nie odbiera danych

granacik 15 Maj 2011 22:44 2178 16
REKLAMA
  • #1 9510482
    granacik
    Poziom 22  
    Witam w temacie AVR jestem bardzo początkujący więc proszę o wyrozumiałość.

    Chciałbym napisać program który po odebraniu sygnału po rs-232 steruje silniczkami dc (na L293D). Napisałem już inicjacje Uarta i wysyłanie danych z AVR do PC działa super (jest to najprostszy protokół bez buforów i sprawdzania poprawności danych. Jednak w żaden sposób nie mogę odebrać danych wysłanych z PC do AVR. Narazie testowo mam podłączone diody i robię to w pętli jednak docelowo stworzę przerwania. Procek na jakim się uczę to ATMEGA32.Poniżej załączam kod programu.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 9510547
    michalko12
    Specjalista - Mikrokontrolery
    #define LED1 (1<<PA4)

    PORTA &=~(1<<LED1);

    Widzisz błąd?
  • #3 9511310
    Lord_W
    Poziom 12  
    A co z F_CPU? nie widzę, żeby było zadeklarowane, chyba że w ustawieniach projektu wpisałeś.
  • #4 9512013
    mirekk36
    Poziom 42  
    Lord_W napisał:
    A co z F_CPU? nie widzę, żeby było zadeklarowane, chyba że w ustawieniach projektu wpisałeś.


    I bardzo dobrze , że nie zdeklarowane w pliku main.c. Widać, że autor albo korzysta ze środowiska, które automatycznie generuje makefile albo sam dodał do pliku makefile parametr -DF_CPU, dzięki czemu stała dostępna jest ładnie w całym projekcie.
  • #5 9512571
    Lord_W
    Poziom 12  
    mirekk36 napisał:

    I bardzo dobrze , że nie zdeklarowane w pliku main.c. Widać, że autor albo korzysta ze środowiska, które automatycznie generuje makefile albo sam dodał do pliku makefile parametr -DF_CPU, dzięki czemu stała dostępna jest ładnie w całym projekcie.


    A skąd to wiadomo? Bo nie wiem.
  • REKLAMA
  • #6 9512730
    mirekk36
    Poziom 42  
    Lord_W napisał:

    A skąd to wiadomo? Bo nie wiem.


    No tak mi się wydaje, ponieważ gdyby nie miał nigdzie zdefiniowanego F_CPU to w ogóle kompilacja nie przebiegłaby prawidłowo. A skoro nie było o tym mowy, wręcz wszystko wskazuje, że się kompiluje program - to dla mnie jednoznaczne jest, że F_CPU jest tak jak się należy zdefiniowane w makefile.
  • REKLAMA
  • #7 9513002
    Andrzej__S
    Poziom 28  
    mirekk36 napisał:

    A skoro nie było o tym mowy, wręcz wszystko wskazuje, że się kompiluje program - to dla mnie jednoznaczne jest, że F_CPU jest tak jak się należy zdefiniowane w makefile.

    Niekoniecznie musi tak być, ponieważ na początku programu jest #include <util/delay.h> , w którym jest:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    więc skompiluje się tak czy inaczej, a niestety nie wszyscy zwracają uwagę na warning'i, jak już niejednokrotnie można było się przekonać na tym forum :(
  • #8 9513025
    mirekk36
    Poziom 42  
    Andrzej__S --> no oczywiście, że masz 100% racji. Tylko właśnie założyłem, że kolega autor napisałby o warningach gdyby takie były. Tymczasem racja, że jak piszesz i widać to po postach na elektrodzie, jest wielu i to właśnie początkująych, którzy twierdzą z uporem, że "z warningami da się żyć" ;)
  • #9 9513259
    granacik
    Poziom 22  
    Widzę że mój post wzbudził zainteresowanie. F_CPU mam ustawione w środowisku 8mhz jak narazie wewnętrzny oscylator (używam eclipse) . Uczę się z dość ciekawej książki autorstwa M.Kardasia i wedle niej ścigam wszystkie warningi:) Michalko12 widzę już błąd i niedługo poprawie.
  • #10 9513375
    Andrzej__S
    Poziom 28  
    Jeszcze zauważyłem coś takiego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Czegoś tu chyba za dużo. Nie było warning'a?
  • REKLAMA
  • #11 9513713
    Fredy
    Poziom 27  
    Tu jest coś nie tak:

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



    powinno być :

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #12 9513796
    polprzewodnikowy
    Poziom 26  
    Fredy - A pomyśl sobie, co będzie jak wywołamy funkcję USART_Init z parametrem MYUBRR?
  • #13 9513857
    Fredy
    Poziom 27  
    masz rację - to zmęczenie.....Nie odróżniłem baud od BAUD
  • #14 9514069
    granacik
    Poziom 22  
    Zmagań ciąg dalszych:
    W pętli wpisałem samo przypisanie wartości uarta do zmiennej oraz komendę aby zaświecić diodę na PA4:

    while(1)
    {
    odebrano=odbior();
    PORTA &=~(1<<PA4);
    }

    W tym momencie program wisi w pętli i nie włącza diody, dopiero zwarcie RX z TX na procesorze pozwala programowi przejść dalej. Czy jest to wina sprzetowa? (wysyłanie do PC działa).
  • #15 9514402
    michalko12
    Specjalista - Mikrokontrolery
    Jak masz skonfigurowany port RS na PC? Głównie chodzi mi o kontrolę przepływu? Czy jest wyłączona?
  • #16 9520949
    granacik
    Poziom 22  
    w PC sterowanie przepływem mam wyłaczone
  • #17 9537567
    granacik
    Poziom 22  
    Witam
    Problem udało się rozwiązać. Przelutowałem jeszcze raz max232. W tej chwili avr odbiera dane (zwraca echem w celu sprawdzenia) a w zależności od wyniku zaświeca jedną z 4 diod.

    Jest to najprostsza komunikacja Uart dla atmega32 bez buforów i korekcji transmisji jednak dla moich celów w zupełności wystarczy. Dodatkowo wrzuciłem funkcję wysyłania łańcucha tekstu w ascii oraz liczby. Może się komuś przyda - temat zamykam.

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