Forum: Mikrocontroller und Digitale Elektronik PIC 32 Werte aus UART Interrupt in main() bringen


von Raph (Gast)


Lesenswert?

Hallo Zusammen

PIC 32 ich versuche aus der Interrupt Routine wenn Daten am UART Part 
sind
the "Chars" in mein main loop zu bekommen ....
Ich habs mit einem globalen volatile unsigned char MM_STRING[];
versucht auf die die Interrupt Routine und Funktionen im Hauptprogramm 
zu greifen könnnen ... aber irgendwie funktioniert das nicht ... Ideen ?

Gruß

RL

von Frank M. (frank_m35)


Lesenswert?

Quellcode?

von Raph (Gast)


Lesenswert?

if (UARTReceivedDataIsAvailable(XBEE_MODULE_ID))

    {
                 int out_loop=0;
                 while (out_loop < 9) ///
                {


                    MM_STRING[out_loop] = 
UARTGetDataByte(XBEE_MODULE_ID);
                     xbee_putchar(MM_STRING[out_loop]);

                     //  XBEE (MM_STRING[out_loop],out_loop);
                    //  XBEE ();

                        out_loop++;
                    if (MM_STRING[0] != "#") //return untill a valid 
String starts
                    {
                     //   out_loop=0; // set start poin to 0
                     //   break;

                    }

                 //   xbee_putchar(MM_STRING[out_loop]);

                    mPORTEToggleBits(LED_MMMODE); // funktioniert nicht 
da IO im Interrupt gesperrt sind
                    // delay_ms(1);



                       // this our inbox shoul look like 
putsUART2("#12344|9*")





                            //out_loop++;


                            if(MM_STRING[8] =='*') // check for the 
valid end and jump out
                            {
                               break;
                               mPORTEToggleBits(LED_MMMODE); // 
funktioniert nicht da IO im Interrupt gesperrt sind

                            };





                   }
         // Okay chek her if the strin is allright
                            if(MM_STRING[0] =='#')
                            {

                               // great
                            };
                            if(MM_STRING[6] =='|')
                            {

                               // great
                            };
                             if(MM_STRING[9] =='*')
                            {

                               // great
                            };


    }

    // We don't care about TX interrupt
    if ( INTGetFlag(INT_SOURCE_UART_TX(XBEE_MODULE_ID)) )
    {
         INTClearFlag(INT_SOURCE_UART_TX(XBEE_MODULE_ID));
     // mPORTEToggleBits(LED_MMMODE);
    }
}

von Raph (Gast)


Lesenswert?

if (UARTReceivedDataIsAvailable(XBEE_MODULE_ID))

    {
                 int out_loop=0;
                 while (out_loop < 9) ///
                {


                    MM_STRING[out_loop] = 
UARTGetDataByte(XBEE_MODULE_ID);
                     xbee_putchar(MM_STRING[out_loop]);

                     //  XBEE (MM_STRING[out_loop],out_loop);
                    //  XBEE ();

                        out_loop++;
                    if (MM_STRING[0] != "#") //return untill a valid 
String starts
                    {
                     //   out_loop=0; // set start poin to 0
                     //   break;

                    }

                 //   xbee_putchar(MM_STRING[out_loop]);

                    mPORTEToggleBits(LED_MMMODE); // funktioniert nicht 
da IO im Interrupt gesperrt sind
                    // delay_ms(1);



                       // this our inbox shoul look like 
putsUART2("#12344|9*")





                            //out_loop++;


                            if(MM_STRING[8] =='*') // check for the 
valid end and jump out
                            {
                               break;
                               mPORTEToggleBits(LED_MMMODE); // 
funktioniert nicht da IO im Interrupt gesperrt sind

                            };





                   }
         // Okay chek her if the strin is allright
                            if(MM_STRING[0] =='#')
                            {

                               // great
                            };
                            if(MM_STRING[6] =='|')
                            {

                               // great
                            };
                             if(MM_STRING[9] =='*')
                            {

                               // great
                            };


    }

    // We don't care about TX interrupt
    if ( INTGetFlag(INT_SOURCE_UART_TX(XBEE_MODULE_ID)) )
    {
         INTClearFlag(INT_SOURCE_UART_TX(XBEE_MODULE_ID));
     // mPORTEToggleBits(LED_MMMODE);
    }
}

von Raph (Gast)


Lesenswert?

Die Routne in main sieht sehr vereinfacht ungefähr so aus:


main()

{

xbee_write_ramstring(MM_STRING);

// put the whoel string back on uart

delay_ms(1000);
}

von ??? (Gast)


Lesenswert?

Syntax Highlighting?

von Frank M. (frank_m35)


Lesenswert?

Zwar wird auf eine korrekte Rechtschreibung und Grammatik im Internet 
wenig Wert gelegt, dennoch erleichert sie es den anderen deinen Post zu 
verstehen. Bitte versuche dein Bestes korrekt zu schreiben und lies dir 
lieber deinen Post erst noch ein paar mal durch, bevor du ihn 
abschickst. Sowohl dein erster Beitrag ist sehr schwer verständlich, als 
auch deine Code-Anmerkungen in Deutsch/Englisch, die in beiden Sprachen 
gleichermaßen gravierende Fehler enthalten.

Zum Code:
Hier im Forum kann man mit [ c] ... [ /c] C-Code formatiert posten 
(steht übrigens fett oberhalb des Textfeldes zum Abschicken eines 
Beitrags).
Bitte versuche es nocheinmal, denn deinen bisherigen Quellcode kann 
niemand entziffern.
Falls er länger wird, so kannst du auch die C-Dateine an deinen Beitrag 
anhängen.

Übrigens: Nutze die Vorschau-Funktion um zu sehen wie dein Beitrag 
aussehen wird.



Nun wissen wir also, dass du ein Array in der Interrupt-Routen 
modifizierst und in der Main-Loop weiter benutzt. Also auch nicht viel 
mehr als zu Beginn.
Was genau funktioniert denn nun nicht? Die Interrupt-Routine, das 
Senden, ...?
Woher weißt du das?
Wie hast du es ausgetestet?
Funktioniert es denn wenn du nicht die Interrupt-Routine benutzt, 
sondern einfach nur in der Main-Loop die UART Daten direkt verarbeitest, 
d.h. mit
1
if (UARTReceivedDataIsAvailable(XBEE_MODULE_ID))
in der Main-Loop arbeitest? Eigentlich brauchst du ja die 
Interrupt-Routine vorerst nicht.

von Raph (Gast)


Lesenswert?

okay ich habs jetzt hingekriegt.... ganz wichtig scheinen die breaks; zu 
sein
sonst funktionierts nicht

   if (UARTReceivedDataIsAvailable(XBEE_MODULE_ID))

    {
           if  (out_loop > 8)
           {
               out_loop=0;
           };
           MM_STRING[out_loop] = UARTGetDataByte(XBEE_MODULE_ID);
             //xbee_putchar(MM_STRING[out_loop]);

            if(MM_STRING[8] =='*') // check for the valid end and jump 
out
                            {

                               // set flag succesfull transmition

                               transmission = 1;



                           };



        if (MM_STRING[0] != '#') //return untill a valid String starts
                    {
                        out_loop=0; // set start poin to 0

                        while (1)
                        {
                        break;
                        }
                    }
        else
        {
            out_loop++;
            while (1)
                        {
                        break;
                        }
        }



       //             transmission = 0;// sai the main rotine the 
transmittion is not finish
//                 int out_loop = 0;
//                 while (out_loop < 9) ///
//                {


  //                  MM_STRING[out_loop] = 
UARTGetDataByte(XBEE_MODULE_ID);
         //            xbee_putchar(MM_STRING[out_loop]);

                     //  XBEE (MM_STRING[out_loop],out_loop);
                    //  XBEE ();


   //                 if (MM_STRING[0] != '#') //return untill a valid 
String starts
   //                 {
   //                     out_loop=0; // set start poin to 0

   //                     break;

// Helper functions

   //                 }
//
               //      if (out_loop == 8)
              //          {
              //              transmission = 1;

               //         }

                 //   xbee_putchar(MM_STRING[out_loop]);

               //     mPORTEToggleBits(LED_MMMODE); // funktioniert 
nicht da IO im Interrupt gesperrt sind
                    // delay_ms(1);



                       // this our inbox shoul look like 
putsUART2("#12344|9*")





                            //out_loop++;








                 //  }
         // Okay chek her if the strin is allright
                         //   if(MM_STRING[0] =='#')
                         //   {

                               // great
                           // };
                           // if(MM_STRING[6] =='|')
                         //   {

                               // great
                       //     };
                            // if(MM_STRING[9] =='*')
                           // {

                               // great
                          //  };

//out_loop++;

    }

    // We don't care about TX interrupt
    if ( INTGetFlag(INT_SOURCE_UART_TX(XBEE_MODULE_ID)) )
    {
         INTClearFlag(INT_SOURCE_UART_TX(XBEE_MODULE_ID));
     // mPORTEToggleBits(LED_MMMODE);
    }

 }

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Mal angesehen davon, dass es etwas unhöflich ist, einen Beitrag zu 
posten, und genau dieselben Fehler zu machen, auf die man einen beitrag 
vorher hingewiesen wurde (C-Quellcode als solchen zu kennzeichnen)...

ich bin dafür, folgenden teil (der sogar zweimal vorkommt) für den 
"useless code of the year" contest zu nominieren:
1
   while (1)
2
   {
3
        break;
4
   }

genial. "Literarisches Programmieren" in seiner Reinform. Sehr 
zeitgenössisch.

Edit: Hab jetzt nachdenken müssen welches Versmaß das ist: Anapäst.

von ??? (Gast)


Lesenswert?

Syntax Highlighting?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.