Hi,
ich habe mir ein Board mit einem dsPIC30F6011A erstellt. Dies
Funktioniert auch ganz gut. Leider kann es dazu kommen, dass die
Spannungsversorgung unter bestimmten Umständen (an denen ich keinen
Einfluss habe) einbricht (nur sehr kurz, aber lang genug) und somti der
Kontroller resettet.
Ist es irgenwie möglich, die Anzahl der Spannungseinbrüche (also wo der
Mikrocontroller aus und wieder an geht) zu zählen und den Wert zu
behalten? (Also den Wert behalten, obwohl der Kontroller aus war) Oder
besser noch, ist es möglicht, dass ich bevor der Kontroller aus ist noch
eine CAN-Botschaft rausschicken kann? (Also CAN an sich funktioniert)
zweiteres möglichkeit fände ich besser und wäre bestimmt durch einen
Kondensator möglich, wobei ich aber nicht wüsste, wie der Kontroller
unterscheiden kann, ob die Spannung von der Versorgungsspannung oder vom
Transistor her kommt.
Spannungsversorgung (12V DC) -> Spannungsregler(7805) -> Kondensator ->
Mikrocontroller
Also am Spannungsregler sind davor und dahinter Kondensatoren.
Johannes
Sehr kurz sollte sich mit einem Kondensator überbrücken lassen und wenn
Du die 12Volt über einen Spannungsteiler an einen Eingangspin führst
kannst Du die Aussetzer zählen.
Der 7805 hat eine Dropout-Spannung von 2V. Wenn Du einen Spannungsregler
mit einer niedrigeren Dropout-Spannung von zB 0.5V nimmst, darf die
Eingangsspannung um 1.5V tiefer abfallen, bevor es zu einem Ausfall
kommt.
Dann kannst Du zur Überbrückung einen Kondensator mit beispielsweise
22000uF/16V hinter den Spannungregler schalten. Damit solltest Du schon
einige Zeit überbrücken können.
fchk
Ja, einen Kondensator habe ich schon eingebaut. Damit funktioniert das
auch. Mit dem Spannungsteiler von den 12V auf einem Interrupt-Pin hatte
ich auch schon überlegt. Allerdings würde ich dann nicht erkennen, ob
der µC wirklich ausgegangen ist, oder dieser durch den Kondensator doch
noch verhindert wurde.
Möglich wäre, es durch einen reset-aufruf in der Interrupt-Routine,
sodass dieser auf jeden fall zurückgesetzt wird.
Jetzt habe ich die Brown-out-Reset Funktion gefunden und probiere dies.
Dabei versuche ich irgendwie beim Einschalten herauszufinden, ob der µC
durch den BOR zurückgesetzt worden ist und kann daraufhin eine Nachricht
herausschicken.
Dabei ist mir noch unklar, woarn erkannt wird, ob es nur ein
Spannungseinbruch war oder die Spannung abgeschaltet wurde.
Johannes schrieb:> Dabei ist mir noch unklar, woarn erkannt wird, ob es nur ein> Spannungseinbruch war oder die Spannung abgeschaltet wurde.
Garnicht, ist das gleiche für den BOR.
BOR sollte immer aktiviert sein damit die MCU nicht in einen Zustand
kommt in dem die Spannung zum sicheren Betrieb nicht mehr ausreicht, um
irgendwas zu tun, aber schon.
Diode + Elko um die VCC zu Puffern.
Diode weil sonst der Kondensator auch rückwärts die Quelle speist und
damit fast unwirksam wird.
Nun hast Du eine riesen Zeitkonstante in der der PIC weiterläuft auch
wenn die Spannung einbricht.
Alles was zum BOR führt ist dann kein glitch mehr.
Wozu Du die kurzen Spannungseinbrüche messen willst ist mir zwar unklar,
aber Spannungsteiler (vor der Diode) + IRQ bei fallender Flanke ist ja
nun nicht so das Ding.
Den Reset Grund (Watchdog, BOR etc.) kannst Du aus einem der vielen
Register auslesen. Datenblatt durchforsten.
Ich könnte mir das vorstellen:
Man hat ja Startupcode und EEPROM-Emulation. Beim Hochlauf liest man
einen Wert aus, zählt ihn hoch und schreibt ihn ins EEPROM zurück.
Es gibt glaube ich sogar ein eigenes FLAG, das den BOR anzeigt. Das
könnte man noch separat auslesen.
Jeder Hochlauf ist aber automatisch auch ein Brown-Out, das kann nicht
unterschieden werden.
Problem:
Flash Löschzyklen. Das dürften z.B. 10000 sein.
Zum Kondensator:
Der Kondensator muss VOR den Spannungsregler hin. Denn Q=C*U und U ist
der Betrag, um den die Spannung einbrechen darf. Das ist VOR dem 7805 um
die 5V, dahinter recht wenig.
Zu beachten wäre, dass der Kondensator vom 12V-Netz durch eine Diode
getrennt werden muss, sonst saufen dir andere Verbraucher deinen
Kondensator aus.
Ah,
das mit dem Kondensator habe ich schon geändert.
Wieso ich das ganze machen möchte? Es gibt mehrere Boards, mit denen
über CAN kommuniziert wird. Ab einem bestimmten Zustand wird
Leistungselektronik eingeschaltet. Dies ist/war der Zeitpunkt wo sich
mein Kontroller resettet hat. Wenn es zu diesem Vorfall gekommen wäre,
hätte ich gerne eine Nachricht an den anderen Boards gesendet, dass mein
Kontroller den Zustand verlassen hat und die nicht weiter arbeiten
müssen. Andersrum, wäre es genau so doof, wenn mein kontroller es dohc
noch geschafft hätte, ich den anderen aber mitgeteilt hätte, dass sich
mein board resettet hat, die daruafhin ihren Zustand verlassen und ich
mit der LEistungselektronik Leistung erstelle.
Jetzt versuche ich es mit dem EEPROM. Dazu möchte ich vor dem
Einschalten ein Bit mit HIGH beschreiben und beim ende wieder auf LOW.
Dieses Bit würde ich am Anfang vom Code immer überprüfen.
Du willst von einer unsicheren Komponente aus senden das die unsichere
Komponente ausgefallen ist ?
Dann mußt Du mit dem Ableben aber auch warten bis die CAN Nachricht
sicher übertragen wurde.
Die ist ja nicht angekommen nur weil Du sie an den Controller
losgeworden bist.
Quatsch mit Soße !
Jeder Busteilnehmer muß selber mitbekommen das irgendein Ereigniss
eingetreten ist das er mit wesentlichen Komponenten nicht mehr reden
kann.
Das macht man z.B. mit 'keep alive' Nachrichten oder ähnlichen
Mechanismen.