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

atmega8535: czytanie z uart,a pętla nieskończona

amnesiac 21 Paź 2008 20:10 1075 1
REKLAMA
  • #1 5655032
    amnesiac
    Poziom 10  
    witam, korzystam z atmega8535 i pisze na tym ukladzie zegar. Jednoczesnie musze komunikowac sie z ukladem za pomoca rs-232.
    moj kod wyglada mniej wiecej tak:
    
    
    ISR (SIG_OVERFLOW2) {
       //obliczanie wartosci ktore maja byc wyswietlone na wyswietlaczu
    }
    
    main(){
    //wlaczenie przerwan itp
    
    while(1){
    
    //zczytywanie stringow z uart
    //wyswietlanie wynikow obliczonych wczesniej na wyswietlaczu
          }
    }
    


    a teraz mój problem: wczytujac string przeslany z kompa na uklad zatrzymuje cala petle tzn wtedy nie mozliwe jest prawidlowe wyswietlanie wiadomosci na wyswietlaczu. wie moze ktos jak mozna to zrealizowac tak aby zczytywanie stringow bylo realizowane niejako w tle nie przeszkadzajac tym samym w wyswietlaniu wiadomosci na wyswietlaczu?
    dzieki z gory i pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 5656093
    Limonit
    Poziom 13  
    Może skorzystać z przerwania, które UART zgłosi, kiedy odbierze znak.
    Wtedy kod może wyglądac tak:

    
    
    ISR (SIG_OVERFLOW2) {
       //obliczanie wartosci ktore maja byc wyswietlone na wyswietlaczu
    }
    
    ISR (USART_RX_vect)
    {
    //operacje na odebranych danych
    }
    
    main(){
    //wlaczenie przerwan itp
    
    while(1){
    
    //wyswietlanie wynikow obliczonych wczesniej na wyswietlaczu
          }
    }
    


    Oczywiście może to kolidowac z przerwaniem "zegarowym". No ale wtedy to niestety - procesor nie może robić wszystkiego na raz.

    Może też nie ma potrzeby tak częstego odswiezania wyświetlacza i mozna to robić rzadziej. Mozna ten moment połączyć z jakąś czynnoscią, czyli odswieżac np po odebraniu znaku albo przy przerwaniu timera.
    Generalnie przerwanie odbioru znaku moze poczekać. Jeśli się nie mylę, po odebraniu zostaje ustawiony pewien znacznik. Jeśli np. jesteśmy w procedurze przerwania timera i nie obsługujemy go, to mamy sporą sznsę nie stracić znaku. Kolejny bedzie odbierany do bufora, a odebrany będzie czekał. Jeden znak to jest jakieś 10 bitów, zależy od predkości, ale to masa czasu. Jeśli to dobrze zaplanowac, to wyjdziemy z obsługi przerwania zegarowego i jeszcze odbierzemy znak, zanim przyjdzie następny w całości.
    Czekanie na odbiór znaku w pętli to spora strata czasu, policzmy np. przy szybkości procesora 1MHz i transmisji 2400bps, to mamy około 240 znaków na sekundę, czyli jeden znak to jakieś 4160us, czyli tyle cykli zegara procesora - parę tysięcy instrukcji. Można sporo zrobic.
REKLAMA