Forum: Compiler & IDEs Probleme mit If-Schleife bei XC2287M


von Stefan B. (stefanb)


Lesenswert?

Hallo,

ich habe ein Problem mit einem XC2287M. Digital I/O funktioniert 
einwandfrei. Auch SSC (Syncronous Serial Channel) funktioniert, d.h. ich 
erhalte ein SPI-ähnliches Signal am Oszi. Mein Problem ist jedoch, dass 
der µC sich nach Senden der Daten in der If-Schleife aufhängt. Hier der 
Code:

if(P10_IN_P1==0x00){

     P10_OUT_P4=0x00;  //Setze LED P10.4

  U0C0_SSC_vSendData(0xAA);  //Sende Daten

  }

  P10_OUT_P4=0x01;
}

Der Code steht in der Main-Schleife. Wenn ich den µC resete, kann ich 
immer nur ein Signal erzeugen, dann hängt der Controller in der Schleife 
fest.

Hier noch der Code für das USIC:

//********************************************************************** 
******
// @Module        Universal Serial Interface Channel (USIC) U0C0
// @Filename      U0C0.C
//---------------------------------------------------------------------- 
------
// @Controller    Infineon XC2287M-104F80

//********************************************************************** 
******

#include "MAIN.H"

//********************************************************************** 
******
// @Function      void U0C0_SSC_vInit(void)
//
//---------------------------------------------------------------------- 
------
// @Description   This is the initialization function of the U0C0 
function
//                library. It is assumed that the SFRs used by this 
library
//                are in reset state.
//
//********************************************************************** 
******


void U0C0_SSC_vInit(void)
{

-----------------------------------------------------------------------
  ///  Configuration of the U0C0 Fractional Divider:
  /// 
-----------------------------------------------------------------------
  ///  - The Fractional divider is selected
  ///  - The step value STEP = 640

  U0C0_FDRL      =  0x8280;      // load U0C0 fractional divider 
register

  /// 
-----------------------------------------------------------------------
  ///  Configuration of the U0C0 Baudrate Generator:
  /// 
-----------------------------------------------------------------------
  ///  - The selected BaudRate is 100,000 kbaud
  ///  - The PreDivider for CTQ, PCTQ = 0
  ///  - The Denominator for CTQ, DCTQ = 0
  ///  - The Divider factor PDIV = 249

  U0C0_BRGL      =  0x0000;      // load U0C0 load baud rate generator
                                 // register L

  U0C0_BRGH      =  0x00F9;      // load U0C0 load baud rate generator
                                 // register H

  /// 
-----------------------------------------------------------------------
  ///  Configuration of the U0C0 Input Control Register:
  /// 
-----------------------------------------------------------------------
  ///  - Receive input is not selected

  /// 
-----------------------------------------------------------------------
  ///  Configuration of the U0C0 Interrupt Node Pointer Register:
  /// 
-----------------------------------------------------------------------

  U0C0_INPRL     =  0x0000;      // load U0C0 Interrupt Node Pointer 
register
                                 // L
  U0C0_INPRH     =  0x0000;      // load U0C0 Interrupt Node Pointer 
register
                                 // H

  /// 
-----------------------------------------------------------------------
  ///  Configuration of the U0C0 Shift Control:
  /// 
-----------------------------------------------------------------------
  ///  - Transmit/Receive LSB first is selected

  U0C0_SCTRL     =  0x0102;      // load U0C0 shift control register L
  U0C0_SCTRH     =  0x0F0F;      // load U0C0 shift control register H

  /// 
-----------------------------------------------------------------------
  ///  Configuration of the U0C0 Transmit Control/Status Register:
  /// 
-----------------------------------------------------------------------

  U0C0_TCSRL     =  0x0500;      // load U0C0 transmit control/status
                                 // register L
  U0C0_TCSRH     =  0x0000;      // load U0C0 transmit control/status
                                 // register H

  /// 
-----------------------------------------------------------------------
  ///  Configuration of the U0C0 Protocol Control Register:
  /// 
-----------------------------------------------------------------------

  U0C0_PCRL      =  0x0F47;      // load U0C0 protocol control register 
L
  U0C0_PCRH      =  0x0001;      // load U0C0 protocol control register 
H

  /// 
-----------------------------------------------------------------------
  ///  Configuration of the U0C0 Protocol Status Register:
  /// 
-----------------------------------------------------------------------
  ///  - TBIF is set to simplify polling

  U0C0_PSR      |=  0x2000;      // load U0C0 protocol status register


  /// 
-----------------------------------------------------------------------
  ///  Configuration of the used U0C0 Interrupts:
  /// 
-----------------------------------------------------------------------
  /// 
-----------------------------------------------------------------------
  ///  Configuration of the used U0C0 Port Pins:
  /// 
-----------------------------------------------------------------------
  ///  - Receive Pin is not selected for the module
  ///  - P2.3 is used for USIC0 Channel0 Shift Data Output(DOUT)
  ///  - P2.5 is used for USIC0 Channel0 Shift Clock Output(SCLKOUT)
  ///  - P2.6 is used for USIC0 Channel0 Shift Control output0(SELO0)
  ///  - P2.7 is used for USIC0 Channel0 Shift Control output1(SELO1)

  P2_IOCR03 = 0x0090;    //set direction register
  P2_IOCR05 = 0x0090;    //set direction register
  P2_IOCR06 = 0x0090;    //set direction register
  P2_IOCR07 = 0x00A0;    //set direction register


}


//********************************************************************** 
******
// @Function      void U0C0_SSC_vSendData(uword uwData)
//
//---------------------------------------------------------------------- 
------
// @Description   This function clears the transmit buffer Indication 
flag
//                first  & then writes the send data initialization word 
into
//                the transmit buffer register.
//
//                Note:
//                In a multiprocessor system the master with this 
function
//                has the possibility to send data to the selected 
slave.

//********************************************************************** 
******


void U0C0_SSC_vSendData(uword uwData)
{

  while(!(U0C0_PSR & 0x2000));   //  wait until tx buffer indication 
flag is set

  U0C0_PSCR     |= 0x2000;   //  clear transmit buffer indication flag
  U0C0_TBUF00    = uwData;   //  load transmit buffer register

}

//********************************************************************** 
******
// @Function      ubyte U0C0_SSC_ubTxDataReady(void)
//
//---------------------------------------------------------------------- 
------
// @Description   This function can be used for checking up the status 
of the
//                transmit shift indication flag U0C0_PSR_TSIF. This 
function
//                shows when the sending of data has terminated. By
//                continuously polling this flag after the function
//                U0C0_SSC_vSendData has been called, it is possible to
//                establish when U0C0 has terminated its task.
//
//---------------------------------------------------------------------- 
------
// @Returnvalue   0 if transmitter is busy, else 1

ubyte U0C0_SSC_ubTxDataReady(void)
{
  ubyte ubReturnValue;

  ubReturnValue = 0;

  if(U0C0_PSR & 0x1000)               // if sending of data is 
terminated
  {
    ubReturnValue = 1;
    U0C0_PSCR |= 0x1000;
  }
  return(ubReturnValue);

}




Vielleicht kann mir jemand von euch weiterhelfen, da ich mit meinem 
Latein am Ende bin.

Gruß Stefan

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Probleme mit If-Schleife bei XC2287M
Siehe dort: http://www.if-schleife.de

> dann hängt der Controller in der Schleife fest.
Wo denn genau?  In der Routine zum Senden?

von einen Namen (Gast)


Lesenswert?


von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Wenn ich den µC resete, kann ich immer nur ein Signal erzeugen,
Was für ein Signal?
Kannst du nur 1 mal über die SIO senden, oder was?

von Stefan B. (stefanb)


Lesenswert?

Also: Wenn ich nur die LED toggle, dann funktioniert die Abfrage und die 
If-"ABFRAGE" ist nur aktiv, wenn der Taster gedrückt ist. Sobald ich 
aber die Sendefunktion einbaue, geht die LED nicht mehr aus und ich kann 
durch weiteres Drücken des Tasters die Signalausgabe nicht wiederholen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dann wird er wohl dort hängen:
1
   while(!(U0C0_PSR & 0x2000));   //  wait until tx buffer indication flag is set
Hast du den UART komplett initialisiert und den Sender eingeschaltet?
Bekommst du ein Zeichen über die serielle Schnittstelle ausgegeben?

von Stefan B. (stefanb)


Lesenswert?

Lothar Miller schrieb:
> Dann wird er wohl dort hängen:
>
1
>    while(!(U0C0_PSR & 0x2000));   //  wait until tx buffer indication
2
> flag is set
3
>
> Hast du den UART komplett initialisiert und den Sender eingeschaltet?
> Bekommst du ein Zeichen über die serielle Schnittstelle ausgegeben?

Die Buffer-Abfrage habe ich auch schon versucht, hat jedoch nicht 
geholfen. Allerdings funktioniert es jetzt... habe einfach am Ende der 
If-Abfrage ein return eingefügt und seitdem funktioniert es.

Trotzdem vielen Dank.

Gruß Stefan

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stefan Beier schrieb:
>>>> Der Code steht in der Main-Schleife.
> habe einfach am Ende der
> If-Abfrage ein return eingefügt und seitdem funktioniert es.
Das würde mir zu Denken geben...
Wie soll das gehen, mit einem Return in der Main-Schleife?
>>>> Wenn ich den µC resete
Ich vermute, genau das macht dein Return auch... :-o

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.