Hallo zusammen Ich habe ein kleines Problem mit scanf. Ich möchte gerne einen float Wert einlesen. Es kommen aber immer relativ lange Fehlermeldungen. Schreibe ich aber den gleichen Befehl in meinem Main.C Programm kommen diese Fehlermeldungen nicht. Vieleicht hatte schon jemand das selbe Problem. Ich poste hier einfach mal den Code und die Fehlermeldungen. Für einen Tipp wäre ich sehr dankbar, bin schon relativ lange an dem Problem. Gruss Matthias Code: void UART_vInit(void) { // USER CODE BEGIN (UART_Init,2) // USER CODE END /// ----------------------------------------------------------------------- /// UART settings /// ----------------------------------------------------------------------- /// Pin TXD_0 (P1.1) is selected for transmission /// Pin RXD_0 (P1.0) is selected for reception /// Receiver enabled /// Mode 1: 8-bit data, 1 start bit, 1 stop bit, variable baud rate /// BRG is selected for baudrate generation SFR_PAGE(_pp2, SST2); // switch to page 2 without saving P1_ALTSEL0 &= ~(ubyte)0x02; // configure alternate function register 0 P1_ALTSEL1 |= (ubyte)0x02; // configure alternate function register 1 SFR_PAGE(_pp0, SST2); // switch to page 0 without saving P1_DIR |= (ubyte)0x02; // set output direction MODPISEL &= ~(ubyte)0x01; // configure peripheral input select register BCON = 0x00; // reset baudrate timer/reload register SCON = 0x50; // load serial channel control register /// ----------------------------------------------------------------------- /// Baudrate generator settings /// ----------------------------------------------------------------------- /// input clock = fPCLK /// Fractional divider is disabled /// baudrate = 9.5785 kbaud BG = 0xAD; // load baudrate timer/reload register BCON |= 0x01; // load baud rate control register // USER CODE BEGIN (UART_Init,3) // USER CODE END /// UART interrupt enabled ES = 1; } // End of function UART_vInit //********************************************************************** ****** // @Function void UART_viIsr(void) // //---------------------------------------------------------------------- ------ // @Description This is the service routine for the UART interrupt. It is // called after each transmission (flag TI set) or reception // (flag RI set) of a data unit. // Please note that you have to add application specific code // to this function. // //---------------------------------------------------------------------- ------ // @Returnvalue None // //---------------------------------------------------------------------- ------ // @Parameters None // //---------------------------------------------------------------------- ------ // @Date 12.12.2006 // //********************************************************************** ****** // USER CODE BEGIN (UART_Isr,1) // USER CODE END int asa; //int Empfangen; void UART_viIsr(void) interrupt UARTINT { //if (TI) { // USER CODE BEGIN (UART_Isr,2) // USER CODE END // TI = 0; } if (RI) { // USER CODE BEGIN (UART_Isr,3) scanf("%f" , &asa); // scanf("%5i",&Empfangen); // Ua=255; // USER CODE END RI = 0; } } // End of function UART_viIsr und hier die Fehlermeldungen: void UART_vInit(void) { // USER CODE BEGIN (UART_Init,2) // USER CODE END /// ----------------------------------------------------------------------- /// UART settings /// ----------------------------------------------------------------------- /// Pin TXD_0 (P1.1) is selected for transmission /// Pin RXD_0 (P1.0) is selected for reception /// Receiver enabled /// Mode 1: 8-bit data, 1 start bit, 1 stop bit, variable baud rate /// BRG is selected for baudrate generation SFR_PAGE(_pp2, SST2); // switch to page 2 without saving P1_ALTSEL0 &= ~(ubyte)0x02; // configure alternate function register 0 P1_ALTSEL1 |= (ubyte)0x02; // configure alternate function register 1 SFR_PAGE(_pp0, SST2); // switch to page 0 without saving P1_DIR |= (ubyte)0x02; // set output direction MODPISEL &= ~(ubyte)0x01; // configure peripheral input select register BCON = 0x00; // reset baudrate timer/reload register SCON = 0x50; // load serial channel control register /// ----------------------------------------------------------------------- /// Baudrate generator settings /// ----------------------------------------------------------------------- /// input clock = fPCLK /// Fractional divider is disabled /// baudrate = 9.5785 kbaud BG = 0xAD; // load baudrate timer/reload register BCON |= 0x01; // load baud rate control register // USER CODE BEGIN (UART_Init,3) // USER CODE END /// UART interrupt enabled ES = 1; } // End of function UART_vInit //********************************************************************** ****** // @Function void UART_viIsr(void) // //---------------------------------------------------------------------- ------ // @Description This is the service routine for the UART interrupt. It is // called after each transmission (flag TI set) or reception // (flag RI set) of a data unit. // Please note that you have to add application specific code // to this function. // //---------------------------------------------------------------------- ------ // @Returnvalue None // //---------------------------------------------------------------------- ------ // @Parameters None // //---------------------------------------------------------------------- ------ // @Date 12.12.2006 // //********************************************************************** ****** // USER CODE BEGIN (UART_Isr,1) // USER CODE END int asa; //int Empfangen; void UART_viIsr(void) interrupt UARTINT { //if (TI) { // USER CODE BEGIN (UART_Isr,2) // USER CODE END // TI = 0; } if (RI) { // USER CODE BEGIN (UART_Isr,3) scanf("%f" , &asa); // scanf("%5i",&Empfangen); // Ua=255; // USER CODE END RI = 0; } } // End of function UART_viIsr
Sorry die Fehlermeldungen hatten irgendwie keinen Platz mehr. Hier wären sie noch Build target 'Target 1' compiling MAIN.C... compiling IO.C... compiling ADC.C... compiling T2.C... compiling UART.C... linking... *** ERROR L107: ADDRESS SPACE OVERFLOW SPACE: DATA SEGMENT: ?DT?MAIN LENGTH: 0038H *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: Y SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: X SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: W SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: XX SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: E SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: RELOAD_WERT SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: FREQUENZ SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: ESUM SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: KP SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: WINKEL_NEU SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: UA SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: TA SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: KI SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: WINKEL_ALT SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: RESULT SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: AUSGABE_STELLGROESSE SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: EMPFANGEN SEGMENT: ?DT?MAIN *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: WINKEL SEGMENT: ?DT?MAIN *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: X MODULE: .\T2.obj (T2) ADDRESS: 185BH *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: X MODULE: .\T2.obj (T2) ADDRESS: 185DH *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: X MODULE: .\T2.obj (T2) ADDRESS: 185FH *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: X MODULE: .\T2.obj (T2) ADDRESS: 1861H *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: WINKEL MODULE: .\T2.obj (T2) ADDRESS: 1863H *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: WINKEL MODULE: .\T2.obj (T2) ADDRESS: 1865H *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: WINKEL MODULE: .\T2.obj (T2) ADDRESS: 1867H *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: WINKEL MODULE: .\T2.obj (T2) ADDRESS: 1869H *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: X MODULE: .\T2.obj (T2) ADDRESS: 187AH *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: X MODULE: .\T2.obj (T2) ADDRESS: 187CH *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: X MODULE: .\T2.obj (T2) ADDRESS: 187EH *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: X MODULE: .\T2.obj (T2) ADDRESS: 1880H *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: WINKEL MODULE: .\T2.obj (T2) ADDRESS: 1882H *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: WINKEL MODULE: .\T2.obj (T2) ADDRESS: 1884H *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: WINKEL MODULE: .\T2.obj (T2) ADDRESS: 1886H *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: WINKEL MODULE: .\T2.obj (T2) ADDRESS: 1888H *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: RELOAD_WERT MODULE: .\T2.obj (T2) ADDRESS: 1897H Program Size: data=134.5 xdata=0 code=7045 Target not created
Habe noch einen Fehler im kopierten Code entdeckt. Ich habe schon mit float asa; zugewiesen
Hmmm *** ERROR L107: ADDRESS SPACE OVERFLOW SPACE: DATA Sieht aus als ob Du einfach nicht genügend Speicher hast. Kann das sein ?
Sollte eigentlich nicht sein. Wenn ich denselben Befehl in meinem Main.C Programm schreibe kommt diese Fehlermeldung nicht.
Hallo Was bedeuten dann dieser Fehlermeldungen: ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: WINKEL MODULE: .\T2.obj (T2) ADDRESS: 1882H Gruss
>*** ERROR L107: ADDRESS SPACE OVERFLOW > SPACE: DATA > SEGMENT: ?DT?MAIN > LENGTH: 0038H Schau mal hier nach: http://www.keil.com/support/docs/1241.htm da wird die Fehlermeldung erklärt, also einfach mal ins map file schauen und prüfen ob das sein kann.
Hallo Danke für den Link. Ich denke aber nicht dass das das wirkliche Problem ist, sonst käme doch der Fehler auch, wenn ich diesen Befehl im Main Programm schreibe, oder liege ich hier falsch? Gruss uns danke Matthias
Hallo, soweit ich mich erinnere, versucht der Keil Compiler/Linker die dynamischen Variablen im Speicher übereinanderzulegen. Das funktioniert aber nur, wenn er die aufgerufenen, verschachtelten Routinen zurückverfolgen kann. Ansonsten kann das Ram nicht mehrfach verwendet werden. Bei Interruptroutinen ist das prinzipiell nicht möglich, so das extra Ram verwendet werden muss. Wenn dann noch eine Routine wie scanf(), printf() verwendet wird, geht der Speicher schnell zur Neige. Vielleicht hilft es, scanf() als "compact" zu deklarieren. Näheres im Handbuch ... Grüsse Gerhard
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.