Pages: 1 2 [3]   Go Down
Author Topic: Arduino aus Programm reseten?  (Read 3984 times)
0 Members and 1 Guest are viewing this topic.
NRW
Offline Offline
Sr. Member
****
Karma: 2
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aha zu hohe Stromhitze kühlen mit noch mehr Stromverbrauch.

Keine Gute Idee würde ich sagen
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 158
Posts: 3144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Schaltung ist relativ simpel: Lüfter mit Pin 13 und GND verbunden.
Wenn ich den Code zur Mittelwertbildung entferne bleiben die Temperatursprünge.

Du jagst also den vom Lüfter verbrauchten Strom (wieviel Strom? Leistung des Lüfters?) durch den Controller.
Und Du misst die Temperatur im Controller.

Dass der Strom durch den Controller auch eine Verlustleistung erzeugt (genau deshalb dürfen die I/O Pins ja nur mit einem bestimmten Maximalstrom beaufschlagt werden), die zur Erwärmung des Controllers beiträgt, ist Dir aber schon klar?
Logged

Offline Offline
Full Member
***
Karma: 5
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du jagst also den vom Lüfter verbrauchten Strom (wieviel Strom? Leistung des Lüfters?) durch den Controller.
Der Lüfter braucht 12V bei einem Watt.

Addi
Logged

  / \    _|  _| o
 /--\ (_| (_| |

Germany S-H
Offline Offline
Faraday Member
**
Karma: 158
Posts: 3144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Der Lüfter braucht 12V bei einem Watt.

Also bei Nennspannung 12V mal 1/12A = 1 Watt.

Bei 5V betrieben also 5/12 * 1/12 = 5/144 = 0,0347 A = rund ca. 35 mA.

Plus einiger Milliampere, die die Pin13 LED an Pin13 ja auch noch braucht, dürftest Du an Pin13 damit insgesamt knapp über die maximal am Pin zulässigen 40 mA kommen.

Wenn Du genau wissen möchtest, mit wieviel Milliwatt der Atmega beim Einschalten des Lüfters zusätzlich geheizt wird, müsstest Du mal den Spannungsabfall am Atmega messen, oder die Differenz bilden aus Board-Spannung und Spannung am Lüfter. Aber ein paar Milliwatt werden das bedingt durch den durch den Controller geleiteten Lüfterstrom durch den Atmega schon sein.
Logged

Global Moderator
Offline Offline
Newbie
*****
Karma: 13
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Der Lüfter braucht 12V bei einem Watt.

Also bei Nennspannung 12V mal 1/12A = 1 Watt.

Bei 5V betrieben also 5/12 * 1/12 = 5/144 = 0,0347 A = rund ca. 35 mA.

Plus einiger Milliampere, die die Pin13 LED an Pin13 ja auch noch braucht, dürftest Du an Pin13 damit insgesamt knapp über die maximal am Pin zulässigen 40 mA kommen.

Wenn Du genau wissen möchtest, mit wieviel Milliwatt der Atmega beim Einschalten des Lüfters zusätzlich geheizt wird, müsstest Du mal den Spannungsabfall am Atmega messen, oder die Differenz bilden aus Board-Spannung und Spannung am Lüfter. Aber ein paar Milliwatt werden das bedingt durch den durch den Controller geleiteten Lüfterstrom durch den Atmega schon sein.

Ein Motor ist kein linearer Widerstand. Diese Verhältnisrechnung kannst Du so nicht machen. Der Stromverbrauch hängt von den Verlusten im Motor, der Elektronik und der Belastung ab.  Ein 12V Lüfter läuft an 5V gar nicht sicher an. Ich rate ab, den Lüfter direkt am Pin anzuschleißen. Es braucht immer einen Transistor und benutze einen 5V Lüfter.

Grüße Uwe
Logged

Leverkusen
Offline Offline
Sr. Member
****
Karma: 4
Posts: 332
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Uwe,
habe beim stöbern diesen Thread gefunden. Ich selbst möchte auch den Arduino via externem Processing Programm reseten.
Ich habe dies gefunden:

http://www.instructables.com/id/two-ways-to-reset-arduino-in-software/

void(*resetFunc)(void) = 0;

Funktioniert, aber nicht immer. Ist Dein Vorschlag etwas anders, sprich besser? Und überhaupt, wo habt ihr diese Dinge her? smiley-eek smiley

LG
Willi
Logged

Offline Offline
Faraday Member
**
Karma: 126
Posts: 4092
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist brachial. Ein Funktionszeiger auf NULL. Ist mir auch schon aus Versehen passiert, aber es nicht etwas was man absichtlich machen sollte.

EDIT:
Das ist glaube ich nicht eine x-beliebige Funktion. Die Idee dahinter ist, dass er in den Reset Interrupt Vektor springt, der bei µC auf Adresse 0 ist...sollte es also theoretisch gehen.


Der absolut korrekte und sichere Weg ist über den Watchdog Timer:
http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_softreset

Man startet den Watchdog Timer, geht in eine Endlosschleife und 15ms später spring der Controller in den Reset Vektor, da der WTD nicht zurück gesetzt wird. Alles mit Mitteln die auch genau dafür vorgesehen sind und sich so verhalten wie definiert.

Code:
#include <avr/wdt.h>
...
#define soft_reset()        \
do                          \
{                           \
    wdt_enable(WDTO_15MS);  \
    for(;;)                 \
    {                       \
    }                       \
} while(0)

Muss auch kein Makro sein. Man kann das genauso in eine Funktion schreiben
« Last Edit: January 13, 2014, 08:35:39 am by Serenifly » Logged

Leverkusen
Offline Offline
Sr. Member
****
Karma: 4
Posts: 332
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Serenifly,
danke für den Tip. Ich habe das so
Code:
void Center::softReset() {
do                         
{                           
    wdt_enable(WDTO_15MS); 
    for(;;)                 
    {                       
    }                       
} while(0);
}
ausprobiert. Dann lies sich der Arduino nicht mehr flashen. Erst nach 10 sec. stromlos war er wieder da. wdt_enable wird in VS zwar als Fehler markiert, aber trotzdem compiliert. Was habe ich falsch gemacht?

LG
Willi
Logged

Offline Offline
Faraday Member
**
Karma: 126
Posts: 4092
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Keine Ahnung. Habe das noch gemacht.

Auf der AVR libc Seite, steht noch das:
Quote
CAUTION! Older AVRs will have the watchdog timer disabled on a reset. For these older AVRs, doing a soft reset by enabling the watchdog is easy, as the watchdog will then be disabled after the reset. On newer AVRs, once the watchdog is enabled, then it stays enabled, even after a reset! For these newer AVRs a function needs to be added to the .init3 section (i.e. during the startup code, before main()) to disable the watchdog early enough so it does not continually reset the AVR.

Code:
// Function Pototype
void wdt_init(void) __attribute__((naked)) __attribute__((section(".init3")));

...

// Function Implementation
void wdt_init(void)
{
    MCUSR = 0;
    wdt_disable();

    return;
}
Logged

Pages: 1 2 [3]   Go Up
Jump to: