Hallo Zusammen,
Mein LPC810 lässt sich nicht mehr programmieren.
Im Moment interessiere ich mich für den LPC810:
http://vilaca.eu/lpc810/
und verwende folgendes Board:
http://www.lpcware.com/lpc800-mini-kit
Dort habe ich via seriellem Adapter und Flashmagic ein kleines
Testprogramm aus einem GitHub Directory geladen (
LPC810_HelloWorld_UART0_115K.hex ), welches Zeichen auf der seriellen
Schnittstelle ausgibt:
https://github.com/microbuilder/LPC810_CodeBase/blob/master/tools/
Hello World funktioniert wunderbar, aber leider kann ich den LPC810
jetzt nicht mehr flashen. Hat jemand eine Idee?
Wenn ich die Resettaste drücke, sendet der Controller das "Hello,
LPC810!" ziemlich unbeeindruckt weiter. Ich habe den Pegel am Reset Pin
nachgemssen, das Tastensignal kommt am Controller an.
Woran könnte es liegen?
Hast du die ISP Taste gedrückt während des Resets? Also ISP drücken,
Reset antippen und erst dann ISP wieder loslassen.
Beim ersten Mal brauchst du das nicht machen, sobald aber ein Programm
drauf ist schon.
>Hast du die ISP Taste gedrückt während des Resets?
Ja, das habe ich so gemacht. Ich nehme an, dass der LPC810 dann aufhören
sollte sein "Hello .." zu senden und der Bootloader auf Eingaben wartet.
Das macht er aber nicht.
Als USB-Serial Wandler habe ich einen alten Arduino Diecimla
http://www.arduino.cc/en/uploads/Main/Arduino-Diecimila-schematic.pdf
genommen, den Prozessor rausgezogen und den Sendepegel mittels
Widerstand auf 3V runtergeteilt, damit sich der LPC nicht an den 5V
verschluckt.
Als Funktionsbeweis konnte ich den Prozessor einmal programmieren und
jetzt sendet er sein "Hello, LPC810".
Ich habe mir ein paar LPC810 bestellt, die hoffentlich heute kommen,
dann werde ich den alten mal auslöten.
Laut Datenblatt gibt es ein Konigurationsbit für den Reset-Pin:
1
RESET_EN
2
Enables fixed-pin function.
3
Writing a 1 deselects the function and any movable function can be assigned to this pin.
4
This function is selected by default
Könnte es vielleicht sein, dass das HEX-File den Reset-Pin lahm legt?
Stefan schrieb:
>Hast du die ISP Taste gedrückt während des Resets?
Hast Du Erfahrung mit dem LPC810? Ich versuche gerade im Code
https://github.com/microbuilder/LPC810_CodeBase
die Prozessorinitialisierung zu finden, um heraus zu kriegen, ob er
vielleicht den Reset Pin umkonfiguriert.
So, jetzt sind die neuen LPC810 von Farnell eingetroffen.
Jetzt verhält es sich folgendermaßen:
Das Blink-Programm LPC810_Blinky_0_2.hex von
https://github.com/microbuilder/LPC810_CodeBase/tree/master/tools
kann ich mehrmals flashen und wieder löschen.
Nachdem ich aber das Programm LPC810_HelloWorld_UART0_115K.hex geflasht
habe, geht das flashen nicht mehr.
Für das Blinky-Programm ist im Git-Repository der Eintrag: "Fixed Reset
Isue". Wahrscheinlich hat er den Fehler für das Blinky-Programm behoben,
nicht aber für das Hello-World.
1
Resume:
2
Wird der Reset falsch konfiguriert, geht der serielle Bootloader nicht mehr.
Frage: Gibt es eine Möglichkeit, den Baustein in den Urzustand zurück zu
versetzen?
chris_ schrieb:> Frage: Gibt es eine Möglichkeit, den Baustein in den Urzustand zurück zu> versetzen?
Ist jetzt mal blanke Spekulation. Ich würde über ein LPCXpresso
versuchen, den Baustein über JTAG anzusprechen. Schaltpläne der
LPCXpresso sind irgendwo im Downloadcenter von * enthalten. Da kann man
die Schnittstelle einsehen bzw. nachbauen.
>Ist jetzt mal blanke Spekulation. Ich würde über ein LPCXpresso>versuchen, den Baustein über JTAG anzusprechen.
Hmm .. dazu müsste ich ein wenig löten. Mal sehen ...
Der JTAG Anschluss belegt so ziemlich alle Pins des LPC810. Der
Reset-Pin ist auch dabei. Aber vielleicht geht es ja trotzdem.
>mein vorschlag:>>Strom aus>ISP druecken>Strom an>Flashen
Das habe ich auch schon probiert. Scheinbar geht er auch in den
Bootloader-Modus, weil er dann nicht mehr sendet. Aber programmieren
kann ich ihn nicht.
Meine Vermutung: beim Einschalten der Versorgungsspannung verhaspelt
sich irgendwie die Baud-Rate-Autodetection. Das kann ich aber leider
nicht verifizieren.
>mein vorschlag:>>Strom aus>ISP druecken>Strom an>Flashen
Jetzt hat die Methode doch funktioniert. Im ersten Anlauf habe ich GND
und VCC getrennt. Das hat beim Einschalten wohl zum Verhaspeln des
Autodetect geführt.
Jetzt habe ich es noch mal probiert, indem ich nur VCC getrennt und
wieder verbunden habe. Und sieh da: Der Controller ist gerettet :-)
Besten Dank.
hier ist die Änderung beschrieben:
https://github.com/microbuilder/LPC810_CodeBase/commit/9ccd1cd4e44a056add509a4059eab0e609b11e81
Der LPC810 hat kein JTAG, nur die abgespeckte SWD Funktion. Mit der
Änderung wurde SWD und Reset abgeschaltet, siehe User Manual UM10601 S.
131. Damit der Reset Pin aktiv ist muss also Bit6 im PINENABLE0 Register
auf 0 gesetzt werden.
Der ISP funktioniert immer, zur Not eben durch Power Off/On. Richtig
aussperren kann man sich nur wenn man die CRP3 (code read protection)
oder NO_ISP aktiviert, aber das macht man nicht aus versehen.
Vielen Dank,
die Datenblätter sind ja immer recht umfangreich und man kann kaum alles
lesen. Ich habe nur die Tabelle oben gefunden, die ein wenig nach JTAG
aussah.
Jein, das JTAG ist wohl nur für den Chip Test, S.330. Debuggen und
Flashen geht nur über SWD.
Ich habe auch die Hex files angesehen, da finde ich aber nur die
0xfffffffbf im Code, danach müsste der Reset bei beiden Hex files im
Tools Verzeichnis funktionieren.
>Ich habe auch die Hex files angesehen, da finde ich aber nur die>0xfffffffbf im Code,
Hmm .. seltsame Sache. Ich hatte das Programmierproblem beim orginalen
LPC auf dem Minikit-Board. Den habe ich dann durch "zerstörendes
Entfernen" durch einen neuen in einer Fassung ersetzt. Bei diesem hat
sich dann der selbe Effekt wie ursprünglich ergeben.
Erst mit dem Spannung wegnehmen anstatt mit Reset konnte ich den
Prozessor wieder programmieren.
Ich habe jetzt den Source Code ein wenig verändert und neu compiliert.
Das Programmieren funktioniert wiederholt wunderbar.
Wenn Du Lust und Zeit hast, kannst Du ja das Hex-File mal auf eine
LPC810 flashen. Es müsste sich dann der gleiche Effekt einstellen.
>ich habe keinen LPC8xx, nur die 32 Bitter.
Nur der Ordnung halber:
LPC810M021FN8
System:
ARM Cortex-M0+ processor, running at frequencies of up to 30 MHz
with single-cycle multiplier and fast single-cycle I/O port
Serial Wire Debug (SWD) and JTAG boundary scan modes supported
Memory:
4 kB on-chip flash programming memory
1 kB SRAM
>Hier wurde das Problem auch schon mal diskutiert:>http://www.lpcware.com/content/forum/lpc800-mini-k...
Danke. Wenn man nur immer gleich das Richtige im Internet finden könnte
... ;-)
Aus dem Problem folgend habe sie wohl das Blinky in Github korrigiert,
aber leider nicht das HelloWorld.
Kennt jemand von euch ein Programm für das serielle flashen von Linux
aus?
Im Moment habe ich dieses gefunden:
http://www.lpcnow.com/articles/share/291936/
Ein Programm mit graphischer Oberfläche wäre mir aber lieber.
chris_ schrieb:> Kennt jemand von euch ein Programm für das serielle flashen von Linux> aus?
Das Standard-Programm dafür ist lpc21isp.
> Ein Programm mit graphischer Oberfläche wäre mir aber lieber.
Pffft.
Ja, er hat wohl längere Zeit daran gearbeitet und dann ein
Kickstarter-Projekt innitiert. Das scheint aber nicht ganz so gut
gelaufen zu sein und er möchte seine Erkenntnisse nicht verschenken.
Er hat das selbe Prinzip verendet wie ich hier
http://hobby-roboter.de/forum/viewtopic.php?f=5&t=141
Allerdings hat er die Sigma-Delta-Loop in Assembler programmiert und
kommt dann mit dem LPC auf 3.6MSP.
>Das Standard-Programm dafür ist lpc21isp.
Danke.
>Im Moment habe ich dieses gefunden:>http://www.lpcnow.com/articles/share/291936/>Ein Programm mit graphischer Oberfläche wäre mir aber lieber.
Mittlerweile habe ich das Python Programm aus dem Link ausprobiert und
muss sagen, es funktioniert super unter Ubuntu und ist rasend schnell.
Deshalb brauche ich lpc21isp wohl nicht.
Mal eine andere Frage: Hat jemand von euch Beispielcode für eine PWM auf
dem LPC810 ?
Im Moment lese ich mich gerade in die Architektur des LPC810 ein.
Es gibt scheinbar zwei Timer:
SCT ( state configurable timer )
MRT ( multi rate timer )
Wobei der MRT anscheinend 4 Kanäle?? hat. Für mich sieht das nach
sprachlicher Verwirrung aus. Meinen die vielleicht einen Timer-Block mit
4 Timern darin?
11.2 Features
•31-bit interrupt timer
•Four channels independently counting down from individually set values
•Repeat and one-shot interrupt modes
chris_ schrieb:> Es gibt scheinbar zwei Timer:>> SCT ( state configurable timer )> MRT ( multi rate timer )
Richtig, hatte ich ja schon geschrieben :-)
Der MRT ersetzt beim LPC8xx die bisher in den LPC1xxx vorhandenen Timer.
Der SCT ist eine State Machine und wurde vom LPC4xxx übernommen.
chris_ schrieb:> Wobei der MRT anscheinend 4 Kanäle?? hat. Für mich sieht das nach> sprachlicher Verwirrung aus. Meinen die vielleicht einen Timer-Block mit> 4 Timern darin?
Timer-Block mit 4 Timern.
>Timer-Block mit 4 Timern.
Danke.
Ich hatte in diesem Datenblatt gelesen:
http://www.nxp.com/documents/user_manual/UM10601.pdf
( s.164)
Ich frage mich, ob man solche Datenblätter sprachlich nicht korrekter
Schreiben könnte. Da könnte ja
4 MRT timers
anstatt ein
one MRT timer with 4 Channels stehen.
chris_ schrieb:> 4 MRT timers>> anstatt ein>> one MRT timer with 4 Channels stehen.
4 Timer könnte z.B. 4 unterschiedlich einstellbare Clocksourcen
bedeuten.
@Lothar,
gibt es Public Domain Software zum Konfigurieren der SCT-Timer. Ich habe
in den Beispielen viel von "do not edit, autogenerated" gelesen.
noreply schrieb:> Public Domain Software zum Konfigurieren der SCT-Timer
Im kostenfreien LPCXpresso ist der "Red State SCTimer/PWM state machine
generator" enthalten, der den LPC81x SCT unterstützt.
Lustigerweise sehe ich grade, dass es dort bereits den LPC82x gibt, der
ist noch gar nicht angekündigt :-)
Es geht aber auch "zu Fuss" schliesslich hat der LPC81x SCT nur 2
Zustände:
http://de.wikipedia.org/wiki/Moore-Automat
Der SCT-Timer ist wirklich nicht einfach zu bedienen.
Zuerst das Starten des SCT-Timers den MRT-Timer lahm gelegt, obwohl dass
die beiden nichts miteinander zu tun hatten.
Ich will den SCT-Timer für die Erzeugung eines PWM-Signals mit 30kHz
Periode nutzen.
Das hat mittlerweile auch geklappt.
Jetzt hänge ich am nächsten Problem: Ich will eine Tabelle in der
SCT-Interruptroutine auslesen und den PWM-Wert aktuallisieren.
Hintergrund: Tonererzeugung
Ich habe ein Tesprogramm gemacht, in dem der PWM wert mittels eines
Zählers hochgezählt wird. Leider bleibt der nach ein paar Zyklen
irgendwo hängen.
Der Code sieht so aus:
1
voidinit_sct(uint8_tchannel)
2
{
3
// set pre-scalar, SCT clock = 1 MHz, clear counter
Warum nimmst Du nicht das empfohlene Beispiel für Sound?
http://www.hwhardsoft.de/english/projects/simon-says/chris_ schrieb:> void SCT_IRQHandler(void)> {> uint32_t status = LPC_SCT->EVFLAG;>> //LPC_GPIO_PORT->NOT0 = 1 << 3;> static uint16_t value=100;> LPC_SCT->MATCHREL[1].L=value++;> if(value>800)value=100;
Macht so keinen Sinn, value muss global sein.
>> // Acknowledge interrupts> LPC_SCT->EVFLAG = status;> return;
Keine Ahnung was return in einem IRQHandler bewirkt. Im besten Fall wird
es ignoriert. Aber besser weglassen.
> }
Hallo Lothar,
>Warum nimmst Du nicht das empfohlene Beispiel für Sound?>http://www.hwhardsoft.de/english/projects/simon-says/
So weit ich das sehen kann, nutzt er den SCT Tmier als
Rechteckgenerator. Ich will aber analoge Töne mit der PWM produzieren.
Deshalb brauche ich eine Update-Rate von ca. 30kHz.
>> static uint16_t value=100;>> LPC_SCT->MATCHREL[1].L=value++;>> if(value>800)value=100;>Macht so keinen Sinn, value muss global sein.
"value" ist eigentlich erst mal nur zum testen gedacht. Ich wollte value
in der Interruptroutine hoch zählen, um zu sehen, ob es funktioniert. So
wie es da geschrieben steht, sollte eigentlich eine Sägezahnschwinung
ergeben. Die PWM ändert sich aber nur kurz ( ca. 1Sekunde ), dann bleibt
sie auf einem Wert hängen.
siehe Kommentar und wie Lothar gesagt hat, static uint16_t value=100;
rausziehen und global machen. static könnte zwar funktionieren, ließt
sich aber schlecht und zum initialisieren benötigt man sonst noch ein
Flag, etc.
chris_ schrieb:> void SCT_IRQHandler(void)> {> uint32_t status = LPC_SCT->EVFLAG;>> //LPC_GPIO_PORT->NOT0 = 1 << 3;> static uint16_t value=100; /* hier setzt man nach jeden Interrupt value wieder
auf 100 */
> LPC_SCT->MATCHREL[1].L=value++;> if(value>800)value=100;>> // Acknowledge interrupts> LPC_SCT->EVFLAG = status;> return;> }
Danke für die Antwort, aber daran liegt es nicht, da ich es auch schon
anders probiert habe.
aus http://de.wikibooks.org/wiki/C-Programmierung:_static_%26_Co.
"Das Schlüsselwort static hat in C eine Doppelbedeutung. Im Kontext
einer Variablendeklaration innerhalb einer Funktion sagt dieses
Schlüsselwort, dass diese Variable auf einer festen Speicheradresse
gespeichert wird. Daraus ergibt sich die Möglichkeit, dass eine
Funktion, die mit static-Variablen arbeitet, beim nächsten Durchlauf die
Informationen erneut nutzt, die in der Variablen gespeichert wurden (wie
in einem Gedächtnis)."
Ich verwende es eigentlich ganz gerne und oft. Damit ist eine Kapselung
der Daten innerhalb einer Funktion möglich, was bei der
Objekt-orientierten Programmierung gerne benutzt wird.
@chris,
Sorry stimmt. Meinen Kommentar von oben vergessen. Ich habe ein
vergleichbares Programmierkonstrukt mal schnell in linux implementiert.
Der Zähler value geht hoch. Setzt aber auch voraus, das der Compiler es
richtig macht. ;-)
Hallo Zusammen,
jetzt stelle ich mal die Version 1 der Library online:
http://hobby-roboter.de/forum/viewtopic.php?f=4&t=152&p=600#p600
Es gibt ein Beispiel um Melodien zu spielen. Allerdings werden im Moment
auch nur Rechtecksignale erzeugt.
Ich hoffe, dass ich irgendwann die PWM noch so weit hin kriege, dass ich
auch analoge Töne erzeugen kann.
chris_ schrieb:> Allerdings werden im Moment auch nur Rechtecksignale erzeugt.Lothar schrieb:> Hier ein Beispiel für AVR.
Sehe grade, das Beispiel ist ohnehin von Dir, oder :-) Dann sollte es
auf dem LPC810 erst mal auch laufen.
>Sehe grade, das Beispiel ist ohnehin von Dir, oder :-)
Ja ;-)
Ich hatte auch schon einmal einen mehrstimmigen PWM-Synthesizer mit dem
LPC1114 programmiert:
http://hobby-roboter.de/forum/viewtopic.php?f=5&t=140
( Das File ArmPcSound spielt Bach mehrstimmig auf dem LPC1114, es klingt
gar nicht schlecht ... )
Die Experimente mit dem Sigma-Delta-DAC wurden hier wohl als Inspiration
genommen:
http://hackaday.com/2014/06/14/an-arm-based-dsp-modelling-synth/
Die Sigma-Delta-Loop ist dort ist in Assembler programmiert und die
Aktualisierung des Wertes erfolgt in einer 44kHz Interrupt Routine.
Was mich daran stört, ist, dass der DAC in der Main-Loop laufen muss und
immer schlechter wird, je mehr Rechenzeit die Signalgeneratoren und
Filter brauchen.
Deshalb will ich lieber zurück zum PWM-DAC wie bei meinem LPC1114
Projekt. Der ist nicht ganz so gut wie die Assembler-Sigma-Delta Loop,
aber kostet keine Rechenzeit und lässt sich vor allen Dingen mit meiner
Library hier
http://hobby-roboter.de/forum/download/file.php?id=191
kombinieren.
Weiß jemand von euch, ob man einen 5V USB-Serial Converter direkt an den
LPC810 anschließen kann?
Im Datenblatt finde ich zur 5V Toleranz die obige Tabelle. Ich würde sie
so interpretieren, dass es kein Problem sein sollte.
Außerdem suche ich nach dem Schaltpegel für die Digitaleingänge, da
konnte ich aber noch keine Angaben finden. Ich möchte ein paar digitale
Eingänge bei einer Versorgungsspannung mit 3.3V mit einem Signal von
1.6V schalten. Die Frage ist, ob der Pegel reicht.
chris_ schrieb:> Weiß jemand von euch, ob man einen 5V USB-Serial Converter direkt an den> LPC810 anschließen kann?
Sicher kann man das, nur ist halt P0.0 zugleich ISP-RX und
Analog-Eingang. Wenn man also ein Programm hat, das den Analog-Eingang
nutzt, und vergisst nach dem Flashen das ISP-RX abzuziehen, könnte der
Komparator hinüber sein.
Aber warum nicht einfach einen Spannungsteiler oder eine LED davor?
>Aber warum nicht einfach einen Spannungsteiler oder eine LED davor?
Ich versuche immer, den Bauteile Aufwand möglichst gering zu halten.
Wenn man einen seriellen Programmer wie diesen hier
http://hobby-roboter.de/forum/download/file.php?id=193
auf Experimentierplatinen aufbaut, ist es gut, wenn nicht so viele
Bauteile darauf sind weil es leicht zu Wackelkontakten kommt.
Auf die Idee mit der LED in Serie bin ich noch nicht gekommen. Ich
wollte so was machen:
LPC810Pin <-- 1k ------ 1k ----< ProgrammiermikrocontrollerPin ( ProgMC
)
|
|
LED
|
|
GND
Damit könnte man die LED gleichzeitig als Anzeige LED nutzen wenn man
den ProgMC-Pin hochohmig schaltet.
Mann könnte den ProgMC auch als In-Circuit Logikanalysator verwenden,
wenn man die Eingänge abfragt.
Nachdem ich mich einige Zeit mit der Integration der Software in die
Arduino-IDE herum geschlagen habe, hier das Ergebnis:
http://hobby-roboter.de/forum/viewtopic.php?f=4&t=152&p=604#p604
Damit sollte die Installation der Arm-Tool-Chain wirklich einfach sein,
man muss fast nichts tun.
Alpha Tester sind gerne willkommen.