Probleme mit scanf

Gast #462075
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
Gast #462078
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
Gast #462847
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
#462943
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren