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

Flaga RXC1 - warunek na odebranie wszystkich bajtów

sandarak24 30 Maj 2012 11:26 3318 19
REKLAMA
  • #1 10948430
    sandarak24
    Poziom 12  
    Mam problem z użyciem Flagi RXC1, używam Atmegi128L, chciałbym mieć pewność że bufor odbiorczy USARTa1 jest pusty. Czytając notę katalogową, dowiedziałem się że flafa RXCn ustawiana jest na "1", gdy w buforze odbiorczym są dane, a na "0" gdy bufor jest pusty. Jednak chyba coś źle rozumuje bo użycie takiej pętli:

    
    
    	i=0;
    	while(RXC1!=0)
    	{
    		tablica[i]=uart_getc();
    		i++;
    	}
    



    Blokuje mi działanie programu, pętla ma działać tak, że dopóki flaga RXC1 jest różna od zera, to zawartość bufora odbiorczego ma trafiać do tablicy bajt po bajcie, a gdy warunek nie będzie spełniony to przejdzie dalej. Używam asynchronicznego UARTA.[
  • REKLAMA
  • #2 10948662
    Konto nie istnieje
    Konto nie istnieje  
  • #3 10948716
    sandarak24
    Poziom 12  
    Flagę RXC1 opisałem w poprzedniej wiadomości. Skoro są 2 UARTy w At128 więc ta flaga powinna sie tyczyć UARTa1. Ja chce mieć pewność, że mam pusty bufor odbiorczy, przed wysłaniem rozkazu do urządzenia, by później odebrać jedynie jego odpowiedź bez żadnych śmieci.
  • #4 10948735
    stanleysts
    Poziom 27  
    Jak wygląda wnętrze tej funkcji: uart_getc()
  • #5 10948804
    sandarak24
    Poziom 12  
    Z książki P. Kardasia

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #6 10948845
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #7 10948880
    sandarak24
    Poziom 12  
    Nie bardzo chyba sie rozumiemy RXC1 to jest 7 bit rejestru UCSR1A patrz strona 362 noty katalogowej.
  • #8 10948905
    stanleysts
    Poziom 27  
    No może i jest tam bit o takiej nazwie, ale co on znaczy u ciebie w kodzie, podaj jego definicję?

    Jeśli jest tak jak mówisz: "Nie bardzo chyba sie rozumiemy RXC1 to jest 7 bit rejestru UCSR1A patrz strona 362 noty katalogowej. "

    to ja bym stawiał ze ten kod powinien wyglądać mniej więcej, choć nie widziałem nigdy biblioteki tego procesora i nie wiem jak tam wygladają poprawne nazwy tych rejestrów:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #9 10948909
    Konto nie istnieje
    Konto nie istnieje  
  • #10 10950215
    sandarak24
    Poziom 12  
    Jest opisany kod do czyszczenia:

    
    void USART_Flush( void )
    {
       unsigned char dummy;
       while ( UCSRA & (1<<RXC) ) dummy = UDR;
    }
    


    rozumiem, że on będzie przepisywał wartość UDR do dummy, aż do wyczyszczenia bufora i wyzeruje flagę i wyjdzie z pętli. Problem w tym, że nie bardzo chce to działać.
  • Pomocny post
    #11 10950250
    stanleysts
    Poziom 27  
    Nie bardzo to znaczy jak?
  • #12 10951157
    krru
    Poziom 33  
    sandarak24 napisał:
    Flagę RXC1 opisałem w poprzedniej wiadomości. Skoro są 2 UARTy w At128 więc ta flaga powinna sie tyczyć UARTa1. Ja chce mieć pewność, że mam pusty bufor odbiorczy, przed wysłaniem rozkazu do urządzenia, by później odebrać jedynie jego odpowiedź bez żadnych śmieci.


    Obawiam się, że to jest zła metoda. Pusty bufor wcale nie znaczy, że to drugie urządzenie skończyło nadawanie odpowiedzi.
  • #13 10951711
    sandarak24
    Poziom 12  
    Rzeczywiście ta metoda, nie pomoże, okazuje się że właśnie wcale nie ma pewności że bufor odbiorczy jest pusty po użyciu flush. Zastanawiam się czy może sprawdzanie w jakiś sposób RXC w pętli w przerwaniu by nie pomogło.
  • REKLAMA
  • #14 10951930
    LordBlick
    VIP Zasłużony dla elektroda
    Proponuję odebrać większą porcję bajtów i sprawdzić, czy wśród nich nie ma przypadkiem poszukiwanej sekwencji.
  • #15 10951938
    sandarak24
    Poziom 12  
    Poszukiwana sekwencja pojawia sie cyklicznie, ale dopiero po tym jak urządzenie po włączeniu troche popracuje(moduł gsm wysyła kilka komunikatów przy starcie), a ja bym chciał właśnie wyeliminować ten fakt.
  • #16 10951949
    LordBlick
    VIP Zasłużony dla elektroda
    A czy praca twojego urządzenia polega na biernym odczytywaniu, czy też masz możliwość wysłania do tego modułu GSM requesta ponawiającego wysłanie odpowiedzi ? W końcu zawsze mogą się pojawić zakłócenia w transmisji...
  • #17 10952093
    sandarak24
    Poziom 12  
    Komunikacja polega na wysłaniu komendy AT do GSM i odebraniu odpowiedzi, więc można mu dowolną ilość razy wysyłać komendę.
  • Pomocny post
    #18 10952124
    LordBlick
    VIP Zasłużony dla elektroda
    No to w czym problem ? Po wysłaniu requesta ustawiasz odliczanie czasu na okres po którym na pewno będzie odpowiedź i analizujesz to co przyszło pod kątem pożądanej zawartości... Czasem może się zdarzyć jakiś bajcik lub dwa z przodu i/lub z tyłu i trzeba to wyciąć w odpowiedniej procedurce.
    Ogólnie trzeba sobie dzielić zadania programistyczne na różne poziomy abstrakcji.
  • #19 10955363
    sandarak24
    Poziom 12  
    Udało mi się to teraz zrobić tak jak koledzy doradzają. Mam jeszcze pytanie jak sie będzie zachowywał uP w przypadku gdy będę chciał użyć bufora cyklicznego podczas przerwania wywoływanego np zboczem narastającym. Wydaję mi się że przerwanie od USARTA kłóci się z przerwaniem od zbocza narastającego, ponieważ nie chce działać poprawnie.
  • #20 10955400
    LordBlick
    VIP Zasłużony dla elektroda
    sandarak24 napisał:
    Wydaję mi się że przerwanie od USARTA kłóci się z przerwaniem od zbocza narastającego, ponieważ nie chce działać poprawnie.
    Z własnego doświadczenia (100 egzemplarzy działającego urządzenia) muszę przyznać rację, wydaje Ci się ;)
    Problem jest w oprogramowaniu, chyba, że masz zakłócone sygnały i/lub zasilanie µC.
    1. Przerwanie od RXC jest do pobrania tylko jednego bajtu do bufora własnej konstrukcji i wypad.
    2. To zboczone przerwanie to zorganizuj tak, aby w nim długo procesor nie siedział - może ustawić jakąś flagę dla pętli głównej.
REKLAMA