LPC810 seriell programmieren

Gast #3788125
Lesenswert?

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?
Gast #3788151
Lesenswert?

>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?
Gast #3788584
Lesenswert?

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?
Gast #3788699
Lesenswert?

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.
Gast #3788800
Lesenswert?

>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.
Gast #3788816
Lesenswert?

>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.
Gast #3788842
Lesenswert?

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.
Gast #3788911
Lesenswert?

>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.
Gast #3789013
Lesenswert?

chris_ schrieb:
> 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. Habe nur kurz durch das UM 
geblättert.
Hier wurde das Problem auch schon mal diskutiert:
http://www.lpcware.com/content/forum/lpc800-mini-kit-cannot-enter-isp-reset-mode
Gast #3789051
Lesenswert?

>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.
Gast #3797097
Lesenswert?

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.
Gast #3798072
Lesenswert?

>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 ?
Gast #3798106
Lesenswert?

chris_ schrieb:
> Beispielcode für eine PWM auf dem LPC810

Hardware PWM funktioniert mit dem SCT das ist etwas komplex. Hier ein 
einfaches Beispiel:

http://www.hwhardsoft.de/english/projects/simon-says/

Oder maximal ausführlich hier:

http://www.lpcware.com/content/nxpfile/lpc80-sct-cookbook-and-tutorial-code-examples

Ansonsten Software PWM mit dem MRT:

http://blog.nano-age.co.uk/2014/08/some-other-lpc810-mrt-uses.html
Gast #3800468
Lesenswert?

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
Gast #3800606
Lesenswert?

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.
Gast #3801223
Lesenswert?

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
Gast #3804144
Lesenswert?

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
void init_sct(uint8_t channel)
2
{
3
  // set pre-scalar, SCT clock = 1 MHz, clear counter
4
    //LPC_SCT->CTRL_L |= (((SystemCoreClock/1000000-1) << 5) | (1<<3));
5

6
  // connect SCT OUTP_0 to IO-PIN
7
  LPC_SWM->PINASSIGN6 &=0x00FFFFFF;
8
  //LPC_SWM->PINASSIGN6 |=3<<24; // SCT OUTP_0 at P0.3
9
  LPC_SWM->PINASSIGN6 |=channel<<24; // SCT OUTP_0 at P0.3
10

11
  LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 8); // enable the SCT clock
12
  sct_fsm_init(); // Initialize SCT
13

14
  LPC_SCT->EVEN = (1 << 0);    // enable EVENT0 interrupt
15
  NVIC_EnableIRQ(SCT_IRQn); // enable SCT interrupt
16

17
  LPC_SCT->CTRL_L &= ~(1<<2); // start the SCT by clearing bit 2 in CTRL
18
}
19

20
void SCT_IRQHandler(void)
21
{
22
  uint32_t status = LPC_SCT->EVFLAG;
23

24
  //LPC_GPIO_PORT->NOT0 = 1 << 3;
25
  static uint16_t value=100;
26
  LPC_SCT->MATCHREL[1].L=value++;
27
  if(value>800)value=100;
28

29
  // Acknowledge interrupts
30
  LPC_SCT->EVFLAG = status;
31
  return;
32
}
Gast #3804188
Lesenswert?

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.

> }
Gast #3804214
Lesenswert?

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.
Gast #3804543
Lesenswert?

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;
> }
Gast #3804572
Lesenswert?

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.
Gast #3805156
Lesenswert?

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.
Gast #3805202
Lesenswert?

chris_ schrieb:
> Ich hoffe, dass ich irgendwann die PWM noch so weit hin kriege, dass ich
> auch analoge Töne erzeugen kann.

PWM ist immer ein Rechtecksignal, um daraus ein Analogsignal zu erzeugen 
verwendet man einen externen Filter:

http://provideyourown.com/2011/analogwrite-convert-pwm-to-voltage/

Direkt ein Analogsignal erzeugen geht mit Software Sigma-Delta-DAC. Hier 
ein Beispiel für AVR. Mit dem LPC810 ginge es natürlich viel besser und 
schneller mit SCT und Komparator, und es wurde auch schon programmiert, 
aber derjenige rückt nur das Binary raus, nicht sein Programm:

http://www.hobby-roboter.de/forum/viewtopic.php?f=5&t=141

Hier das Prinzip PWM gegen Sigma-Delta-DAC:

http://jjmk.dk/MMMI/Exercises/05_Counters_Shreg/No7_PWM_vs_SigmaDelta/index.htm
Gast #3805256
Lesenswert?

>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.
Gast #3812711
Lesenswert?

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.
Angehängte Dateien:
Gast #3812797
Lesenswert?

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?
Gast #3812811
Lesenswert?

>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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren