I
Igor \"Knight\" Ivanov
Guest
Hi, NG!
Ich bin in einem schlechten Film.
Man setze einen Philips P89LPC932 Controller, Rev. G, im PLCC28-Gehäuse,
(http://www.semiconductors.philips.com/acrobat/datasheets/P89LPC932-03.pdf)
in folgender Beschaltung ein:
1. Der Controller wird von einem 12MHz Quarz getaktet (per
Flash-Konfiguration). Der Generator läuft stabil.
2. Die Stromversorgung leistet ein LM2936-3.3 LDO von 10V auf 3V3. 22uF
Tantal + 0.22uF KerKo am Ausgang, nah am Controller. Ein 2K2 Widerstand ist
an die Stromversorgung angeschlossen, um diese nach dem Abschalten sicher
bis auf 0V fallen zu lassen. Der Grund: "Vdd Fall Time" lt. Datenblatt Table
8, Seite 45 und Punkt 8.15, Seite 25.
3. Nach dem Start werden per Software alle Port-Pins (mit wenigen Ausnahmen
wie P1.2, P1.3 und P1.5) als Quasi-Bidirectional definiert. Der Grund: nach
dem Reset sind alle Port-Pins lt. Datenblatt [Punkt 8.12, ab Seite 22] als
Eingänge ohne Pull-ups definiert, und damit sie im Betrieb nicht "floaten",
werden sie halt in Quasi-Bidirectional umgewandelt.
4. Der RESET-Pin (P1.5), bloß als Eingang definiert (Voreinstellung), ist
direkt an die Stromversorgung angeschlossen, um Missverständnisse zu
vermeiden, denn lt. Punkt 8.15, Seite 25, wird der Pin während "Power up"
trotzdem als Reset behandelt und darf zu dem Zeitpunkt nicht LOW sein.
5. Der Controller steuert über seine PWM-Ausgänge (Port-Pins P1.6, P1.7,
P2.1, P2.6) NMOS-Fets (Si9936DY). Diese Ausgänge werden als Push-Pull
definiert.
Mehr ist am Controller nichts dran.
Und jetzt kommt's:
Wenn man mit der Stromversorgung zwecks Zuverlässigkeitstests spielt, indem
diese aus- und nach zufälligen Pausen (zwischen unter einer Sekunde bis
einigen Sekunden) wieder eingeschaltet wird, kann man nach einigen Versuchen
die Situation reproduzieren, wo der Controller sich selber UMPROGRAMMIERT,
indem er zufällig die SICHERHEIT-BITS setzt (das Programm selber enthält
keinen Code für)!
Die Tatsache, dass die Sichetheit-Bits gesetzt worden sind, kann man
feststellen, indem diese mit FlashMagic (so ein Programmwerkzeug von Philips
für ISP-Programmierung) ausgelesen werden.
Der Speicherinhalt mit Code selber bleibt erhalten, denn das Programm läuft
weiterhin (man kann das mehr oder weniger zuverlässig feststellen, indem man
aus verschiedenen Programmabschnitten heraus die oder jene Port-Pins
ansteuert und diese beobachtet), und es sind keine unvorgesehenen Sprünge
festzustellen. Bloß werden im Programm einige Konstanten per MOVC A, @A+DPTR
aus dem Code geholt, und sobald die Sichetheit-Bits plötzlich programmiert
worden sind, tut der MOVC-Befehl nicht mehr richtig, die Konstanten sind
dann falsch, und das Programm rechnet falsch. Wenn man den Controller jedoch
neuprogrammiert und als Ergebnis auch die Sichetheit-Bits löscht,
funktioniert alles wieder richtig, u.s.w....
Ich weiss, die Frage ist sehr speziell...
TIA,
Igor.
Ich bin in einem schlechten Film.
Man setze einen Philips P89LPC932 Controller, Rev. G, im PLCC28-Gehäuse,
(http://www.semiconductors.philips.com/acrobat/datasheets/P89LPC932-03.pdf)
in folgender Beschaltung ein:
1. Der Controller wird von einem 12MHz Quarz getaktet (per
Flash-Konfiguration). Der Generator läuft stabil.
2. Die Stromversorgung leistet ein LM2936-3.3 LDO von 10V auf 3V3. 22uF
Tantal + 0.22uF KerKo am Ausgang, nah am Controller. Ein 2K2 Widerstand ist
an die Stromversorgung angeschlossen, um diese nach dem Abschalten sicher
bis auf 0V fallen zu lassen. Der Grund: "Vdd Fall Time" lt. Datenblatt Table
8, Seite 45 und Punkt 8.15, Seite 25.
3. Nach dem Start werden per Software alle Port-Pins (mit wenigen Ausnahmen
wie P1.2, P1.3 und P1.5) als Quasi-Bidirectional definiert. Der Grund: nach
dem Reset sind alle Port-Pins lt. Datenblatt [Punkt 8.12, ab Seite 22] als
Eingänge ohne Pull-ups definiert, und damit sie im Betrieb nicht "floaten",
werden sie halt in Quasi-Bidirectional umgewandelt.
4. Der RESET-Pin (P1.5), bloß als Eingang definiert (Voreinstellung), ist
direkt an die Stromversorgung angeschlossen, um Missverständnisse zu
vermeiden, denn lt. Punkt 8.15, Seite 25, wird der Pin während "Power up"
trotzdem als Reset behandelt und darf zu dem Zeitpunkt nicht LOW sein.
5. Der Controller steuert über seine PWM-Ausgänge (Port-Pins P1.6, P1.7,
P2.1, P2.6) NMOS-Fets (Si9936DY). Diese Ausgänge werden als Push-Pull
definiert.
Mehr ist am Controller nichts dran.
Und jetzt kommt's:
Wenn man mit der Stromversorgung zwecks Zuverlässigkeitstests spielt, indem
diese aus- und nach zufälligen Pausen (zwischen unter einer Sekunde bis
einigen Sekunden) wieder eingeschaltet wird, kann man nach einigen Versuchen
die Situation reproduzieren, wo der Controller sich selber UMPROGRAMMIERT,
indem er zufällig die SICHERHEIT-BITS setzt (das Programm selber enthält
keinen Code für)!
Die Tatsache, dass die Sichetheit-Bits gesetzt worden sind, kann man
feststellen, indem diese mit FlashMagic (so ein Programmwerkzeug von Philips
für ISP-Programmierung) ausgelesen werden.
Der Speicherinhalt mit Code selber bleibt erhalten, denn das Programm läuft
weiterhin (man kann das mehr oder weniger zuverlässig feststellen, indem man
aus verschiedenen Programmabschnitten heraus die oder jene Port-Pins
ansteuert und diese beobachtet), und es sind keine unvorgesehenen Sprünge
festzustellen. Bloß werden im Programm einige Konstanten per MOVC A, @A+DPTR
aus dem Code geholt, und sobald die Sichetheit-Bits plötzlich programmiert
worden sind, tut der MOVC-Befehl nicht mehr richtig, die Konstanten sind
dann falsch, und das Programm rechnet falsch. Wenn man den Controller jedoch
neuprogrammiert und als Ergebnis auch die Sichetheit-Bits löscht,
funktioniert alles wieder richtig, u.s.w....
Ich weiss, die Frage ist sehr speziell...
TIA,
Igor.