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.

[ATMEGA32][C] USART - Odbieranie danych w przerwaniu

A.T. 12 Maj 2012 23:39 1517 5
  • #1 12 Maj 2012 23:39
    A.T.
    Poziom 20  

    Witam
    czy może ktoś spojrzeć na ten prosty kod i powiedzieć gdzie tkwi problem. Gdy wysyłam jakiś znak z klawiatury przez Hyper-Terminal, to procesor ma go od razu zwrócić, a on zwraca jakieś dziwne znaczki. Dodam, że w obsłudze przerwania występuje takie ostrzeżenie przy kompilacji: "usart.c:60: warning: passing argument 1 of 'USART_puts' makes pointer from integer without a cast".
    Tylko nie wiem o co w nim chodzi, wszystkie typy zmiennych się zgadzają.
    Pozdrawiam
    A.T.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 5
  • #2 13 Maj 2012 00:43
    stanleysts
    Poziom 27  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #3 13 Maj 2012 00:45
    kiziu13
    Poziom 16  

    Zakładając, że konfiguracja USARTa jest w porządku, to problemem są typy. Próbujesz użyć funkcji wysyłającej ciąg znaków do wysłania pojedynczego znaku. Opcje masz dwie: w przerwaniu odbierzesz znak, wpiszesz go do to tablicy o minimum 2 elementach (drugi element to null character) i podasz do funkcji _puts (BTW nazwa pochodzi od PUT String), albo skorzystasz z funkcji _transmit, która wysyła tylko jeden znak.

    EDIT: co do odpowiedzi użytkownika stanleysts, to oczywiście masz rację, ale tak na prawdę to nic to nie zmienia w kodzie i nic nie rozwiązuje, bo oczywiście chodzi o inkrementację wskaźnika, a nie inkrementację wartości, która jest w tym wypadku bezsensowna.

    0
  • #5 13 Maj 2012 06:59
    krru
    Poziom 32  

    A.T. napisał:
    Dodam, że w obsłudze przerwania występuje takie ostrzeżenie przy kompilacji: "usart.c:60: warning: passing argument 1 of 'USART_puts' makes pointer from integer without a cast".
    Tylko nie wiem o co w nim chodzi, wszystkie typy zmiennych się zgadzają.


    Nieprawda, podajesz char tam gdzie powinno być char *.

    Ale po prostu wołasz złą funkcję. W przerwaniu od odbiornika wołaj USART_transmit
    zamiast USART_puts. Ta funkcja właśnie robi to, co potrzebujesz.

    0
  • #6 13 Maj 2012 09:16
    A.T.
    Poziom 20  

    Nie wiem czy mi uwierzycie ale na samym początku spróbowałem USART_Transmit, tak samo rozumowałem, że wysyłam tylko 1 znak, ale wyskakiwało identyczne ostrzeżenie. Próbowałem to na win XP na chyba starszej wersji WinAvr. Teraz spróbowałem z USART_Transmit na najnowszym WinAvr na Win7 64 bit. I nie ma żadnego ostrzeżenia. Czy to mogło być powodem. Do układu program wgram za 2h, dopiero wtedy będę miał pod ręką układ.
    Dziękuję
    Pozdrawiam

    0