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

[ATmega8] [ATmega8][C] - Konfiguracja portów i USART dla 8MHz, 19200 baudrate

Defozo 13 Sty 2013 19:11 1713 11
  • #1 11784247
    Defozo
    Poziom 17  
    Posty: 365
    Pomógł: 1
    Ocena: 22
    Witam, napisałem taki kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Służy on do sterowania silnikiem poprzez komendy odbierane z modułu BTM-222 przez USART.

    Problem w tym, że gdy wysyłam do mikrokontrolera komendę "q" to wszystko działa poprawnie, ale gdy po wysłaniu "q" wyślę "w", to żeby dać napięcie na portach PD6 i PB0 muszę tą komendę "w" wysłać dwukrotnie, bo inaczej silnik tylko staje.
    Nie wiem czemu tak się dzieje i co jest problemem?

    Proszę o pomoc,
    Defozo
  • #2 11784476
    Steryd3
    Poziom 33  
    Posty: 1641
    Pomógł: 241
    Ocena: 301
    Czy znaki 'q' i 'w' są wysyłane z jakąś przerwą czasową czy jeden za drugim? Spróbował bym zamienić SIGNAL na ISR. SIGNAL odblokowuje globalnie przerwania co sprawia, że jeżeli w tym czasie nadejdzie inne przerwanie to zostanie ono obsłużone( może się zdarzyć sytuacja, że podczas obsługi nadejścia znaku 'q' w jakimś momencie zostanie wykonane przerwanie od nadejścia znaku 'w' a potem dokończone od znaku 'q' i to może psuć szyki). To trzeba by sprawdzić.
  • #3 11784603
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Po pierwsze, jak zauważył Kolega powyżej, nie SIGNAL, a ISR. Z całą pewnością nie chcesz, żeby kolejne przerwanie UART przerywało to pierwsze.

    Po drugie - stare przysłowie pszczół - żadnego oczekiwania w obsłudze przerwania - wyrzuć transmisję "OK" z obsługi przerwania!
  • #4 11784701
    Defozo
    Poziom 17  
    Posty: 365
    Pomógł: 1
    Ocena: 22
    Steryd3 napisał:
    Czy znaki 'q' i 'w' są wysyłane z jakąś przerwą czasową czy jeden za drugim?

    Znaki 'q' i 'w' wysyłam manualnie z telefonu, więc są one wysyłane z pewnym odstępem czasowym.


    Steryd3 napisał:
    Spróbował bym zamienić SIGNAL na ISR.

    BlueDraco napisał:
    Po drugie - stare przysłowie pszczół - żadnego oczekiwania w obsłudze przerwania - wyrzuć transmisję "OK" z obsługi przerwania!

    Zrobiłem obie rzeczy i nadal jest tak samo jak było.

    Zauważyłem również, że sytuacja nie zawsze występuje.
    Gdy zaczynam szybko wysyłać raz 'q', raz 'w' to w pewnym momencie wszystko zaczyna działać tak jak należy!
  • #5 11784751
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    A tak z ciekawości, dlaczego nie napiszesz tego tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 11784823
    Defozo
    Poziom 17  
    Posty: 365
    Pomógł: 1
    Ocena: 22
    Steryd3 napisał:
    A ilość bitów stopu, bit parzystości...wszystko jest ok?? (teraz już strzelam) Co do pomysłu z instrukcją switch mojego poprzednika-jestem za (choć Twoja opcja też powinna działać).

    Komunikację testowałem już wielokrotnie, więc powinno być wszystko ok.
    Zastosowałem instrukcję switch i nadal to samo.
  • #8 11784863
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Możesz mieć subtelny błąd elektryczny, który powoduje przekłamania znaków. Jak dokładnie wygląda schemat? Jakie są poziomy napięć po obu stronach? Spróbuj odbijać zwrotnie odebrane znaki (wyjątkowo możesz to zrobić w przerwaniu jeśli będziesz wysyłał tylko jeden bajt).
  • #10 11785090
    Defozo
    Poziom 17  
    Posty: 365
    Pomógł: 1
    Ocena: 22
    Jest to dla mnie bardzo niezrozumiała sprawa, ponieważ jeśli po:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

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

    To wysyłając 'w' normalnie mam zwrotne echo w postaci 'w'.
    Więc dlaczego do licha mikrokontroler wykrywając 'w' nie ustawia poprawnie portów?
    Myślałem, że jest to kwestia tego, że nie jestem zawodowym programistą i myślałem, że sposób w jaki ustawiam porty jest niepoprawny, ale teraz widzę, że to jakaś grubsza sprawa!

    Oscyloskopu niestety nie posiadam. Mogę podłączyć mikrokontroler bezpośrednio do przejściówki USB<->USART TTL, ale skoro komunikacja przez BTM-222 wydaje się poprawna, to czy jest sens?
  • #11 11785127
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Kilka lat temu GCC potrafił właśnie tak skutecznie optymalizować switch i podobne konstrukcje na AVR. Spróbuj chwilowo wyłączyć optymalizację. Spróbuj też takiej magicznej sztuki - zastąp
    char w = UDR;
    przez
    char w;
    w = UDR;

    To czysta magia i nie ma to nic wspólnego ze standardami i zasadami języka, ale niekiedy niestety pomaga przy narowistych kompilatorach.
  • #12 11785151
    Defozo
    Poziom 17  
    Posty: 365
    Pomógł: 1
    Ocena: 22
    Ojej! Właśnie sprawdziłem porty ATmegi miernikiem i okazało się, że mikrokontroler poprawnie ustawia porty!
    Czyżby problem leżał po stronie L293D sterującego silnikami?
    Analizuję problem...

Podsumowanie tematu

✨ W dyskusji poruszono problem konfiguracji portów i USART w mikrokontrolerze ATmega8 przy użyciu C, przy prędkości 19200 baud. Użytkownik zauważył, że znaki 'q' i 'w' wysyłane z telefonu nie są poprawnie odbierane, co może być spowodowane przerwaniami w obsłudze USART. Uczestnicy sugerowali, aby używać ISR zamiast SIGNAL, unikać oczekiwania w obsłudze przerwania oraz sprawdzić poprawność ustawień portów. Zauważono również, że problem może leżeć w błędach elektrycznych lub w module L293D sterującym silnikami. Użytkownik testował komunikację i potwierdził, że porty są poprawnie ustawiane, co sugeruje, że problem może być bardziej złożony.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA