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][C] - Jak prawidłowo ustawić porty?

Defozo 13 Sty 2013 19:11 1371 11
  • #1 13 Sty 2013 19:11
    Defozo
    Poziom 17  

    Witam, napisałem taki kod:

    Kod: 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

    0 11
  • #2 13 Sty 2013 19:49
    Steryd3
    Poziom 31  

    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ć.

    0
  • #3 13 Sty 2013 20:08
    BlueDraco
    Specjalista - Mikrokontrolery

    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!

    0
  • #4 13 Sty 2013 20:23
    Defozo
    Poziom 17  

    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!

    0
  • #5 13 Sty 2013 20:31
    BlueDraco
    Specjalista - Mikrokontrolery

    A tak z ciekawości, dlaczego nie napiszesz tego tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #6 13 Sty 2013 20:36
    Steryd3
    Poziom 31  

    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ć).

    0
  • #7 13 Sty 2013 20:41
    Defozo
    Poziom 17  

    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.

    0
  • #8 13 Sty 2013 20:47
    BlueDraco
    Specjalista - Mikrokontrolery

    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).

    0
  • #9 13 Sty 2013 20:51
    Steryd3
    Poziom 31  

    Podejrzyj linie sygnałowe oscyloskopem lub/i jakimś programem terminalowym. Mało prawdopodobne ale może coś z sygnałem zegarowym.

    0
  • #10 13 Sty 2013 21:16
    Defozo
    Poziom 17  

    Jest to dla mnie bardzo niezrozumiała sprawa, ponieważ jeśli po:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dodam:
    Kod: 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?

    0
  • #11 13 Sty 2013 21:22
    BlueDraco
    Specjalista - Mikrokontrolery

    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.

    0
  • #12 13 Sty 2013 21:25
    Defozo
    Poziom 17  

    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...

    0