Moin,
ich habe angefangen mich mit den ARM LPCs von NXP zu beschäftigen. Für
erste Versuche habe ich ein LPCXpresso Board mit dem LPC 1114 hier auf
dem Schreibtisch liegen. (IDE MCUXpresso mit CMSIS_CORE)
Das Board hat eine LED (PIO0_7), ich habe eine weitere LED an PIO2_4
angeschlossen und an PIO0_11 (AD0) ein 10k Poti als Spannungsteiler zum
testen.
Ein kurzes Testprogramm funktioniert, es fragt den ADC über Polling ab,
in der While Schleife wird die ADC Messung gestartet, dann wird gewartet
bis das "done" Bit gesetzt ist und das ADC Register ausgelesen, maskiert
und geschiftet und dann geprüft ob der Wert kleiner als 512 ist und
davon abhängig die LED an PIO0_7 an- oder ausgeschaltet.
Als Basis diente mir die "Getting Started Seite von Digikey"
https://www.digikey.com/eewiki/display/microcontroller/Getting+Started+with+NXP%27s+LPC11XX+Cortex-M0+ARM+Microcontrollers
Mein zweiter Versuch den ADC über den Interrupt abzufragen schlägt
leider fehl. Das untere Programm wird fehlerfrei kompiliert, führt den
Interrupt aber nicht aus...
Setze ich das auskommentierte Bit "Start Conversion" wird mein
"Hauptprogramm - die Schleife" nicht mehr ausgeführt....
Wer hat Erfahrung mit den ARM LPCs und kann mir weiterhelfen?
Gruß
Boris
Skyper schrieb:> Wer hat Erfahrung mit den ARM LPCs und kann mir weiterhelfen?
Ich habe die Erfahrung, aber eher mit dem Polling-Mode.
Was mir aber auffällt, in der ISR musst du ADC IR löschen und eine
Prüfung für den Überlauf gehört vorsichtshalber auch rein. Und überprüfe
auch noch in der Init die bits vom LPC_ADC->CR register, da stellt man
ein ob der ADC im Polling oder IRQ gelesen wird.
A. F. schrieb:> Ich habe die Erfahrung, aber eher mit dem Polling-Mode.> Was mir aber auffällt, in der ISR musst du ADC IR löschen und eine> Prüfung für den Überlauf gehört vorsichtshalber auch rein. Und überprüfe> auch noch in der Init die bits vom LPC_ADC->CR register, da stellt man> ein ob der ADC im Polling oder IRQ gelesen wird.
Danke A.F. für die Hinweise:
Mein erster Fehler war, das ich den Burst-Modus nicht im CR Register
gesetzt hatte.
Zweiter Fehler, die ISR nicht mit " extern "C" " zu Kennzeichnen.
Das IR Register (wie beim Timer) gibt es beim ADC scheinbar nicht, es
reicht das auslesen aus: The result register for an A/D channel that is
generating an interrupt must be read in order to clear the corresponding
DONE flag.
Das mit dem "OVERRUN" Bit verstehe ich aber nicht so richtig:
This bit is 1 in burst mode if the results of one or more conversions
was (were) lost and overwritten before the conversion that produced
the result in the V_VREF bits.
Ich dachte, das Bit zeigt nur an, das die vorherigen Kovertierungen
nicht gelesen / verworfen wurden?
Skyper schrieb:> Zweiter Fehler, die ISR nicht mit " extern "C" " zu Kennzeichnen.
Nun, sowas mag ja beim GCC mittlerweile angesagt sein.
Beim Keil schreibt man stattdessen
void __irq ADC_IRQHandler (void)
denn schlußendlich muß ja der Linker erkennen, daß es da für den
besagten Interrupt außer dem [WEAK] Handler einen tatsächlichen
nicht-weak-Handler gibt.
Wenn ich mich recht erinnere, dann muß man für den GCC folgendes
schreiben:
#if defined (GCC)
#define _irq __attribute_ ((interrupt("IRQ")))
#endif
Ist ja so schön einfach und übersichtlich.
W.S.
Skyper schrieb:> Zweiter Fehler, die ISR nicht mit " extern "C" " zu Kennzeichnen.
Das sollte nur nötig sein, wenn mit einem C++-Compiler übersetzt wird.
Kann natürlich sein, dass MCUXpresso das macht.
Jürgen S. schrieb:> Das sollte nur nötig sein, wenn mit einem C++-Compiler übersetzt wird.> Kann natürlich sein, dass MCUXpresso das macht.
Ja, war als C++ Projekt eingerichtet...
Kann jemand vielleicht noch was zum Overrun sagen... Wert auslesen und
wenn das Bit gesetzt ist verwerfen und warten bis zum nächsten mal?
Skyper schrieb:> Kann jemand vielleicht noch was zum Overrun sagen... Wert auslesen und> wenn das Bit gesetzt ist verwerfen und warten bis zum nächsten mal?
Ein Flag setzen das in der Hauptschleife eine entsprechende
Fehlermeldung auswirft.
ADC Overrun ist ein Programmierfehler, den möchte man als Programmierer
zeitnah mitbekommen.
Beim Kunden ist der i.d.R. ohne Bedeutung (lies: zu spät) - es sei denn
man schreibt ein Logfile o.ä. mit.
Jim M. schrieb:> Ein Flag setzen das in der Hauptschleife eine entsprechende> Fehlermeldung auswirft.>> ADC Overrun ist ein Programmierfehler, den möchte man als Programmierer> zeitnah mitbekommen.>> Beim Kunden ist der i.d.R. ohne Bedeutung (lies: zu spät) - es sei denn> man schreibt ein Logfile o.ä. mit.
Danke für die Erläuterung Jim,
so ähnlich hatte ich das in Beispielen auch gesehen, wenn das
Overrun-Bit gesetzt war, Wert verwerfen und ein Bit in der globalen
Fehler Variable für "Overrun" setzen...