Rakentelu Foorumi
http://www.oh6hgn.net/foorumi/

RS232 keskeytysrutiini
http://www.oh6hgn.net/foorumi/viewtopic.php?f=2&t=63
Sivu 1/1

Kirjoittaja:  timok16 [ Ti Maalis 21, 2006 12:38 pm ]
Viestin otsikko:  RS232 keskeytysrutiini

moi,
käytän koodissani SIGNAL(SIG_UART_RECV) keskeytysrutiinia.
Koodi:
//Serial interrupt
SIGNAL(SIG_UART_RECV)
{
  unsigned char merkki;
   //lue merkki Datarekisteristä muuttujaan
     merkki = UDR;
  //Put_char(merkki);  //kutsu putchar-funktiota, argumenttina merkki
     switch (merkki) // select what to do ...
     {
     case CR: // Carriage return, go to line 2
     LINE2;
     break;
     case LF: // Line Feed, go to line 2
     LINE2;
     break;
     case FF: // Clear the display on a Form Feed (Ctrl L)
     LCD_CLEAR_HOME;
     break;
     default:
     putchar_lcd(merkki); // get a serial character and display it
     break;
       } //switch ends
}

Tarkoitus olisi saada 27 merkkiä pitkä merkkijono terminaaliohjelmasta lcd-näytölle, niin, että merkkijono jakaantuisi kolmeen lohkoon. Eka ja toka lohko 10 merkkiä pitkiä ja viimeinen lohko 7 merkkiä pitkä.
merkkijono olisi esim. 95e 1.247 98e 1.305 D 0.984.
jonon 10 ensimmäistä merkkiä tulisi lcd-näytön ensimmäiselle riville alkuun. 10 seuraavaa merkkiä toiselle riville alkuun. Ja loput 7 merkkiä vaikka ensimmäisen rivin 7 viimeistä merkkiä. Näyttöni on 16*2 lcd-näyttö. Kuinka tämä kannattaa tehdä keskeytysrutiinia käyttäen? Kun yritin tossa keskeytysrutiinissa käyttää silmukkaa ja taulukoa merkkien lukemiseen, niin ohjelma hukkasi merkkejä ja teki omaperäisiä lisämerkkejä.
Pollaamalla onnistuis jotenkin näin:
Koodi:
while(1) // do this forever...
  {
     unsigned char ch[18];
     for (int j=0;j<9;j++){
     for (int i=0;i<9;i++){
     ch[i] = Get_char(); // get a serial character
     putchar_lcd(ch[i]);
     } //i
     LINE2;
     ch[j] = Get_char(); // get a serial character
     putchar_lcd(ch[j]);
     }//j

Kirjoittaja:  PPi [ Ke Maalis 29, 2006 8:17 pm ]
Viestin otsikko: 

Moi,

Näin yleinen nyrkkisääntö keskeytysrutiinille on: älä tee siinä juuri mitään. Esimerkissäsi kirjoitat LCD-näytölle suoraan keskeytyksessä mikä saattaa viedä jo yksinään hyvin paljon aikaa. Lisää soppaan vaikka jokin silmukka ja saat juurikin kuvailemasi kaltaisia efektejä mm puuttuvia merkkejä. Tämä tietysti riippuu monesta asiasta, esimerkiksi UARTin nopeudesta sekä käytetystä kellotaajuudesta, näytön ohjauksesta ym ym..

Parempi tapa on lukea vastaanotettu merkki johonkin puskuriin (esimerkiksi taulukkoon) ja käsitellä tieto vasta itse pääohjelmassa. Tässäkin täytyy muistaa että tietoa täytyy ehtiä käsittelemään riittävän nopeasti tai ainakin varata puskurista riittävästi tilaa worst case -tilannetta varten.

Sivu 1/1 Kaikki ajat ovat UTC + 2 tuntia
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/