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 13:56)
Als Antwort auf Re: Mega32: Probleme mit Datenausgabe über RS232 IRQ von Torsten - 16.01.2017 12:03

> >
> > 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.
> >
> >
> Hallo Hannes,
>
> im sogenannten "Interruptbetrieb" läuft das Hauptprogramm parallel
> zur seriellen Ausgabe weiter. Die Funktion "Serial_WriteText(0, gac_text_2);"
> kehrt sofort wieder zurück. Du musst deine Aufrufe synchronisieren.
> Eine Lösung für die Umsetzung sollte das obige Programm zeigen.
>
> Gruß Torsten



Du hast recht, während der Datenausgabe (alle 10ms in RTC) läuft das Hauptprogramm
(Port_ToggleBit(30))ungestört weiter. Sowas könnte man ins Manual schreiben !



// Testprogramm

#define LED1_Ein        Port_WriteBit(30,1)     // Port D.6
#define LED1_Aus        Port_WriteBit(30,0)

byte buffer[SERIAL_BUF(20,30)];
byte Stunde,Minute,Sekunde,cnt1_10ms,cnt2_10ms,n;
word counter;
char text1[30];

void main(void)
{
    text1= "Hallo Welt 012345 ";

    Port_DataDirBit(30,1);                      // Port D.6 auf Ausgang = LED1

    Serial_Init_IRQ(0,buffer,20,30,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD38400);

    Irq_SetVect(INT_TIM2COMP,INT_10ms);         // ISR RTC

       
    while(1)
    {
       
        Port_ToggleBit(30);                             // LED1 EIN-AUS
       
    }

}



//--------------------------------- Interrupt alle 10ms ----------------------------------
//
void INT_10ms(void)
{
    int irqcnt;
    RTC();                                      // Funktionsaufrauf: RTC
    irqcnt=Irq_GetCount(INT_TIM2COMP);          // Interrupt Request Counter
}

//-------------------------------------- Real-Time-Clock ---------------------------------
//
void RTC(void)                                      // Aufruf alle 10ms
{


    Serial_WriteText(0,text1);       // String seriell ausgeben; Dauer ca. 5ms

    cnt1_10ms++; cnt2_10ms++;

    if (cnt1_10ms==100)                             // jede Sekunde
    {

        Sekunde++;
        if (Sekunde==60)                            // jede Minute
        {
            Sekunde=0;
            Minute++;
            if (Minute==60)                         // jede Stunde
            {
                Minute=0;
                Stunde++;
                if (Stunde==24) Stunde=0;
            }
        }
        cnt1_10ms=0;

    }
}



SerialOUT.JPG:





    Antwort schreiben


Antworten: