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

AtMega 128 źle odczytuje,wysyła :(

dlugiiii 03 Maj 2011 21:59 1695 26
  • #1 9467072
    dlugiiii
    Poziom 13  
    Próba polega na tym ,że wysyłam z jednego UARTa i chcę odebrać na drugim UARcie tego samego procesora(AtMega 128 posiada dwa).Problem w tym,że wysyła chyba dobrze (na oscyloskopie widoczne dobre wykresy),a jak odebieram to źle zapisuje.Oczywiście połączyłem Tx UART 0 z Rx UART 1 przewodem.
    Przy okazji chce wykorzystać przerwanie po odebraniu wszystkich bitów na UDR to do jakiego przerwania mam się odnieść ? Przejrzałem w pliku atmegi i dokumentacji ,ale nie znalazłem nic na temat przerwań UARTa (oprócz o RXCIE i TXCIE do którego nie wiem jak się odnieść)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 9467112
    skalsky5000
    Poziom 21  
    UCSR1B = (1<<TXEN1) | (1<<RXEN1);
    powinno być:
    UCSR1B| = (1<<TXEN1) | (1<<RXEN1);
    to samo z:
    UCSR0B| = (1<<TXEN0) | (1<<RXEN0);
  • #3 9467535
    dlugiiii
    Poziom 13  
    To nie to .Jak odczytuję na połączonym nadajnik-odbiornik mam wartość 0xA0 za każdym razem nie zależnie co wysyłam.Kiedy rozłączę zworę zwraca mi 0x00 .
  • #4 9467584
    tadzik85
    Poziom 38  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    co to za twór?
  • #5 9469266
    dlugiiii
    Poziom 13  
    TXC "znacznik ten jest ustawiany("1") w chwili,gdy cała nadawana dana zostanie wysunięta z nadawczego rejestru przesuwającego i nie ma nowej zapisanej w rejestrze UDR"
    Dlatego dałem taki warunek,aby czekał na zakończenie transmisji .
  • #6 9469343
    tadzik85
    Poziom 38  
    no to ty sie zastanów co utworzyłeś. Bo czym jest TXC0 to wiadomo ale ten warunek w while jest po prostu ZŁY. Ta pętla zostanie pominięta przez kompilator.

    a błąd masz tu :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 9470152
    dlugiiii
    Poziom 13  
    To jest linijka przepisana z noty katalogowej ATmegi 128 .Nie jestem dobry w programowaniu i chciałbym uzyskać pomoc :)
  • #8 9470162
    piotrva
    VIP Zasłużony dla elektroda
    tadzik85 napisał:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    co to za twór?

    ale TXC0 to tylko identyfikator zawierający numerek bitu w rejestrze!
    musisz z jego pomocom wyciągnąć dopiero wartość bitu z odpowiedniego rejestru, bo ta pętla będzie (z tego co wiem) zawsze niespełniona
  • #9 9470201
    dlugiiii
    Poziom 13  
    A w jaki sposób mam wyciągnąć tą wartość lub jak ma wyglądać gotowy kod ?:( Siedzę od wczoraj i dalej nie działa.... Już nie mówię o przerwaniu po odebraniu danych :/
  • Pomocny post
    #10 9470281
    tadzik85
    Poziom 38  
    Tak te funkcje powinny wyglądać:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Kod: text
    Zaloguj się, aby zobaczyć kod


    A twoimi błędami było:
    Pominięcie średnika co próbowałem ci wskazać ostatnio oraz błędnie utworzony warunek w pętli.

    Zanim skorzystasz z gotowca zastanów się jakie błędy popełniłeś by nie popełnić ich więcej.
  • #11 9470349
    dlugiiii
    Poziom 13  
    Wielkie dzięki .Faktycznie głupi błąd ,ale tak to jest kiedy program piszesz w nocy :( W pdf oczywiście też błąd ! Teraz rozumie o co chodziło z odpowiednim odczytaniem bitu :)

    A przy okazji (bo też nie działa ,a nie chcę tworzyć nowego wątku :/) potrzebuje zareagować po odebraniu danych na np UART0 i do tego jest przerwanie .Czy taka postać jest poprawna ??

    #include <avr/interrupt.h>
    
    sei();
    
    ISR(USART0_RX_vect)
    {
    //coś tam
    }
  • #13 9470395
    dlugiiii
    Poziom 13  
    właśnie z tej strony posiadam ,ale nie wiem z którego rzędu tabelki wpisuje się :roll:
  • #14 9470422
    dondu
    Moderator na urlopie...
    dlugiiii napisał:
    właśnie z tej strony posiadam ,ale nie wiem z którego rzędu tabelki wpisuje się :roll:

    Ciebie interesują wszystkie kolumny oprócz drugiej (Old vector name)
    Szukasz w kolumnie Description i Applicable for device i odczytujesz odpowiadający mu wektor z kolumny Vector name.
  • #15 9470438
    janbernat
    Poziom 38  
    Tak- tylko to coś tam powinno być krótkie.
    Mało tego- od momentu gdy zaczynasz używać tego przerwania niepotrzebna staje się funkcja odbioru znaków- wystarczy w przerwaniu odczytać UDR0 i gdzieś zapisać- do jakiegoś bufora.
    No i jest to rozwiązanie nieblokujące przebiegu programu.
    Bo "podręcznikowe" rozwiązanie tadzik85 musi działać- ale co będzie gdy do procesora nic nie wysyłasz i wywołasz tę funkcję z pętlą while oczekującą na odbiór?
  • #16 9470734
    dlugiiii
    Poziom 13  
    Ogólnie to mam czytać po RS z modułu GPS, jakieś czujniki (pierdoły z wejść procesora) i zapis na kartę.Przerwanie potrzebuje ,bo GPS nadaje co 1 sekundę i miałbym taktowanie zapisu. Tylko jeszcze muszę znaleźć specyfikację odbiornika GPS motoroli
  • #17 9474574
    dlugiiii
    Poziom 13  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tyle wystukałem.Przez godzinę miałem problem ,bo nie działał mi ten kod .Wystarczyło zrestartować AVRstudio :/ Czy z przerwania mogę zwrócić daną do głównego programu (jako dana globalna) ??
  • #18 9474623
    tadzik85
    Poziom 38  
    Kod w znacznikach syntax się umieszcza i czytać to ty chyba nie umiesz tego co się do ciebie pisze co?
  • #20 9474691
    dlugiiii
    Poziom 13  
    Wybaczcie za moje błędy,ale często nie piszę tutaj postów :D Dzięki i wszystko działa jak powinno :lol:
  • #21 9474806
    tadzik85
    Poziom 38  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    nie czytasz co się do ciebie pisze!!
  • #22 9475053
    dlugiiii
    Poziom 13  
    tadzik85 napisał:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    nie czytasz co się do ciebie pisze!!


    Przecież mam tak zapisane u siebie :?::idea:
  • #23 9475200
    tadzik85
    Poziom 38  
    janbernat napisał:
    Tak- tylko to coś tam powinno być krótkie.
    Mało tego- od momentu gdy zaczynasz używać tego przerwania niepotrzebna staje się funkcja odbioru znaków- wystarczy w przerwaniu odczytać UDR0 i gdzieś zapisać- do jakiegoś bufora.
    No i jest to rozwiązanie nieblokujące przebiegu programu.
    Bo "podręcznikowe" rozwiązanie tadzik85 musi działać- ale co będzie gdy do procesora nic nie wysyłasz i wywołasz tę funkcję z pętlą while oczekującą na odbiór?


    przeczytaj uważnie
  • #24 9475224
    janbernat
    Poziom 38  
    W zasadzie dlugiiii chyba robisz w tym przerwaniu "masło maślane".
    To chyba będzie działać bo kasowanie flagi przerwania następuje po obsłudze ale rozumiem irytację tadzik85.
    Mnie taki kod też nieco irytuje.
  • #25 9475264
    dlugiiii
    Poziom 13  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tylko tyle zapisać w przerwaniu ,a resztę w programie głównym ??
  • #26 9475360
    tadzik85
    Poziom 38  
    Właśnie. I myślę, że należy odesłać cię do lektury. Ten temat był już wielokrotnie wałkowany, a my tu prowadzimy cie za rączkę nawet nie wiem dlaczego. Poczytaj, zobacz jak to było już robione.
  • #27 9475365
    janbernat
    Poziom 38  
    No, nareszcie- "powoli doszedł chłop do dzieci".
    "dana" jest oczywiście volatile.
    Podobnie można zrobić to przy wysyłaniu- oczywiście nie jest to konieczne.
    Poza tym bufor- i odczytywać w głównej pętli kiedy trzeba.
    Bufor jest tu:
    http://atnel.pl/wydawnictwo
    I wiele innych gotowców.
REKLAMA