mikrocontroller.net

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


Autor: Stefan Beier (stefanb)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: einen Namen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan Beier (stefanb)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann wird er wohl dort hängen:
   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?

Autor: Stefan Beier (stefanb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Dann wird er wohl dort hängen:
>
>    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?

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.