Forum: Mikrocontroller und Digitale Elektronik allgem. Frgen Atmega


von Timo P (Gast)


Lesenswert?

Hallo!

1) ist es möglich, einen codeblock als volatile zu definieren? WINAVR

2) kann man via SW den Controller stoppen bis er ein hardware reset
  bekommt? ich will Energiesparen, wenn der Controller seine Werte via
  UART weggesendet hat.

von ftf (Gast)


Lesenswert?

zu 2)
da gibts verschiedene sleepmodes und sowas. steht im Datenblatt.

von Rex Gildo jr. (Gast)


Lesenswert?

Moin!

1.) Codeblock volatile ? Volatile deklarier ich etwas, was von mehreren 
Threads/Funktionen aufgerufen oder verwendet wird. Damit der Compiler 
keine Optimierung durchführt die den Inhaltz beim Threadwechsel 
zerhacken könnten.
Also Felder, Variablen usw.

2.) http://www.mikrocontroller.net/articles/Sleep_Mode

Gruß

von (prx) A. K. (prx)


Lesenswert?

Timo P schrieb:

> 1) ist es möglich, einen codeblock als volatile zu definieren? WINAVR

In GCC 4.4 lässt sich für ganze Funktionen die Optimierung individuell 
einstellen/abschalten (attribute, pragma). Ist aber mit Vorsicht zu 
betrachten, volatile ist sinnvoller.

von Timo P (Gast)


Lesenswert?

wie wäre denn sie syntax? gibt es sowas:

#volatile
...
...
...
#endvolatile

??

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Timo P schrieb:
> Hallo!
>
> 1) ist es möglich, einen codeblock als volatile zu definieren? WINAVR

In C gibt es keine closures. Daher: nein.

> 2) kann man via SW den Controller stoppen bis er ein hardware reset
>   bekommt? ich will Energiesparen, wenn der Controller seine Werte via
>   UART weggesendet hat.

Da waere eher der Sleep-Modus Dein Freund. Aber mit dem watchdog laesst 
sich per SW auch ein reset herbeifuehren. HW-Reset heisst hier dass der 
reset-Vektor ausgeloest wird. Bei manchen AVR laeuft der watchdog dann 
allerdings weiter und muss in einer fruehen init-Phase (am besten vor 
main) wieder zurueckgesetzt werden.

Michael

von Timo P. (latissimo)


Lesenswert?

Der atmega wird bestromt, macht sein ding und geht aus
geht erst wieder an, wenn er neu vcc bekommt. So der Plan. Wie es sich 
hier anhört, ist es nicht möglich, den Controller auszuschlaten, sondern 
anscheinend *nur* in einen sleep-modus zu versetzen.

Ist dies korrekt?

von Karl H. (kbuchegg)


Lesenswert?

Timo P. schrieb:
> Der atmega wird bestromt, macht sein ding und geht aus
> geht erst wieder an, wenn er neu vcc bekommt. So der Plan. Wie es sich
> hier anhört, ist es nicht möglich, den Controller auszuschlaten, sondern
> anscheinend *nur* in einen sleep-modus zu versetzen.
>
> Ist dies korrekt?

Ja.

Allerdings kann sich der Controller durchaus auch selbst die 
Versorgungsspannung abschalten :-)
Du brauchst nur eine Möglichkeit die Versorgungsspannung schaltbar zu 
machen. Wenn der µC dann diesen Schalter bedienen kann ....

von m. keller (Gast)


Lesenswert?

wer soll ihn denn wieder anschalten?

Schau ins Datenblatt

von Timo P. (latissimo)


Lesenswert?

m. keller schrieb:
> wer soll ihn denn wieder anschalten?

Ein anderer Controller schaltet ihn wieder an. Bevor jetzt die Frage 
kommt: "HAHA, dann kann der schaltende Controller doch den, den er 
anschaltet auch ausschalten..." Da antworte ich dann: ne dann brauche 
ich für 6 "schaltbare" Controller ja 6 verschiedene VCC-Leitungen. Der 
Master schaltet zeitgleich alle device-controller an. Diese brauchen 
unterschiedlich lange für ihre Aufgaben und sollen deswegen selbst 
bestimmen, wann sie ausgehen.



Karl heinz Buchegger schrieb:

>Allerdings kann sich der Controller durchaus auch selbst die
>Versorgungsspannung abschalten :-)
>Du brauchst nur eine Möglichkeit die Versorgungsspannung schaltbar zu
>machen. Wenn der µC dann diesen Schalter bedienen kann ....

Ok wenn ich eine art flipflop aufbaue, die der Controller selbst 
ausschalten kann per portpin, dann habe ich das Problem, dass es per SW 
nicht geht, einfach umgangen, muss aber mehr Hardwareaufwand in kauf 
nehmen

von Karl H. (kbuchegg)


Lesenswert?

Timo P. schrieb:

> Ok wenn ich eine art flipflop aufbaue, die der Controller selbst
> ausschalten kann per portpin, dann habe ich das Problem, dass es per SW
> nicht geht, einfach umgangen, muss aber mehr Hardwareaufwand in kauf
> nehmen

Muss ja kein Flip-Flip sein. Ein Transistor, Basiswiderstand und 2 
Dioden könnten ja schon reichen.
Die beiden Dioden bilden ein Wired-OR und schalten den Transistor durch, 
welcher die Versorgungsspannung schaltet. Jeweils der Master und der 
Slave hängen am anderen Ende der Dioden. Der Master kann damit mit einer 
1 an seiner Diode den Transi durchschalten und damit den Slave 
aufwecken. Wird der Slave aufgeweckt, schaltet er als erstes den 
Selbsthaltepin ebenfalls auf 1, damit kann dann der Master den Pin 
loslassen, der Transi bleibt durchgesteuert. Ist der Slave fertig, geht 
sein Selbsthaltepin auf 0 und er dreht sich selbst den Saft ab.

Ob sich der Aufwand lohnt?
Kommt drauf an. Im Sleep Mode verbrauchen die Dinger so wenig Strom .... 
Da verbraucht dir das Flip-Flop wahrscheinlich schon mehr Strom :-)

von Timo P. (latissimo)


Lesenswert?

Batteriebetrieben vllt. nur Knopfzellen. Sede Sekunde wacht ein
ultra low power msp430 auf und bestromt ca 6 device-controller,
die alle ihre Messungen machen müssen. Das zieht dann strom!
Und ich will und muss an allen ecken strom sparen.

Mir ist als eher hardwarefremder nicht ganz klar wie ich die Schaltung 
aufbaue. VCC ist die einzige Leitung zum Controller hin(abgesehen von
RX,TX) diese VCC Leitung ist dauernd auf high. Nun brauche ich eine 
Schaltung, die ich per dauerVCC einschalte, aber per Portpin wieder 
ausschalte. Genau das ist mein Problem per Portpin ausschalten. WIE?!?

wenn ich sowas wie die selbsthaltung aufbauen würde, könnte ich nen 
Transistor in Emmitterschaltung nehmen, rückführen auf die Basis als 
Selbsthaltung und nen weiteren transistor als Öffner fürs ausschalten. 
Das Ausschalten müsste aber pemanent sein, also controller aus, 
auschalten bleibt aus, bis vcc auf low geht.
komm irgendwie nicht aus dem kreis raus, dass der controller schön nen 
Pin toggeln kann, aber wenn er ausgeht ist der pin auf low, wenn er high 
sein muss für controller ein, dann läuft der controller aber der pin 
braucht bis her hi ist und dann geht die schaltung net

stehe voll auf dem schlauch!

von Timo P. (latissimo)


Lesenswert?

Die Beispielschaltung habe ich verstanden. Dazu brauche ich aber eine 
zusätzliche Steuerleitung, nämlich die, die die Basis ansteuert.
Zusätzlich heißt zusätzlich zur VCC, die der Controller während seinen 
Aufgaben ja benötigt, klar... Evtl. kann ich es hier durchsetzten, dass 
ich wieder eine weitere Leitung nutzen darf..

dann hätte ich schon

RX
TX
GND
VCC
VCC controll
VCC2 special

die ich durch alle daugtherboards schicken muss :(


dann nehm ich die VCC-controll an die Basis wie folgt:



         -----------------------------|
         |                            |
         |      VCC                   |
         |       |                    |
         |   |---|        |------|    |
VCC-cltl-----|            |  pin |----|
             |->-|        |      |
                 |        |      |
                 |--------|VCC µC|
                          |------|

von P. S. (Gast)


Lesenswert?

Mal ueberlegt, ob das wirklich dein zentrales Problem ist? Bring doch 
erstmal die Grundsoftware zum Laufen. Und dann kannst du ja in Ruhe mal 
ausprobieren, ob dich der Sleepmode mehr Strom kostet, als den ganzen 
Kontroller staendig aus und ein zu schalten...

von STK500-Besitzer (Gast)


Lesenswert?

Dein Master müsste messen, ob noch eine gewisse Menge Strom fließt.
Im Sleepmode sollte der Betrag wesentlich geringer sein, als im 
laufenden Betrieb.
Oder:
Man misst vorher die Zeit, die ein Slave (maximal) braucht und stellt 
die Versorgungsspannung über den Master entsprechend lange zur 
Verfügung.
Oder:
Wenn der Master sowieso mit dem Slave in beide Richtungen kommuniziert, 
könnte der Slave auch einfach dem Master schreiben "Licht aus!"

>VCC ist die einzige Leitung zum Controller hin(abgesehen von
>RX,TX) diese VCC Leitung ist dauernd auf high. Nun brauche ich eine
>Schaltung, die ich per dauerVCC einschalte, aber per Portpin wieder
>ausschalte. Genau das ist mein Problem per Portpin ausschalten. WIE?!?

Wenn die VCC-Leitung (zum Slave) nicht geschaltet werden darf, dann 
kannst du die Sachen nur mit einem Sleepmode regeln.

von Timo P. (latissimo)


Lesenswert?

> Wenn der Master sowieso mit dem Slave in beide Richtungen kommuniziert,
> könnte der Slave auch einfach dem Master schreiben "Licht aus!"

Das hatte ich ja vor, und dann den Controller aus(geht ja net)


> Wenn die VCC-Leitung (zum Slave) nicht geschaltet werden darf, dann
> kannst du die Sachen nur mit einem Sleepmode regeln.

Das haben wir ja vorhin festgestellt, dass es nicht geht.
ich werde mir mal überlegen, ob ich den Controller wenigstens in den 
sleep-mode versetzte

von Ulrich (Gast)


Lesenswert?

Bei neueren AVR Controllern (z.B. Mega88PA) gibt es auch sleep modes wo 
der Stromverbrauch deutlich unter 1 µA (Im Bereich 0,1 µA) geht. Man muß 
dazu aber ohne Brownout detektor auskommen. Also vorsicht mit EEPROM 
Addresse 0 und einem Bootloader. Wenn man eine UART nutzen will, muß man 
aber mit dem Takt etwas aufpassen, denn der interne RC Takt reicht oft 
nicht, und ein Quarz braucht lange zum Starten.

Bei dem Strom wird sich ein externes Auschalten kaum noch lohnen. Da ist 
dann kaum noch ein Unterschied zu aus.

Es könnte dann sogar sinnvol sein den µC gar nicht wirklich neu zu 
starten, sonern einfach nur aufwecken, denn im Reset zustand braucht der 
µC recht viel Strom.

von Timo P. (latissimo)


Lesenswert?

das problem ist, dass der kunde via dipschalter zwischen 8 verschiedenen 
timings wählen kann( nach denen dann die devices aufgeweckt oder 
bestromt werden)

die timings liegen so zwischen 1s und 24h

von P. S. (Gast)


Lesenswert?

Kunde...? Du willst das doch nicht etwa Jemandem verkaufen?

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.