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; } }
> SWI_Handler
Wer, was und wo der/die/das auch immer sein soll.
Kompiliert der das überhaupt? Änder mal bitte:
1 | #define VREF 3,6
|
in
1 | #define VREF 3.6
|
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.
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)
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
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.