Forum: Mikrocontroller und Digitale Elektronik Probleme mit scanf


von XC866 (Gast)


Lesenswert?

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

von XC866 (Gast)


Lesenswert?

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

von XC866 (Gast)


Lesenswert?

Habe noch einen Fehler im kopierten Code entdeckt.
Ich habe schon mit float asa; zugewiesen

von Frank W. (Firma: DB1FW) (frankw) Benutzerseite


Lesenswert?

Hmmm

*** ERROR L107: ADDRESS SPACE OVERFLOW
    SPACE:   DATA

Sieht aus als ob Du einfach nicht genügend Speicher hast.
Kann das sein ?

von XC866 (Gast)


Lesenswert?

Sollte eigentlich nicht sein. Wenn ich denselben Befehl in meinem Main.C 
Programm schreibe kommt diese Fehlermeldung nicht.

von XC866 (Gast)


Lesenswert?

Hallo

Was bedeuten dann dieser Fehlermeldungen:

ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL
    SYMBOL:  WINKEL
    MODULE:  .\T2.obj (T2)
    ADDRESS: 1882H

Gruss

von koana (Gast)


Lesenswert?

>*** 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.

von XC866 (Gast)


Lesenswert?

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

von Gerhard K. (bei_der_arbeit)


Lesenswert?

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