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

[C][Atmega16A][USART] - zliczanie trwania wysłanego sygnału

fadex 04 Sty 2013 23:19 1080 4
REKLAMA
  • #1 11742529
    fadex
    Poziom 9  
    Problem mój jest taki, chciałbym zrobić robota mobilnego sterowanego poprzez USART kablem RS232, w wyniku odebranego znaku ASCII robot ma za zadanie poruszać swoimi silnikami.

    Moim problem jest, iż chciałbym aby wysyłając sygnał jazdy np. do przodu znakiem np 'w', mikrokontroler zliczył mi czas trwania jazdy i wysłał z powrotem do PC.

    Probowałem różnymi metodami, ale nie mam pojecia jak, przykładowy, niedziający fragment kodu poniżej. Reszta działa ok, ale nie mam informacji zwrotnej o czasie jazdy.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 11742549
    mikroice90
    Poziom 13  
    gdzie w ogóle main tutaj?

    Dodano po 49 [sekundy]:

    Do zliczenia czasu powinieneś zastosować przerwanie timera.
  • REKLAMA
  • #3 11742657
    fadex
    Poziom 9  
    to tylko przykładowy fragment, nie mam zamiaru zamieszczać całego kodu, dodam że całość działa, a z góry ustalone pojedyncze znaki wysyła do PC bez problemu. Chodzi mi, że nie wiem czemu nie chce wysyłać po inkrementacji.

    Hmm przerwanie timera nie chce mi jakoś działać, ale popróbuję. Nie powinno się użyć jakiegoś TIMERA, który zmienną czasową przechowywałby w jakiejś zmiennej i ją wysyłać?? Tylko nie mam pojęcia jak coś takiego miałoby wyglądać :S
  • REKLAMA
  • #4 11742675
    mikroice90
    Poziom 13  
    Dodatkowo radziłbym korzystać z przerwania USART_RXC_vect niż z funkcji UART_Recieve(), ponieważ z własnego doświadczenia wiem że sprawia problemy. CO do timera, np. tutaj http://ppelczynski.swspiz.pl/userfiles/file/SW/sw4.pdf i oczywiście w datasheecie atmegi masz ustawienia timera i lekkie wprowadzenie w temat. Ogólnie możesz inicjować timer gdy zaczynasz liczyć czas i wywoływac przerwanie gdy kończysz a wewnątrz przerwania wyslanie wartości zmiennej licznikowej do PC i odpowiednie przeliczenie w stosunku do preskalera i stosowanego kwarcu.
  • #5 11746713
    fadex
    Poziom 9  
    Troche z innej beczki, jest możliwe wykonywanie dwóch warunków równolegle (np if), bo chyba to jest problemem w tym kodzie, że nie przeskakuje na drugi warunek, gdyż wykonywany jest jeszcze pierwszy.

    Co za tym idzie? mógłbym w warunku zliczać czas trwania sygnału, ale już nie byłbym w stanie przeskoczyć na np warunek skręcania silnikiem.

    A dokladniej mówiąc. Wykonując 2 pętle - 1 zliczająca czas trwania impulsu jazdy do przodu, chcąc przerwać warunek skrętem np. w prawo i wysłać impuls o trwaniu czasu skrętu, jednocześnie nie przerywając zliczania jazdy prostej. Co najwyżej wysłać czas kiedy doszło do skrętu + czas skrętu i dalsze liczenie jazdy prostej.

    Po co to wszysto?? Otóż chciałbym aby robot wysyłał informacje o trasie jaką przejechał, aby potem była możliwość jej odtworzenia, a to jest chyba najprostszy sposób.


    EDIT:
    Albo inaczej, jeśli 4 piny wyjścia atmegi są odpowiedzialne za skręcanie. Byłaby możliwość stworzenia 4 funkcji działjących niezależnie od wykonywanego programu?
    Każda by zliczała czas trwania jedynki na wyjściu = jazdy w danym kierunku. W przypadku przerwania, czyli chwili gdy inny pin wchodzi w stan 1, wysyłała by informacje o zebranym czasie + jeśli dany pin by nie został zgaszony od nowa rozpoczynała by zliczanie?? Miałby ktoś pojęcie jak to miałoby wyglądać??
REKLAMA