www.mikrocontroller.net

Forum: Compiler & IDEs Programm springt nicht in die main methode


Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin absoluter anfänger!

Ich habe mir ein LPC2294 board von Philips angeschafft und zusätzlich 
noch eine erweiterung, mit schaltern, LEDs, Poti, motor,...

Ich habe nun ein Programm geschrieben in der IDE Keil. Diese soll die 
Spannung am AD Converter messen und je nachdem wie hoch die Spannung 
ist, verschiedene LEDs zum leuchten bringen. Wenn ich im debug mode nach 
dem Fehler suche, kann ich sehen, dass das Programm gar nicht in die 
main methode springt. Es bleibt vorher stehen, am SWI_Handler. Hat 
jemand eine Idee an was dies liegen könnte?

Danke im Vorraus und Gruß

Timo



Hier der Quellcode:


#include <lpc22xx.h>                      // LPC2200 definitions
#include <stdio.h>                                  // standard I/O 
.h-file
#define VREF  3,6


unsigned int val;
unsigned int chan;


extern void init_serial (void);


int main(void) {


  init_serial();                      // Initialize Serial Interface



  /* Setup the A/D converter */
  IODIR1 = 0x00FF0000;                 // P1.16..23 defined as Outputs
  VPBDIV = 0x02;                       // Set the Pclk to 30 Mhz
  ADCR   = 0x00210601;                 // Setup A/D: 10-bit AIN0 @ 3MHz




  while(1) {

    ADCR  |= 0x01000000;                  // Start A/D Conversion
    while ((ADDR & 0x80000000) == 0);
    val = ((ADDR >> 6) & 0x03FF);         // Extract the A/D result
    chan = ((ADDR >> 24) &0x0007);        // Channel (should be 0)

    printf ("Digital Value %4u = %01u.%04u Volts\r",
         (unsigned) val,
         (unsigned) (val * VREF) >> 10,
         (unsigned) ((val  VREF  10000UL) >> 10UL) % 10000);






    //Digital value: LED ON


    IODIR1 = 0x00FF0000;



    if ( val <= 30 ) {                  // 0 Volt;

      IOCLR1 = 0x00FF0000;
    }

    else if ( val <= 169 ) {

      IOSET1 = 0x00010000;

    }
    else if ( val >= 303 ) {

      IOSET1 = 0x00030000;

    }
    else if ( val >= 414 ) {

      IOSET1 = 0x00070000;

    }
    else if ( val >= 552 ) {

      IOSET1 = 0x000F0000;

    }
    else if ( val >= 690 ) {

      IOSET1 = 0x001F0000;

    }
    else if ( val >= 828 ) {

      IOSET1 = 0x003F0000;

    }
    else if ( val >= 966 ) {

      IOSET1 = 0x007F0000;

    }
    else if ( val >= 1104 ) {

      IOSET1 = 0x00FF0000;

    }

    IOCLR1 = 0x00FF0000;

  }
}

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> SWI_Handler

Wer, was und wo der/die/das auch immer sein soll.

Kompiliert der das überhaupt? Änder mal bitte:
#define VREF  3,6

in
#define VREF  3.6

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der SWI_Handler steht im Startup.s Code

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wird der Debugger aufgerufen bzw. wie lange lässt du dem Programm 
Zeit bis du im Debugger manuell einen Break auslöst?
http://www.keil.com/forum/docs/thread8287.asp

Möglicherweise gibt ähnliches wie in 
http://www.keil.com/support/docs/3376.htm
(printf könnte memory allocation machen)

Ansonsten findet man bei Keil noch viel mehr zu SWI_Handler. Ich würde 
zuerst ein Beispiel von Keil compilieren und das dann wenn es läuft nach 
und nach entkernen und mit meinem Code aufrüsten.

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorab: Falls die RealView-Tools verwendet werden (Standardeinstellung 
bei Keil uVision), ist dies nicht das passende Forum. Keil hat ein 
eigenes Support-Forum (www.keil.com).

Dennoch: Die SWI Exception wird wahrscheinlich durch das stdio-Subsystem 
der Laufzeitbibliothek ausgelöst. Sieht so aus, als wäre 
"semihosting_swi" aktiviert. Darüber können z.B. Ausgaben an das 
Host-System umgeleitet werden, falls die Debugging-Hard-/Software(z.B. 
"RDI") dies unterstützt. Dies ist hier wohl nicht beabsichtigt. 
Üblicherweise findet man in den Beispielen von Keil eine Datei mit Namen 
"Retarget.c", in deren Funktionen wird die Anbindung(en) der 
stdio-Funktionen an das verwendete "IO-Device" (z.B. UART) eingestellt.

main() wird bei RealView üblicherweise nicht direkt vom Startup-code 
sondern indirekt von einer Funktion __main aufgerufen, die Teil der 
herstellerspezifischen Laufzeitbibliothek ist und vom Startup-code 
aufgerufen wird. __main erledigt noch einiges an Initialisierungen bevor 
es main() aufruft.

Langer Rede: Anhand des gezeigten Codes kann man überhaupt nicht konkret 
weiterhelfen und bestenfalls spekulieren (so getan). Man zeige den 
gesamten Quellcode (inkl. Startup, retarget etc.).

> Der SWI_Handler steht im Startup.s Code
Und wahrscheinlich ist es nur eine Endlosschleife als Platzhalter, 
zumindest ist das in vielen Beispielen von Keil so.

Martin Thomas
(Ich nutze Keil/RealView nur sehr selten und auch nur die Eval-Version 
aber schaue mir deren mitgelieferte Beispielsammlung öfters an - so take 
it for what it's worth)

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Code den ich oben angegeben habe, ist ein beispielcode von Keil. Ich 
habe ihn nur erweitert. Ich habe jetzt auch mal all meine Erweiterungen 
nochmal rausgenommmen und trotzdem (nur das keil bsp) funktioniert 
nichts. Selbes Problem, auf dem Board ist nichts zu sehen. Alle LEDs 
sind an aber man kann nichts regeln. Wenn ich in den Debug mode gehe, 
bleibt das Programm wieder an der selben stelle hängen. Am SWI_Handler. 
Die main funktion wird also niemals ausgeführt.

gruß Timo

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.