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
> 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?
> 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?
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.
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.