Forum: Mikrocontroller und Digitale Elektronik Reset beim Arduino steuerbar machen


von Moriz (untertaucher)


Angehängte Dateien:

Lesenswert?

Ich suche nach Schaltung, mit der man den Reset des Arduino Nano über 
das DTR-Signal per Software sperren kann. Sie sollte folgende 
Eigenschaften haben:

- wenn der Port-Pin des 328P auf Input steht, soll DTR einen Reset
  auslösen können.
- wenn der Port-Pin des 328P auf Output steht, soll DTR gesperrt oder
  frei geschaltet sein, je nach Ausgabesignal
- die Schaltung soll möglichst einfach aufgebaut sein

Ich habe lange überlegt, wie man das machen könnte, bin aber auf keine 
überzeugende Idee gekommen.

Hat jemand eine Idee?

Anhang: wie der Reset beim Nano realisiert ist.

von Christian M. (christian_m280)


Lesenswert?

Vor den Taster ein R und dort den Portpin dran. Dann kannst mit Low 
bootstrap hardware resetten. Deine Anforderungen sind zu umgekehrt!

Gruss Chregu

von Moriz (untertaucher)


Lesenswert?

Christian M. schrieb:
> Deine Anforderungen sind zu umgekehrt!

Per I/O-Port einen Reset auszulösen, ist nicht mein Ziel – einen 
SW-Reset bekomme ich auch mit dem Watchdog hin.

Sinn der Schaltung soll es sein, den Nano vor dem Reset zu schützen, 
wenn man ihn während des Betriebs per USB an den PC anschließt – der 
wird nämlich ausgelöst, wenn Linux das ttyUSB anlegt.

Auf der anderen Seite soll ein verflashter oder leerer Controller, der 
keine Kontrolle über den Pin geben kann, per Bootlader und avrdude neu 
programmiert werden können.

: Bearbeitet durch User
von Sebastian W. (wangnick)


Lesenswert?

Moriz schrieb:
> Sinn der Schaltung soll es sein, den Nano vor dem Reset zu schützen

DTR geht auf LOW um den RESET auszulösen. Der 100n erzeugt dann einen 
kurzen RESET-Puls.

Du kannst zum Beispiel zwischen DTR und diesen Kondensator einen NFET 
setzen, mit S an DTR, D am Kondensator, und G an deinem Port, und noch 
einem 10k von G/Port an VCC. Wenn dann der Port auf Input, oder auf 
Output High steht, leitet der FET und DTR löst den RESET aus; wenn aber 
der Port auf Output Low steht, sperrt der FET und DTR Low löst den RESET 
nicht aus.

LG, Sebastian

von Christian M. (christian_m280)


Lesenswert?

Ja eben, dann Pin auf High! Ich hab mir einen Jumper reingemacht...

Gruss Chregu

von Bauform B. (bauformb)


Lesenswert?

Ein leerer Controller schaltet den Pin nicht auf Output - Reset ist 
möglich. Ein gutes Programm macht das und verhindert so den Reset. Alles 
gut, aber: Ein böses Programm wird das (natürlich) auch machen. Also in 
erster Näherung ist es unmöglich.

Ein gutes Programm könnte auf einem Pin ein Rechteck ausgeben, und zwar 
per Programm, nicht per Timer. Die zusätzliche Hardware würde den Reset 
genau dann sperren, wenn die Frequenz stimmt. Natürlich würde ein böses 
Programm auch die richtige Frequenz ausgeben.

Man könnte die Sperre erst eine gewisse Zeit nach dem Einschalten 
freigeben. In der Zeit ist es egal, was das Programm macht, ein Reset 
ist möglich. Man muss dann nur schnell genug die Programmierung starten.

Deshalb benutze ich nicht DTR oder RTS, sondern sende ein BREAK. Ja, das 
kostet 5 oder 6 Bauteile, aber dafür funktioniert es. Bonus: es 
funktioniert auch ohne USB bzw. mit jedem USB-UART-Konverter, weil man 
nur die Datenleitungen braucht.

von Moriz (untertaucher)


Lesenswert?

Bauform B. schrieb:
> Also in erster Näherung ist es unmöglich.

In dem raren Fall müsste man einmal auf den Bootlader verzichten und den 
Chip per ISP flashen – das wäre in meinen Augen vertretbar.

> Deshalb benutze ich nicht DTR oder RTS, sondern sende ein BREAK. Ja, das
> kostet 5 oder 6 Bauteile, aber dafür funktioniert es.

RTS für Reset verwenden? Das ist Unsinn, RTS ist eine Handshakeleitung, 
die jederzeit vor einer neuen Datenübertragung vom Sender aktiviert 
werden kann – damit will man ganz sicher kein Reset lostreten…

Das mit dem BREAK könnte man machen, hat aber den Nachteil, dass das mit 
dem Arduino-Bootlader nicht kompatibel ist.

von Moriz (untertaucher)


Lesenswert?

Christian M. schrieb:
> Ja eben, dann Pin auf High! Ich hab mir einen Jumper reingemacht...

Ich habe das Teil in ein Gehäuse eingebaut, das will ich zum Flashen 
nicht aufschrauben müssen, denn sonst könnte ich auch gleich den ISP 
nehmen…

von Moriz (untertaucher)


Lesenswert?

Sebastian W. schrieb:
> Du kannst zum Beispiel zwischen DTR und diesen Kondensator einen NFET
> setzen, mit S an DTR, D am Kondensator, und G an deinem Port, und noch
> einem 10k von G/Port an VCC.

Ja, das isses wohl…

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.