Rakentelu Foorumi

Qrolle, Elecraft, Atmel, Pic, LC-Meter, OBD2, Robotit, yms yms
Tänään on To Maalis 28, 2024 5:36 pm

Kaikki ajat ovat UTC + 2 tuntia




Aloita uusi ketju Vastaa viestiin  [ 2 viestiä ] 
Kirjoittaja Viesti
 Viestin otsikko: RS232 keskeytysrutiini
ViestiLähetetty: Ti Maalis 21, 2006 12:38 pm 
Poissa

Liittynyt: La Maalis 04, 2006 12:00 pm
Viestit: 1
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


Ylös
 Profiili  
 
 Viestin otsikko:
ViestiLähetetty: Ke Maalis 29, 2006 8:17 pm 
Poissa

Liittynyt: Pe Helmi 03, 2006 10:32 pm
Viestit: 6
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.


Ylös
 Profiili  
 
Näytä viestit ajalta:  Järjestä  
Aloita uusi ketju Vastaa viestiin  [ 2 viestiä ] 

Kaikki ajat ovat UTC + 2 tuntia


Paikallaolijat

Käyttäjiä lukemassa tätä aluetta: Ei rekisteröityneitä käyttäjiä ja 1 vierailijaa


Et voi kirjoittaa uusia viestejä
Et voi vastata viestiketjuihin
Et voi muokata omia viestejäsi
Et voi poistaa omia viestejäsi
Et voi lähettää liitetiedostoja.

Etsi tätä:
Hyppää:  
cron
Powered by phpBB® Forum Software © phpBB Group
Käännös, Lurttinen, www.phpbbsuomi.com