www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit scanf


Autor: XC866 (Gast)
Datum:

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

Autor: XC866 (Gast)
Datum:

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

Autor: XC866 (Gast)
Datum:

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

Autor: Frank W. (frankw) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm

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

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

Autor: XC866 (Gast)
Datum:

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

Autor: XC866 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Was bedeuten dann dieser Fehlermeldungen:

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

Gruss

Autor: koana (Gast)
Datum:

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

Autor: XC866 (Gast)
Datum:

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

Autor: Gerhard Kammerer (bei_der_arbeit)
Datum:

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

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.