Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Mega32: Probleme mit Datenausgabe über RS232 IRQ Kategorie: Programmierung C (von Hannes24 - 16.01.2017 10:04)
Als Antwort auf Re: Mega32: Probleme mit Datenausgabe über RS232 IRQ von Torsten - 15.01.2017 17:03
Ich nutze:
C-Control Pro Mega32, eigenes Board
> > Ich brauche eine möglichst schnelle Datenausgabe über die RS232.
> > Beim 1.Progr. mit IRQ funkt. die Datenausgabe nur mit Warteschleife. Das ist
> > unschön - kostet wertvolle Rechenzeit.
> > Kann man da noch was machen ?
> >
> >
> > Das 2. Programm ohne IRQ funktioniert.
> >
> >
> >
> >
> >
> > /*
> >     Datenausgabe über die RS232 mit IRQ
> >     Die Ausgabe funktioniert nur mit der Warteschleife nach Serial_WriteText
> >     Nach dem Übertragen muß das Programm mit einem Hardware Reset gestartet werden
> >
> > */
> >
> > byte buffer[SERIAL_BUF(25,20)];
> >
> > void main(void)
> > {
> >     char text1[20], text2[20];
> >     text1= "Hello World! ";
> >     text2= "1234567890 ";
> >     word counter;
> >
> >     // Init Schnittstelle mit xx baud, 8 Bit, 1 Stop Bit, keine Parität
> >     // 25 byte Empfangspuffer - 20 byte Sendepuffer
> >     Serial_Init_IRQ(0,buffer,25,20,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD38400);
> >
> >     while(1)
> >     {
> >         Serial_WriteText(0,text1);
> >         counter=400; while(counter--);      // Warteschleife ca. 5ms
> >         Serial_WriteText(0,text2);
> >         counter=400; while(counter--);      // Warteschleife ca. 5ms
> >        
> >
> >     }
> >
> >
> > }
> >
> > -------------------------------------------------------------------------------
> >
> > /*
> >     Datenausgabe über die RS232 ohne IRQ
> >
> > */
> >
> >
> > void main(void)
> > {
> >     char text1[20], text2[20];
> >     text1= "Hello World! ";
> >     text2= "1234567890 ";
> >
> >     Serial_Init(0,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD38400);
> >
> >     while(1)
> >     {
> >         Serial_WriteText(0,text1);
> >         Serial_WriteText(0,text2);
> >
> >     }
> >
> >
> > }
> >
> >
> >
>
>
> Hallo Hannes,
>
> Vielleicht lässt sich das mit einem Timerinterrupt lösen.
>
> Gruß Torsten
>
>
>
> /*** SendSerialFast.cc ***/
> //------------------------------------------------
>
>  #define BOOL byte
>
> //------------------------------------------------
>
>  byte gaby_buffer[SERIAL_BUF(25,20)];
>  char gac_text_1[20];
>  char gac_text_2[20];
>  BOOL gbo_state;
>  BOOL gbo_ready;
>
> //------------------------------------------------
>
>  void SendSerialValue(void)
>     {
>     int  i_irqcnt;
>
>     if(gbo_ready)
>         {
>         gbo_state = gbo_state ^ 0x01;
>
>         if(gbo_state)
>             Serial_WriteText(0, gac_text_1);
>         else
>             Serial_WriteText(0, gac_text_2);
>
>         gbo_ready = false;
>         }
>
>     i_irqcnt = Irq_GetCount(INT_TIM0COMP);
>     }
>
> //------------------------------------------------
>
>  void main(void)
>     {
>     word w_counter_1;
>     word w_counter_2;
>
>     gac_text_1 = "text 1 value: 00000";
>     gac_text_2 = "text 2 value: 00000";
>
> // Init Schnittstelle mit xx baud, 8 Bit, 1 Stop Bit, keine Parität
> // 25 byte Empfangspuffer - 20 byte Sendepuffer
>     Serial_Init_IRQ(
>         0,
>         gaby_buffer,
>         25,
>         20,
>         SR_8BIT | SR_1STOP | SR_NO_PAR,
>         SR_BD38400
>         );
>
> // Interrupt Routine definieren
>     Irq_SetVect(INT_TIM0COMP, SendSerialValue);
>
> // Zeit festlegen und Timer0 starten
>     Timer_T0Time(85, PS0_1024);
>
>     while(1)
>         {
>         if(gbo_ready)
>             continue;
>
>         if(gbo_state)
>             {
>             w_counter_2++;
>             Str_Printf(gac_text_2, "text 2 value: %5u", w_counter_2);
>             gbo_ready = true;
>             }
>         else
>             {
>             w_counter_1 = w_counter_1 + 10;
>             Str_Printf(gac_text_1, "text 1 value: %5u", w_counter_1);
>             gbo_ready = true;
>             }
>
>         }
>     }
>
> //------------------------------------------------
>




Hallo Torsten,

das Programm bringt im Prinzip nichts. Ich will ja nicht nur 2 Strings timerverzögert
ausgeben, sondern eine Vielzahl von Ausgaben in mehreren Funktionen machen.

Wie es scheint muss die Ausgabe eines Strings erst beendet sein, bevor der nächste
ausgegeben wird. Dazu müsste ich wissen, wann die Ausgabe abgeschlossen ist.
Mich würd auch interessieren, ob während der seriellen Ausgabe das Hauptprogramm weiter
abgearbeitet wird oder in der Zeit still steht. Im Manual steht dazu herzlich wenig.




    Antwort schreiben


Antworten:

Re: Mega32: Probleme mit Datenausgabe über RS232 IRQ (von Torsten - 16.01.2017 12:03)
    Re: Mega32: Probleme mit Datenausgabe über RS232 IRQ (von Hannes24 - 16.01.2017 13:56)