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

ATmega32 - Hyperterminal: brak reakcji na dane ASCII 0x31 i 0x32

mikroice90 17 Lis 2012 16:52 1551 11
REKLAMA
  • #1 11539848
    mikroice90
    Poziom 13  
    Witam, chciałbym prosić o pomoc w rozwiązaniu problemu. Korzystając z programu HyperTerminal wysyłam do uC cyfry 1 i 2, które mają odpowiednio kody ASCII 0x31 i 0x32. Odebranie "jedynki" powinno zapalić diodę podłączoną do portu PB.0 a odebranie "dwójki" powinno zapalić diodę podłączoną do portu PB.1. Z uwagi na to że żadna z diód nie zapalała się dodałem 3-ciego IFa, który sprawdza czy uC cokolwiek odbiera i wtedy zapala diodę PC.2. Ku mojemu zdziwieniu uC odsyła poprawne wartości które otrzymuje tzn. 1 i 2 ale nie wchodzi w żadnego z Ifów temu odpowiadających. Czy któs ma pomysł dlaczego?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 11540190
    Piotr Piechota
    Poziom 22  
    A jak zmienisz program tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to zapala właściwą diodę?
  • #3 11540249
    mikroice90
    Poziom 13  
    Tak zapala, ale wtedy instrukcja nadaj(49) nic nie robi. Tzn. nie widać efektów jej wykonania w HT
  • #4 11540366
    krru
    Poziom 33  
    Skąd wiesz, że program nie wchodzi w if-y? Jak masz podłączone diody? Może to problem z zapalaniem diod, a nie z serialem.
  • REKLAMA
  • #5 11540385
    spinlock
    Poziom 11  
    Może spróbuj zmienić typ zmiennej *odebrano* z uint8_t na char bo może to jest problem z rzutowanej zmiennej unsigned na signed.
  • #6 11540429
    mikroice90
    Poziom 13  
    Myślę, że całość przesyłana jest w postaci jakiejś ramki transmisyjnej, tylko nie wiem jakiego ona jest formatu. Diody mam podłączone w poprawny sposób. Udowadnia to choćby wejście w pierwszego ifa po ustawieniu "odebrano=49", wtedy świeci się dioda1 a przy odebrano=odbierz() zapala się dioda3, czyli tak jak instrukcje warunkowe przewidują.
  • REKLAMA
  • #7 11540852
    Piotr Piechota
    Poziom 22  
    Użyj innego programu terminalowego np. putty Coś mi się wydaje, że HT wysyła więcej niż jeden znak.
  • REKLAMA
  • #8 11541334
    krru
    Poziom 33  
    mikroice90 napisał:
    Tak zapala, ale wtedy instrukcja nadaj(49) nic nie robi. Tzn. nie widać efektów jej wykonania w HT


    Biorąc dodatkowo pod uwagę wszystkie poprzednie informacje, można przypuszczać, że masz źle ustawione parametry transmisji, skoro nadanie "1" nie daje takiego właśnie znaku na terminalu. Poprawne echo może brać się tego, że po prostu odsyłasz dokładnie to co odebrałeś. Na próbę spróbuj jakoś liczyć odebrane znaki albo daj pewne opóźnienie w pętli by odsyłać znaki pojedynczo. Jeśli np. odbierasz 8 razy za szybko to każdy zerowy bit odbierzeesz jako cały znak 0x00, i to potem odeślesz. Jeśli odstępy czasowe się nie zmienią PC odbierze echo poprawnie.
    Sygeruję najpierw ponadawać trochę z AVR i odbierać na PC. Tak będzie łatwiej sprawdzić zgodność parametrów.
  • #10 11546835
    mikroice90
    Poziom 13  
    To jest tylko sposób reprezentacji 0x31, tzn 49 tylko hexadecymalnie... więc nie ma różnicy czy zapiszę warunem odebrano == 49 czy odebrano = 0x31
  • #11 11546894
    Jacek Rutkowski
    Poziom 28  
    OK rozumiem sposób zapisu ale czy program obcina pozostałe znaki czy wykonuje się trzy razy na jeden znak i zostaje na 0xD?
  • #12 11549820
    mikroice90
    Poziom 13  
    Problemem okazał się źle ustawiony UBBRL, jego wartośc dla kwarcu 16Mhz powinna wynosić 103, a jak dla 8Mhz 51 to należałoby pamiętać o fuse bitach.
REKLAMA