Forum: Mikrocontroller und Digitale Elektronik P89LPC901 - keine Ausgabe auf Port0 und/oder Port1 :(


von Martin (Gast)


Lesenswert?

Hallo Mikrocontroller Gurus!

Ich verzweifle dabei einen Phillips (oder NXP) P89LPC901 in Betrieb zu 
nehmen. Ich habe schon alle Tricks versucht aber ich bekomme keine 
Ausgabe auf den Ports 0 und 1 hin. Auf Port 3 jedoch klappt es.

Dieses Programm erzeugt tatsächlich die gewünschte Ausgabe auf Port 3:
1
 000000          $ioP89LPC901.h
2
 000000          $bitdef_asm.h
3
 000000          
4
 000000                  org     0x00
5
 000000 75B100   main:   mov     P3M1,#0x00
6
 000003 75B203           mov     P3M2,#0x03
7
 000006 75B000   loop:   mov     P3,#0x00
8
 000009 D9FE     delay1: djnz    R1,delay1
9
 00000B 75B003           mov     P3,#0x03
10
 00000E D9FE     delay2: djnz    R1,delay2
11
 000010 0106             ajmp    loop
12
 000012

Im Gegensatz dazu kommt bei folgenden Programmen gar nix raus:
1
 000000          $ioP89LPC901.h
2
 000000          $bitdef_asm.h
3
 000000          
4
 000000                  org     0x00
5
 000000 758400   main:   mov     P0M1,#0x00
6
 000003 758530           mov     P0M2,#0x30
7
 000006 758000   loop:   mov     P0,#0x00
8
 000009 D9FE     delay1: djnz    R1,delay1
9
 00000B 758030           mov     P0,#0x30
10
 00000E D9FE     delay2: djnz    R1,delay2
11
 000010 0106             ajmp    loop
12
 000012

..auch auf Port 1 kommt kein Lebenszeichen:
1
 000000          $ioP89LPC901.h
2
 000000          $bitdef_asm.h
3
 000000          
4
 000000                  org     0x00
5
 000000 759100   main:   mov     P1M1,#0x00
6
 000003 759204           mov     P1M2,#0x04
7
 000006 759000   loop:   mov     P1,#0x00
8
 000009 D9FE     delay1: djnz    R1,delay1
9
 00000B 759004           mov     P1,#0x04
10
 00000E D9FE     delay2: djnz    R1,delay2
11
 000010 0106             ajmp    loop
12
 000012

Geprüft habe ich mit Oszilloskop und mit (und auch ohne) Pull-up 
Widerstände. Ich habe auch einen zweiten Chip in die Spur geschickt für 
den Fall, daß es ein Defekt sein könnte - leider ohne Ergebnis.

Port 0 teilt sich die Funktion mit dem Comparator. Laut Usermanual ist 
der aber nach dem Einschalten nicht aktiv. (Ich habe auch versucht den 
Comparator auszuschalten - kein Erfolg)

Auf dem Anschluß von Port 1 liegen noch Reset (input only) und T0. Die 
T0 Ausgabe müßte aber nach dem Einschalten auch inaktiv sein.

Weiterhin habe ich es nicht geschafft den internen Takt/2 auf dem Port 
3.0 auszugeben. Das ENCLK Bit im TRIM Register scheint keine Auswirkung 
zu haben.

Leider ist die Dokumentation von NXP ziemlich spärlich und an einigen 
Stellen auch noch falsch...

Ich hoffe Ihr habt schon einmal einen solchen Chip zur Mitarbeit 
überredet. Mir sind nämlich schon vor Tagen die Ideen ausgegangen.. :(

Vielen lieben Dank!
Martin

von R. W. (quakeman)


Lesenswert?

Also ich kann dir einen Tip bezüglich Port1 geben, da ich selber mal vor 
einem solchen Problem stand. Es ging dabei zwar um einen LPC936, aber 
der interne Aufbau der Ports ist identisch zum LPC901.

Du hast ja nur P1.2 und P1.5 von Port1 zur Verfügung. P1.5 ist input 
only und kann deshalb nicht als Ausgabe Pin benutzt werden. Und P1.2 
besitzt die Besonderheit, daß dieser Pin nur im Input oder Open-Drain 
Modus funktioniert. Push-Pull und Quasi-Bidirectional werden nicht 
unterstützt.

Leider steht dieser Hinweis nicht im LPC901 aber im LPC936 Datenblatt.
Wegen den beiden Pins von Port0 steht diesbezüglich zwar nichts drin, 
aber ich würde einfach mal den Ausgangsmodus von Push-Pull auf 
Quais-Bidirectional oder Open-Drain umstellen.

Ciao,
     Rainer

von Martin (Gast)


Lesenswert?

Hallo Rainer!

Vielen Dank für die Antwort!

Nach vielen weiteren Stunden habe ich nun doch noch das 
(selbstverschuldete) Problem gelöst: es lag an der Programmer-Software. 
**sehr-peinlich**

Das Programm war korrekt - kam aber leider nie so beim Chip an. Der 
Fehler blieb unerkannt, da ich den LPC901 nicht auslesen kann. Die 
berechnete CRC Prüfsumme schien zu stimmen - aber da die HEX-Datei schon 
falsch eingelesen wurde, war das in Wahrheit nur die Bestätigung, daß 
der Datenmüll richtig geflasht wurde.

Ich möchte mich daher bei allen entschuldigen, deren Zeit ich 
verschwendet habe. :(

Leider war nirgendwo im weiten Internet ein kleines Beispielprogramm mit 
der dazugehörigen richtigen CRC zu finden. Darum möchte ich das hier 
nachholen:
1
; Global CRC $C3F1FD56  ( LPC901 - Programm ab Adresse $0000 )
2
; Sector CRC $BA96D289
3
4
5
 000000                  org     0x00
6
 000000          main:   
7
 000000 759100           mov     P1M1,#0x00
8
 000003 7592FF           mov     P1M2,#0xff  ; Port 1 = Ausgang, Push-Pull
9
 000006 758400           mov     P0M1,#0x00
10
 000009 7585FF           mov     P0M2,#0xff  ; Port 0 = Ausgang, Push-Pull
11
 00000C 75B100           mov     P3M1,#0x00
12
 00000F 75B2FF           mov     P3M2,#0xff  ; Port 3 = Ausgang, Push-Pull
13
 000012 759501           mov     95h,#0x1    ; Fcpu = Fosc / (2 * DIVM)
14
 000015          loop:   
15
 000015 758000           mov     P0,#0
16
 000018 759000           mov     P1,#0       ; alle Pins auf Low
17
 00001B 75B000           mov     P3,#0
18
 00001E D9FE     delay1: djnz    R1,delay1   ; sehr kurze Pause
19
 000020 7580FF           mov     P0,#0xff
20
 000023 7590FF           mov     P1,#0xff    ; alle Pins auf High
21
 000026 75B0FF           mov     P3,#0xff
22
 000029 D9FE     delay2: djnz    R1,delay2   ; sehr kurze Pause
23
 00002B 0115             ajmp    loop
24
 00002D


gelernte Lektionen:
 1. eine (richtige?) Prüfsumme muß nicht bedeuten, daß alles nach Plan 
verlaufen ist
 2. Unicode-Funktionen und herkömmlige Funktionen zu mischen ist eine 
ganz dumme Idee :(


lg
Martin

von R. W. (quakeman)


Lesenswert?

Das heißt, P1.2 funktioniert bei dem LPC901 im Push-Pull Modus?

Falls ja, dann bezieht sich das von mir beschriebene Problem wohl erst 
auf die größeren LPC Versionen. Denn bei diesen bekommt der Pin 
zusätzlich die Funktion des I2C Busses mit auferlegt.

Ciao,
     Rainer

von Martin (Gast)


Lesenswert?

Ja, anders als bei den großen Brüdern können beim 901 alle Anschlüsse 
(außer dem Reset) als Push-Pull arbeiten.

Ich hatte mir in meiner Verzweiflung auf deinen Hinweis hin ja auch die 
User Manual zu den größeren P89LPC933/934/935/936 angesehen. Dort gibt 
es extra den Hinweis:

• Pin P1.5 is input only. Pins P1.2 and P1.3 are configurable for either 
input-only or open drain.

Ansonsten hilft diese Manual sehr beim Verständnis von einigen Dingen, 
die in der anderen Anleitung zu kurz kommen. Leider scheint ja die vom 
LPC901/2/3 irgendwie nicht mehr gepflegt zu werden...

Falls es hier im Forum mal eine Abteilung für die 8-Bit LPC gibt kann 
ich ja meinen improvisierten ICP Programmer nebst Software verfügbar 
machen.

von R. W. (quakeman)


Lesenswert?

Martin wrote:
> Ja, anders als bei den großen Brüdern können beim 901 alle Anschlüsse
> (außer dem Reset) als Push-Pull arbeiten.

Das klingt gut. Ich habe nämlich auch noch einen LPC901 hier in der 
Schublade, den ich bisher nur noch nicht benutzt habe.

> Falls es hier im Forum mal eine Abteilung für die 8-Bit LPC gibt kann
> ich ja meinen improvisierten ICP Programmer nebst Software verfügbar
> machen.

Also ich hätte schon Interesse dadran.
Momentan verwende ich ISP bei den größeren LPC900 oder ICP per Adapter 
mit meinem Galep4. Ein einfacher ICP Adapter (ohne extra Galep4 zu 
benutzen) wäre mir ansich aber lieber, falls ich mal ICP benötige.

Vielleicht kannst du ja den Schaltplan samt Software hier im Beitrag 
online stellen.

Ciao,
     Rainer

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Ich werde dazu nächste Woche einen neuen Thread eröffnen. Das Thema hier 
ist ja abgeschlossen.

Folgende Nachteile hat meine Lösung:
 - benötigt eine serielle Schnittstelle am Computer
  ( mit USB->Seriell Adapter funktioniert es auch - aber laaaaaaangsam..
    CRC über das eine kB des 901 dauert 20 Sekunden!
    Bei einer richtigen seriellen Schnittstelle nur 1 Sekunde!
    Das ist aber auch die Aktion, die am längsten dauert. )
 - ist noch unvollständig und die Oberfläche ist mangelhaft:
    > keine Einstellung für UCFG2,
    > Sector Protection nur für die ersten vier Sektoren
      ( der 901 hat ja nur vier ),
    > fehlende Auswahl des Sektors bei Aktionen für einzelne Sektoren
 - Stromversorgung über die serielle Schnittstelle ( wird bei größeren
   Chips oder Chips in einer Schaltung zum Problem - könnte man aber
   sicher ändern
 - Schaltung ist noch nicht optimal durchdacht - es war viel mehr nur
   eine "quick-and-dirty" Lösung um meinen bereits vorhandenen
   Tiny-11 Programmer zu zweckentfremden
 - Dokumentation ist noch nicht existent
   ( außer den Kommentaren im Quelltext )
 - ist grausamer Weise in Visual Basic geschrieben ^^

Es gibt aber auch Vorteile:
 - ist in Visual Basic geschrieben ( Quelltext wird dabei sein )
   => jeder kann seine benötigten Änderungen sofort selber realisieren
 - einfacher Aufbau mit nur einer Hand voll Transistoren und 
Widerständen
   => es werden keine vorprogrammierten Bausteine benötigt ( wie bei ISP 
)

Ein Screenshot befindet sich im Anhang an diesen Beitrag.

Ich hatte noch keine Zeit ein Layout oder einen Schaltplan zu zeichnen 
und dieses dann auch noch zu testen. Wer sich die Sache trotzdem schon 
anschauen oder ausprobieren ( und eine Doku schreiben g ) möchte, der 
kann mich anschreiben. Adresse sieht man im Fenstertitel auf dem 
Screenshot.  ;)

Bis demnächst!
Martin

von Matthias (Gast)


Angehängte Dateien:

Lesenswert?

>Also ich hätte schon Interesse dadran.
>Momentan verwende ich ISP bei den größeren LPC900 oder ICP per Adapter
>mit meinem Galep4. Ein einfacher ICP Adapter (ohne extra Galep4 zu
>benutzen) wäre mir ansich aber lieber, falls ich mal ICP benötige.

Das geht mit einer ICP Bridge und den MBC900 Board von Keil. (Kann man 
auch nachbauen, Schaltplan bei Keil verfügbar, das Hex-File findet man 
auch). FlashMagic unterstützt dann diese Kombination.

von R. W. (quakeman)


Lesenswert?

Matthias wrote:
> Das geht mit einer ICP Bridge und den MBC900 Board von Keil. (Kann man
> auch nachbauen, Schaltplan bei Keil verfügbar, das Hex-File findet man
> auch). FlashMagic unterstützt dann diese Kombination.

Diese Lösung hatte ich auch schon gefunden gehabt. Aber extra ein MCB900 
Board dafür erst aufbauen zu müssen finde ich etwas aufwendig.

Andererseits werde ich mir den Schaltplan des MCB900 mal anschauen, denn 
vielleicht kann ich mein selbst gebautes LPC935 Board anstatt des MCB900 
mit der ICP-Bridge Firmware von Keil dafür auch benutzen. :)

Ciao,
     Rainer

von Matthias (Gast)


Lesenswert?

>Andererseits werde ich mir den Schaltplan des MCB900 mal anschauen, denn
>vielleicht kann ich mein selbst gebautes LPC935 Board anstatt des MCB900
>mit der ICP-Bridge Firmware von Keil dafür auch benutzen. :)

Kannst auch ein selber gebautes Board mit LPC932 oder ähnlichen (Es muss 
ein LPC mit Bootloader sein, ab LPC920 glaub ich...) nutzen. Ist 
praktisch nur der µC und das COM-Interface erforderlich. Das hat den 
Vorteil, das Du FlashMagic weiter nutzen kannst. Wenn man direkt das 
ICP-Interface (SPI-ähnlich) der kleinen LPCs ansprechen will, braucht es 
sonst einer eigenen PC-Programmiersoftware.

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
Noch kein Account? Hier anmelden.