mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Stromsparen und Atmega8?


Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich arbeite an einem Projekt welches sehr leistungskritisch ist.
Meine Versorgungsspannung bricht mir leider stark ein, meine Frage nun,
gibt es irgendwelche Möglichkeiten beim ATMEGA8 Strom zu sparen?
Vllt zusätzliche Hardware auszuschalten?
Ich brauche zur Zeit einen ADC und einen Timer.

MFG Julian

Autor: Schluff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Höchste Leistungseffizienz erreicht man immer durch ein ausgereiftes 
Energiekonzept.
Ein Zusammenbruch der Versorgungsspannung ist nicht evident, solange der 
Benutzer nicht zusammenbricht.

Konkrete Frage - konkrete Antwort!

Autor: Schrotty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bricht dir die Spannung im Betrieb ein und "erholt" sich wieder, oder 
betreibst du das Ganze aus einem Akku und willst einfach die "Laufzeit" 
verlängern?

Autor: sbyxc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Deine Versorgung wirklich so labol ist, dass diese ein Atmega8 zum 
Einbrechen bringt, dann nusst Du diese verstaerken.
Ich allerding glaube meiner Glaskugel entnehmen zu koennen, dass fuer 
solche Probleme meistens die Peripherie verantwortlich ist.
Also lass mal sehen, was alles aus der Versorgungsspannung betrieben 
wird.

Gast

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Atmega8 ist auch ein ganz schöner Stromfresser ;)
Großen Kondensator dran. Und wann immer möglich schlafen legen.
Gute NAcht

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schaltung kann so weit nicht verändert werden.
Aber anscheinend gibt es nichts um den ATMEGA etwas zahmer zu machen, 
egal muss auch ohne gehen ;).

Danke für die Antworten!

MFG Julian

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> Schaltung kann so weit nicht verändert werden.

Naja, einen ATmega88P kannst du ohne Veränderung der Schaltung
einsetzen.  Zusammen mit angepasster Firmware kannst du damit
durchaus Energie sparen.

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
der hört sich gar nicht so schlecht an. Was müsste geändert werden?
Das Programm?

Anderer Gedanke, wenn ich die Frequenz verringere müsste sich ebenfalls 
die Stromaufnahme verringern oder etwa nicht? Laufe zur Zeit auf 8Mhz, 
da würden 4Mhz auch schon reichen.

MFG

Autor: Schrotty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anderer Gedanke, wenn ich die Frequenz verringere müsste sich ebenfalls
die Stromaufnahme verringern oder etwa nicht? Laufe zur Zeit auf 8Mhz,
da würden 4Mhz auch schon reichen.

--> das ist auf jeden Fall ein Ansatz!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schrotty schrieb:
> Anderer Gedanke, wenn ich die Frequenz verringere müsste sich ebenfalls
> die Stromaufnahme verringern oder etwa nicht?

Die Stromaufnahme ja, der Energieverbrauch nicht.  Geht ja alles
entsprechend langsamer.

Autor: Schrotty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die Stromaufnahme ja, der Energieverbrauch nicht.  Geht ja alles
>entsprechend langsamer.

klar, im Prinzip schon, wenn der Controller dadurch doppelt so lange 
rechnen muss, aber wenn der Controller softwaremässig irgendwo an einer 
Abfrage "hängt" und z.B auf einen Tastendruck wartet, dann braucht er in 
dieser Zeit weniger Strom wobei die Zeit zwischen den "Aktionen" von 
externen Ereignissen gesteuert und somit konstant bleibt.
Daher kann doch schon von einer Reduzierung ausgegangen werden.

Letztendlich rührt die Verlustleistung eines Controllers ja von den 
Umschaltvorgängen in den Registern her. Und wenn pro Zeiteinheit weniger 
davon durchgeführt werden, dann sinkt die mittlere Stromaufnahme.

Autor: Schrotty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder anderes Beispiel:
Wenn der Controller eine bestimmte, konstante zeit läuft und immer 
wieder die gleiche Berechnung durchführt, es aber für die Applikation 
ausreichend ist, wenn der Controller in der bestimmten Zeiteinheit die 
Berechnung nur halb so oft durchführt, dann kann man mit der Reduzierung 
des Taktes durchaus Strom (oder Energie) sparen...

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Die Stromaufnahme ja, der Energieverbrauch nicht.  Geht ja alles
> entsprechend langsamer.

Auf die CPU alleine bezogen richtig. Bei höherem Takt (und damit höherem 
Stromverbrauch) steigt aber der Verlust am (Innen-)Widerstand der 
Stromversorgung.

Das kann relevant sein, muss aber nicht, kommt immer auf den 
Anwendungsfall an.

Andreas

Autor: LordZiu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Die Stromaufnahme ja, der Energieverbrauch nicht.  Geht ja alles
> entsprechend langsamer.

Das wurde in der aktuellen Elektorausgabe eindeutig widerlegt. Da wurden 
Tests gemacht, die zeigten, dass es (energietechnisch) günstiger ist, 
kurze aber schnelle Operationen durchzuführen, als längere, langsamere.
Ob das mit der Aussage von Andreas zu erklären ist, weiß ich aber nicht.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
um wieivel strom geht es überhaupt? Bist du sicher das es dir um 1-2mA 
geht?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Da wurden Tests gemacht, die zeigten, dass es (energietechnisch) günstiger >ist, 
kurze aber schnelle Operationen durchzuführen, als längere, langsamere.

Kann ich aus eigenen Messungen ebenfalls bestätigen.

@jaytharevo:
Schalte alles an Peripherie im Controller ab, was Du gerade nicht 
brauchst und nur dann kurz an wenn Du es benötigst.
Schau dir mal den ATmega88PA an. Das wäre genau der richtige Controller 
für dich. Der ist zwar in D kaum erhältlich, aber vielleicht hast Du ja 
die Möglichkeit bei Digikey oder Mouser (mit) zu bestellen.

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LordZiu schrieb:
> Das wurde in der aktuellen Elektorausgabe eindeutig widerlegt. Da wurden
> Tests gemacht, die zeigten, dass es (energietechnisch) günstiger ist,
> kurze aber schnelle Operationen durchzuführen, als längere, langsamere.

Wenn man nur die Berechnung an sich betrachtet, kann das hinkommen, da 
man dann aufgrund des statischen Stromverbrauchs durch Leckströme in der 
kürzeren Zeit weniger Energie verbraucht.

Wenn man die schnellere CPU aber den Rest der Zeit, den die langsamere 
braucht, im Sleep-Modus weiter mit Strom versorgt (in der Regel wird das 
Gerät ja nicht nach einer Berechnung wieder ausgeschaltet), dürfte da 
im wesentlichen kein Unterschied mehr sein, ausser die CPU hat im 
Sleep-Modus deutlich kleinere Leckströme.

Betrachtet man im letzteren Fall (also im wesentlichen gleicher 
Energieverbrauch der beiden CPUs) aber den Energieverlust in der 
Stromversorgung, so gilt dort P=I^2*R. Die Verlustleistung dort steigt 
also letztlich mit dem Quadrat des Taktes, während die Rechenleistung 
nur linear zunimmt, deshalb ist es dann insgesamt günstiger, langsamer 
und dafür länger zu rechnen.

Andreas

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist des denn eine ATmega8L oder ein normaler ATmega8?

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist ein ATMEGA8.

Naja, die Anwendung ist nicht wirklich zeitkritisch, also wäre es egal 
wenn er etwas länger benötigt. Es geht hier um die momentane 
Stromaufnahme und eben nicht die Dauer.

D.h. es ist besser wenn er 10min 1mA konsumiert als 5min 2mA (falls man, 
das so rechnen kann).

Danke für eure Antworten, aber ich seh schon da ist nicht viel zu holen. 
Ich schau mal, vllt kann ich an der Hardware auch noch was machen :).
Der ATMEGA88P wäre dann natürlich der letzte Ausweg.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Ferber schrieb:

> Wenn man nur die Berechnung an sich betrachtet, kann das hinkommen, da
> man dann aufgrund des statischen Stromverbrauchs durch Leckströme in der
> kürzeren Zeit weniger Energie verbraucht.

Leckströme sind Leckströme, die sind auch im Sleep noch da (idealer-
weise nur noch die).  Die einzige Methode, wie man diese reduzieren
könnte während des Sleeps wäre eine Reduzierung der Betriebsspannung.
Wird meines Wissens aber nicht gemacht.

> (in der Regel wird das
> Gerät ja nicht nach einer Berechnung wieder ausgeschaltet),

Genau da liegt aber das Einsparpotenzial.  Man muss sich bemühen,
den Prozessor möglichst nicht "Kreise drehen" zu lassen, sondern
ihn schlafen zu legen so häufig es geht.  Jedes _delay_us() etc.
ist energiepolitisch Mist, _delay_ms() verbietet sich bei einer
solchen Applikation nahezu von selbst.  Timer programmieren,
schlafen legen, warten auf Interrupt, weiter.

> Betrachtet man im letzteren Fall (also im wesentlichen gleicher
> Energieverbrauch der beiden CPUs) aber den Energieverlust in der
> Stromversorgung, so gilt dort P=I^2*R.

Das geht davon aus, dass der Innenwiderstand der Energiequelle ein
Ohmscher sei.  Ist er aber nicht (bzw. nur zu einem geringen Teil),
ansonsten könnte man ihn ja gleich ausbauen. ;-)  Der Innenwiderstand
ist doch nur ein fiktives Maß dafür, wie weit sich die Quellspannung
unter Last verringert.  An ihm wird aber keine (oder nur sehr wenig)
Energie "verheizt".

Allerdings gebe ich dir Recht dahingehend, wenn durch die höhere
Taktfrequenz die Strombelastung für die Quelle zu hoch wird, dann
ist es natürlich nicht mehr egal, ob man sich eine hohe Frequenz mit
kurzer Ausführungszeit oder eine niedrige mit langer Zeit auswählt.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> Der ATMEGA88P wäre dann natürlich der letzte Ausweg.

Nun, er hätte die erste Wahl sein müssen statt der letzte Ausweg.
Allein die nicht-P-Variante hätte dir schon massig Einsparpotenzial
im Vergleich zum Großvater ATmega8 geboten.

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja mangels Erfahrung (halbes Jahr im µC Bereich unterwegs), hab ich 
eben einen ATMEGA8 und keinen 88P.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> Tja mangels Erfahrung (halbes Jahr im µC Bereich unterwegs), hab ich
> eben einen ATMEGA8 und keinen 88P.

Kostet es denn so viel, ihn noch zu tauschen?

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haha, nein die ~3€ sind nicht das Problem.

Es geht mir hier lediglich um den Aufwand- Nutzenfaktor. Wie gesagt ich 
werd mir noch mal die Hardware anschauen. Wenn dort nichts zuholen ist, 
muss eben der 88er herhalten ;).

Die Möglichkeit den µC jedes mal Schlafen zulegen wenn er nichts zu tun 
hat wäre natürlich eine Möglichkeit, da aber der ADC ständig seine 
Arbeit verrichten muss und diese Ausgewertet ist es etwas sinnlos ihn 
für Xµs schlafen zu legen ;).

Danke für eure Tipps.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> Danke für eure Antworten, aber ich seh schon da ist nicht viel zu holen.

Ooch, da ist ne Menge zu machen (diverse Power-Down Modi, kleinerer 
Quarz. kleinere VCC), aber dazu müßte man Deine Software kennen und was 
die machen soll.
Die ATmega48/88 haben natürlich wesentlich mehr Sparoptionen.


> Der ATMEGA88P wäre dann natürlich der letzte Ausweg.

Generell sollte man für ein neues Preojekt immer auch einen aktuellen MC 
verwenden.
Die ATmega48/88 sind doch gut verfügbar.
Wenns aber unbedingt P sein soll, CSD hat z.B. den ATmega328P.


Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> da aber der ADC ständig seine
> Arbeit verrichten muss und diese Ausgewertet ist es etwas sinnlos ihn
> für Xµs schlafen zu legen ;).

Nein, ist es nicht.  So schnell ist der ADC ja ohnehin nicht, und
es gibt einen eigenen Schlafmodus, der nur dafür da ist, dass die
Takt-Wackelei während der ADC-Messung so weit reduziert wird, dass
das Messergebnis davon nicht verfälscht wird.

Du musst den Controller ja nicht in den Tiefschlaf versenken, aber
selbst ein idle sleep bringt schon eine Energieverbrauchseinsparung.

Autor: Wolfgang Heinemann (frickelkram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Julian,

Julian Schild schrieb:
> Haha, nein die ~3€ sind nicht das Problem.
>
> Es geht mir hier lediglich um den Aufwand- Nutzenfaktor. Wie gesagt ich
> werd mir noch mal die Hardware anschauen. Wenn dort nichts zuholen ist,
> muss eben der 88er herhalten ;).
>
> Die Möglichkeit den µC jedes mal Schlafen zulegen wenn er nichts zu tun
> hat wäre natürlich eine Möglichkeit, da aber der ADC ständig seine
> Arbeit verrichten muss und diese Ausgewertet ist es etwas sinnlos ihn
> für Xµs schlafen zu legen ;).

Gerade an der Stelle glaube ich dass Du sehr wohl sparen kannst. Die 
Interne Spannungsreferenz zum Beispiel. Musst Du wirklich "konstant 
messen"? Du sagst dass die CPU ruhig langsam sein kann. Wie hoch ist 
denn Deine Messrate? Wenn Du hier an die Grenze gehst kannst Du bestimmt 
einiges raus holen. Wie genau muss die Messung sein? Brauchst Du 
überhaupt eine genaue Referenzspannung?

>
> Danke für eure Tipps.

Schreibe doch einfach mal wie viel Strom Du im Moment brauchts und die 
viel Du einsparen musst. Dann können wir schon recht gut abschätzen ob 
Dir das Sparen was bringt.

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Leckströme sind Leckströme, die sind auch im Sleep noch da (idealer-
> weise nur noch die).  Die einzige Methode, wie man diese reduzieren
> könnte während des Sleeps wäre eine Reduzierung der Betriebsspannung.
> Wird meines Wissens aber nicht gemacht.

Eben. Und deshalb ist es für den Energieverbrauch der CPU egal, ob man 2 
Sekunden bei 4 MHz rechnet, oder ob man 1 Sekunde bei 8 MHz rechnet und 
dann 1 Sekunde schläft.

>> (in der Regel wird das
>> Gerät ja nicht nach einer Berechnung wieder ausgeschaltet),
> Genau da liegt aber das Einsparpotenzial.  Man muss sich bemühen,
> den Prozessor möglichst nicht "Kreise drehen" zu lassen, sondern
> ihn schlafen zu legen so häufig es geht.

Davon bin ich schon ausgegangen, nicht dass die Wartezeit mit 
Warteschleifen verbracht wird. Was ich meinte mit Ausschalten ist das 
Abklemmen der Versorgung, um die Leckströme zu unterbinden.

>> Betrachtet man im letzteren Fall (also im wesentlichen gleicher
>> Energieverbrauch der beiden CPUs) aber den Energieverlust in der
>> Stromversorgung, so gilt dort P=I^2*R.
> Das geht davon aus, dass der Innenwiderstand der Energiequelle ein
> Ohmscher sei.

Ganz so einfach ist es für eine reale Stromquelle nicht, richtig, da 
dort z.B. der Innenwiderstand auch stromabhängig sein kann. Wobei bei 
den meisten realen Stromquellen der Innenwiderstand bei steigendem Strom 
eher steigen als sinken dürfte. Damit geht es dann eher noch in Richtung 
P ~ I^3.

Was sonst noch für Terme bei der Berechnung der Verluste vorkommen ist 
aber völlig egal, entscheidend ist der eine (mindestens) quadratische 
Term, der in jedem Fall vorhanden ist.

> Ist er aber nicht (bzw. nur zu einem geringen Teil),
> ansonsten könnte man ihn ja gleich ausbauen. ;-)  Der Innenwiderstand
> ist doch nur ein fiktives Maß dafür, wie weit sich die Quellspannung
> unter Last verringert.  An ihm wird aber keine (oder nur sehr wenig)
> Energie "verheizt".

Nimm zwei identische Batterien (gleicher Ladungszustand), und entlade 
sie, einmal mit einem niedrigen und einmal mit einem hohen Strom. Mit 
dem niedrigen Strom wirst du insgesamt mehr Energie aus der Batterie 
ziehen können als mit dem hohen Strom. Da aber vorher die gleiche 
(chemische) Energie in beiden Batterien steckte, ist ganz offensichtlich 
beim hohen Strom der Verlust höher als beim niedrigen.

Dann mach mal einen (idealen) Kurzschluss mit einer frischen Batterie. 
Dabei wird die komplette Energie am Innenwiderstand verheizt, bei 
einer Klemmenspannung von 0V. Wenn das nicht so wäre, würde sich die 
Batterie dabei nicht entladen, Stichwort Energieerhaltung.

Andreas

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Ferber schrieb:
> Nimm zwei identische Batterien (gleicher Ladungszustand), und entlade
> sie, einmal mit einem niedrigen und einmal mit einem hohen Strom. Mit
> dem niedrigen Strom wirst du insgesamt mehr Energie aus der Batterie
> ziehen können als mit dem hohen Strom.

leider gibt es da auch wieder ein extrem. Wenn ich die Batterie mit 
einem unentlich grossen Widerstand entlade, dann habe ich keine Energie 
entnommen und die Batterie ist auch irgendwann leer.

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Ferber schrieb:
> Was sonst noch für Terme bei der Berechnung der Verluste vorkommen ist
> aber völlig egal, entscheidend ist der eine (mindestens) quadratische
> Term, der in jedem Fall vorhanden ist.

Ergänzend noch: natürlich könnte man jetzt hingehen und eine 
Stromversorgung konstruieren, bei der diese Terme alle kompensiert 
werden. Das wäre aber dann genau das, ein konstruierter Fall, und hätte 
mit normalen Stromversorgungen, mit denen man es meist zu tun hat, wenn 
es auf's letzte bisschen Effizienz ankommt, wie z.B. Batterien und 
Akkus, nicht wirklich viel zu tun.

Andreas

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Ferber schrieb:
> Nimm zwei identische Batterien (gleicher Ladungszustand), und entlade
> sie, einmal mit einem niedrigen und einmal mit einem hohen Strom. Mit
> dem niedrigen Strom wirst du insgesamt mehr Energie aus der Batterie
> ziehen können als mit dem hohen Strom.

Das ist aber nicht unser Testfall.

Nimm zwei identische Batterien und entnimm ihnen gepulst die gleiche
Ladungsmenge, das eine Mal durch längere Entnahme bei geringem Strom,
das andere Mal umgekehrt.  Der Unterschied wird bei weitem nicht mehr
so groß sein wie in deinem Szenario.  Die Energie wird am Innenwider-
stand (größtenteils) nicht verheizt, sondern sie ist beim höheren
Strom nicht entnehmbar, aber dennoch weiterhin vorhanden.  Die
kurzzeitige Entladung gestattet der Batterie längere Erholungsphasen,
sodass sie beim nächsten Entladevorgang wieder "frisch ans Werk"
gehen kann.

Gegenläufig zum von dir genannten Effekt kommt aber hinzu, dass der
Controller selbst bei geringerer Spannung auch eine geringere Strom-
aufnahme hat.

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Gegenläufig zum von dir genannten Effekt kommt aber hinzu, dass der
> Controller selbst bei geringerer Spannung auch eine geringere Strom-
> aufnahme hat.

Ack.

Es bleibt unterm Strich: es kommt darauf an, man muss im Einzelfall 
schauen, was das günstigste ist.

Andreas

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Tja mangels Erfahrung (halbes Jahr im µC Bereich unterwegs), hab ich
>eben einen ATMEGA8 und keinen 88P.

Wenn schon, dann keinen 88P, sondern einen 88PA. Der ist nochmal einen 
Tick sparsamer.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris schrieb:
> Der ist nochmal einen
> Tick sparsamer.

Aber schlechter verfügbar (im Moment).  Lass ihn doch erstmal den
Rest seines Einsparpotenzials ausreizen, mir scheint, hier geht's
noch lange nicht um das letzte Mikroampere.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite

>Lass ihn doch erstmal den
>Rest seines Einsparpotenzials ausreizen,

Welche EInsparpotentiale? Der OP und das Forum reden über des Kaisers 
neue Kleider! NICHTS Substantielle! Klarer Fall für Netiquette!!

>mir scheint, hier geht's
>noch lange nicht um das letzte Mikroampere.

Eben. Eh das mal ne Rolle spielt, muss man schon einiges machen. Vor 
allem mal klar kommunizieren.

MFG
Falk

Autor: Dr.PillePalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin
zBsp.:

ACD: Analog Comparator Disable

+

enter ADC Noise Reduction mode, stopping the CPU but allowing the ADC, 
the external interrupts, the
Two-wire Serial Interface address watch, Timer/Counter2 and the Watchdog 
to continue

Mehr fällt mir dazu jetzt nicht ein.

mal das Datenblatt durchforsten !

mfg

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> Ich brauche zur Zeit einen ADC und einen Timer.

Da das die einzige konkrete Aussage bisher ist, guck ich mal in die 
Glaskugel:

Timer mit 32kHz Quarz und ADC alle 100ms auslesen: dürfte als Mittelwert 
etwa 50µA verbrauchen.

Wieviel µA aber gewünscht werden, wäre endlich mal an der Zeit.


Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe den Eindruck, der lässt das Teil im Moment mit "Vollgas"
laufen und wundert sich, dass eine mittlere Batterie nach einem
Tag alle ist...

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LOOOL, ich liebe Vermutungen :D.

Ich will da jetzt nicht näher drauf eingehen...


Gibt es von einem ATTINY25 auch eine "Sparversion"?

MFG

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Gibt es von einem ATTINY25 auch eine "Sparversion"?

http://www.atmel.com/dyn/products/devices.asp?family_id=607
Dort nach "picoPower" suchen. War doch jetzt nicht so schwer, oder?

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, picoPower ist ja soooo offensichtlich....

Außerdem braucht der ATTiny25 Automotive gleich viel wie der normale 
ATTiny25, laut Datenblättern.

http://www.atmel.com/dyn/resources/prod_documents/...
http://www.atmel.com/dyn/resources/prod_documents/...

Warum keifen hier alle rum :(
Bin halt kein PRO...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> LOOOL, ich liebe Vermutungen :D.

Klar.  Wir lieben dein Hinterm-Berg-Halten sämtlicher Informationen
auch.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> Ich will da jetzt nicht näher drauf eingehen...

D.h. Du willst garkeine Hilfe.


> Gibt es von einem ATTINY25 auch eine "Sparversion"?

Wenn Du nicht bereit bist, Deine Software daraufhin anzupassen, sparen 
Dir die Sparversionen überhaupt nichts. Im Vollastbetrieb haben sie 
einen ähnlichen Verbrauch.

Das Sparen ist nur dadurch möglich, daß man Baugruppen zeitweise 
abschaltet oder langsamer taktet.


Peter

Autor: Nn Nn (jaytharevo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich bin ich bereit meinen Code anzupassen.

Im Anhang mein Code. ADU läuft nur während der Wandlung.
Genauso wie der Timer.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
;-)
Sind wird überrascht?
Nicht wirklich . . .

Kleiner Tip: Sleep Mode.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> Natürlich bin ich bereit meinen Code anzupassen.

Optimierungsverdächtige Stellen:
   for (usiWait;usiWait<1000;usiWait++)
    {
      for (usiWait2;usiWait2<1000;usiWait2++);
      usiWait2=0;
    }
    usiWait=0;

Naja, wird der Compiler wohl sowieso durch usiWait = 0 ersetzen. ;-)

(Btw., "usi" ist sehr verwirrend: dieser Begriff bezeichnet beim
AVR das universal serial interface.  Aber ungarische Notation ist
sowieso mehr als umstritten.)

Ansonsten sollte an dieser Stelle ein Timer rein, und dann ein
sleep.  Zwar kannst du nur einen idle sleep machen, keinen
powerdown, aber wenn du einen ATmega88 im idle mode mit einem
ATmega8 full speed vergleichst (jeweils CPU-Frequenz 1 MHz), dann
reduzierst du den Stromverbrauch in dieser Zeit von 2,3 mA auf
150 µA, also mehr als den Faktor 10.  Den Oszillator mit 8 MHz
laufen zu lassen, ist unter diese Umständen völlige Energiever-
schwendung, ich würde ihn mit 1 MHz laufen lassen.

Wenn du jetzt noch dem Timer 2 einen 32-kHz-Quarz spendierst, kannst
du stattdessen den power-save sleep mode benutzen.  Das würde den
Stromverbrauch auf 15 µA beim ATmega8 oder 8 µA beim ATmega88
reduzieren.  Dann musst du allerdings auch deinen Primärzeitgeber
von Timer 1 auf Timer 2 umbauen.
  while(ADCSRA&(1<<ADSC)) 
    {
       // auf Abschluss der Konvertierung warten
    }

Auch hier ein sleep rein.  Warum willst du in dieser Zeit die CPU
Däumchen drehen lassen?  Hier kannst du den ADC noise reduction
mode benutzen, bei dem gegenüber idle mode der IO-Takt noch
abgeschaltet ist, nur der ADC wird noch getaktet.

All diese Wartezeiten machen den Hauptteil deiner Applikation aus.

Übrigens:
ISR(TIMER1_OVF_vect)
{  
  TCNT1H = 0xE1;              // Reload des
  TCNT1L = 0x7C;              // Timer- Register

Dafür haben dir die Atmel-Ingenieure einen CTC-Modus in die Timer
gebaut (clear timer on compare match).

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Controller wird jetzt mit einem Spannungsregler versorgt, damit 
sollte das Problem geklärt sein.

Danke Jörg für deine Verbesserungsvorschläge, werde sie umsetzten.
Die for-Schleife wird nicht weg-optimiert :P.
Unter Umständen werd ich hier den Timer verwenden.

Aber leider habt ihr mich nicht ganz verstanden. Schon klar das man mit 
Sleep Modus und so weiter Strom sparen kann, bringt mir aber nichts wenn 
ich Einbrüche hab bei Vollast und somit falsche Ergebnisse bekomme.
Mir ging es darum den Gesamtverbrauch möglichst gering zu halten. Ich 
dachte da an etwaige Peripherie die Standardmäßig läuft.

Autor: Schluff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Anwendung ist so kritisch, daß Dir die Leistung Deines Prozessors 
nicht ausreicht. Daraufhin hast Du ihm einen Spannungsregler verpaßt. 
Dieser bricht aber zusammen, woraufhin Du seinen Code geändert hast, was 
aber zu falschen Ergebnissen führt.

Also ich habe Dich voll verstanden!


> LOOOL, ich liebe Vermutungen :D.
und ich erstmal.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:

> Danke Jörg für deine Verbesserungsvorschläge, werde sie umsetzten.
> Die for-Schleife wird nicht weg-optimiert :P.

Zufall.

Wenn du die Variablen usiWait und usiWait2 statt global lokal in die
Funktion schreibst, wird die Schleife weg optimiert.  Der Compiler
schnallt dann, dass sie nichts macht.  Wenn du mit -O3 compilierst,
wird aus der Schleife eine bedingte Zuweisung von 0 an die Variable
usiWait2.

Solide Programmierung würde ich das nicht nennen.  Wenn du partout
CPU-Zyklen verheizen musst, dann guck dir die Routinen aus
<util/delay.h> oder <util/delay_basic.h> an.

> Aber leider habt ihr mich nicht ganz verstanden. Schon klar das man
> mit Sleep Modus und so weiter Strom sparen kann, bringt mir aber
> nichts wenn ich Einbrüche hab bei Vollast und somit falsche
> Ergebnisse bekomme.

Was für "Einbrüche"?  Die paar Millisekunden, die das Ding wirklich
rechnet (oder Mikrosekunden, wenn du mit 8 MHz arbeitest und das
Aufwachen per 32-kHz-Quarz und power-save sleep steuerst), die
pufferst du noch mit einem mittelmäßigen Kondensator; einer Batterie
(selbst einer schwachbrüstigen Lithium-Knopfzelle) geht das am Popo
vorbei.  Was bricht da wo ein, und welches Ergebnis wird verfälscht?

Wenn überhaupt, dann spendiere deinem Sensor einen Spannungsregler,
und zwar einen, den man in den shutdown bringen kann, wenn er nichts
zu sensen hat.  Dann bleibt auch dessen Spannungsversorgung konstant.
Dem AVR ist das reichlich wurscht, mit welcher Spannung der genau
läuft.

> Mir ging es darum den Gesamtverbrauch möglichst gering zu halten.

Der Gesamtverbrauch wird zu 99 % durch deine selbst verschuldet hohe
CPU-Last verursacht.  Der Verbrauch der Peripheriemodule spielt im
Moment noch gar keine Geige.

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin nur ich, das oder macht ihr mich hier nach Strich und Faden fertig?
Wie oft soll ich noch sagen, dass ich ein Anfänger bin....



Schluff schrieb:
> Deine Anwendung ist so kritisch, daß Dir die Leistung Deines Prozessors
> nicht ausreicht. Daraufhin hast Du ihm einen Spannungsregler verpaßt.
> Dieser bricht aber zusammen, woraufhin Du seinen Code geändert hast, was
> aber zu falschen Ergebnissen führt.
>
> Also ich habe Dich voll verstanden!

Keine Ahnung wie du, das interpretierst, jedenfalls falsch.
Schon der erste Satz stimmt nicht, die Leistung meines Prozessor reicht 
mir sehr wohl aus...aber egal.


Also, als ersters werde ich die Frequenz verringern. Dann den µC während 
der ADU wandelt  in ADC Noise Reduction Mode setzten. Dann werd ich noch 
die delay- Funktionen nutzen. Diese for's sind ja nur dazu da das mein 
Display nicht flackert, sonder alles schön angezeigt wird.
Dann schauen wir mal weiter :). Mir ist aber noch nicht klar wie genau 
das Funktioniert mit "Schlafen legen und wieder aufwecken". Muss mich da 
mal genauer ins Tutorial einlesen.

MFG Julian

nicht haun

Autor: David ... (volatile)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> Wie oft soll ich noch sagen, dass ich ein Anfänger bin....

Interessiert nicht die Bohne, wenn du nicht in der Lage bist konkrete 
Zahlen zu nenne such dir ein anderes Hobby.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> Bin nur ich, das oder macht ihr mich hier nach Strich und Faden fertig?

Wer "macht dich fertig"?

> Wie oft soll ich noch sagen, dass ich ein Anfänger bin....

Naja, dann solltest du dir zumindest Bemerkungen wie "LOOOL, ich
liebe Vermutungen :D." verkneifen.  Wenn hier jemand was vermuten
muss, dann liegt es nicht an uns, sondern daran, dass man dir
lange Zeit so ziemlich jedes Detail aus der Nase ziehen muss.
Jemand, der sich Mühe gibt, dir zu helfen, lässt sich nur ungern
auslachen dafür.

> Also, als ersters werde ich die Frequenz verringern.

Das reduziert den Stromverbrauch in gleichem Maße, da CMOS-Logik
nur beim Umschalten Strom braucht.

> Dann werd ich noch
> die delay- Funktionen nutzen.

Die machen deine delays nur voraussagbar, aber Strom sparen sie
natürlich nicht.  Dafür müsstest du schon einen Timer + Sleep
bemühen.

> Mir ist aber noch nicht klar wie genau
> das Funktioniert mit "Schlafen legen und wieder aufwecken". Muss mich da
> mal genauer ins Tutorial einlesen.

Ja, probier das am besten mal an einem einfachen Beispiel.  Danach
kannst du dir ja überlegen, wie du ggf. deine Timer umbauen müsstest.

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
David ... schrieb:
> Interessiert nicht die Bohne, wenn du nicht in der Lage bist konkrete
> Zahlen zu nenne such dir ein anderes Hobby.

Was für Zahlen????

Jörg Wunsch schrieb:
> Das reduziert den Stromverbrauch in gleichem Maße, da CMOS-Logik
> nur beim Umschalten Strom braucht.

Also bei delay, etc. müsste er nicht mehr so oft umschalten, somit denk 
ich schon, dass er weniger Strom brauchen wird.



Jörg Wunsch schrieb:
> Die machen deine delays nur voraussagbar, aber Strom sparen sie
> natürlich nicht.

Das mach ich nur weil du geschrieben hast:
> Solide Programmierung würde ich das nicht nennen.

Jörg Wunsch schrieb:
> Wer "macht dich fertig"?
Naja nicht wirklich fertig, aber jeder 2. post ist halt irgendetwas 
negatives. Vllt hab ich es ja verdient^^. Aber "lol" hab ich erst 
geschrieben wie ihr mit den Vermutungen angefangen habt...egal.

Autor: David ... (volatile)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> David ... schrieb:
>> Interessiert nicht die Bohne, wenn du nicht in der Lage bist konkrete
>> Zahlen zu nenne such dir ein anderes Hobby.
>
> Was für Zahlen????

Wieviel mA liefert deine Stromquelle genau? Um wieviel ist das zu wenig? 
Weitere Verbraucher? usw

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>Also bei delay, etc. müsste er nicht mehr so oft umschalten, somit denk
>ich schon, dass er weniger Strom brauchen wird.

Denke nie gedacht zu haben, denn das Denken der Gedanken ist 
gedankenloses Denken.

Lies den Artikel Sleep Mode und lerne.

>Naja nicht wirklich fertig, aber jeder 2. post ist halt irgendetwas
>negatives. Vllt hab ich es ja verdient^^.

Eben . . .

> Aber "lol" hab ich erst
> geschrieben wie ihr mit den Vermutungen angefangen habt...egal.

Und wenn du schon dabei bist, dann lies und lerne was über 
Netiquette.

MFG
Falk

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Brauch ich für diese Sleep_Modes einen externen Takt oder geht das mit 
dem internen Oszillator? Irgendwie ist, das nicht ganz ersichtlich.

MFG

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das IST ersichtlich.

Autor: David ... (volatile)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich warte immernoch auf eine Antwort.

Autor: Nn Nn (jaytharevo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hey,
jetzt melde ich mich mal wieder. Ich würde gern mein "optimiertes" 
Programm posten und von euch wissen was ihr denkt oder wo ich eventuell 
noch ein wenig mehr raus holen kann.


Eins ist mir bewusst, ich verwende "nur" den Idle Mode, da nicht die 
Möglichkeit habe den Timer2 asynchron laufen zu lassen, deswegen lasst 
mal den verwendeten Modus links liegen ;).

Und noch etwas, die Timer1 Overflow routine ist auch noch nicht ganz 
fertig.


MFG Julian

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>    * DA_Program_optimized.c (7,9 KB, 3 Downloads) | Codeansicht

Besser, aber immer noch reichlich vermurkst.

>noch ein wenig mehr raus holen kann.

Sicher. Zum ersten macht man beim AVR keinen Timer Reload sondern nutzt 
den CTC Modus.

Weiterhin sind deine wild und reichlich verteilten

vWait_Timer0();

ziemlicher Quark. Wie man es richtig macht findest du im Artikel [[Sleep 
Mode]].

Ausserdem ist es unnötig und kontraproduktiv, das LCD immer wieder 
komplett zu löschen. Das Überschreiben der Werte reicht und ist deutlich 
schneller.

>Und noch etwas, die Timer1 Overflow routine ist auch noch nicht ganz
>fertig.

Und warum präsentierst du dann hier halbgare Sachen?

MfG
Falk

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Besser, aber immer noch reichlich vermurkst.

Wow, der berühmte Schlag ins Gesicht.


> Sicher. Zum ersten macht man beim AVR keinen Timer Reload sondern nutzt
> den CTC Modus.

Hum, finde ich nicht weniger umständlich wenn ich verschiedene 
Wartezeiten mit einem Timer habe.


> Weiterhin sind deine wild und reichlich verteilten
> vWait_Timer0();
> ziemlicher Quark. Wie man es richtig macht findest du im Artikel Sleep
> Mode.

Der Timer0 kann bei größtmöglichem Prescaler und einem Takt von ~1.8MHz 
nur maximal ~142ms laufen bis zum Overflow. Um jedoch eine Sekunde 
zuerreichen muss dieser halt öfters aufgerufen werden.

> Ausserdem ist es unnötig und kontraproduktiv, das LCD immer wieder
> komplett zu löschen. Das Überschreiben der Werte reicht und ist deutlich
> schneller.

Hum, das wusste ich nicht, dachte ich muss vor jeder Änderung das 
Display löschen.

> Und warum präsentierst du dann hier halbgare Sachen?

Da die Erweiterung kaum Einwirkung auf das Energiesparen hat.
Was noch fehlt: Wenn 1min vergangen ist soll der µC wiederrum schlafen 
gelegt werden und bei einem Rising Edge Flanke auf PB0 (ICP) wieder 
aufwachen und schaun ob sich die Frequenz die am Port anliegt zwischen 
500 und 1000kHz liegt.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> Falk Brunner schrieb:
>> Besser, aber immer noch reichlich vermurkst.
>
> Wow, der berühmte Schlag ins Gesicht.

Naja, Falk ist manchmal ein diplomatisches Trampeltier...

>> Sicher. Zum ersten macht man beim AVR keinen Timer Reload sondern nutzt
>> den CTC Modus.

> Hum, finde ich nicht weniger umständlich wenn ich verschiedene
> Wartezeiten mit einem Timer habe.

Es geht hier nicht darum, ob es umständlich ist, sondern ob es
korrekt (im Sinne des erzielten Timings) ist.  Das ist die
Nachlademethode nicht, da du eine Interruptlatenz hast, die dort
mit reinzählt, während sich beim CTC-Modus die Hardware darum
kümmert, dass beim Erreichen des Zählerwertes augenblicklich der
Zähler gelöscht wird.

Die Interruptlatenz mag bei einem sehr einfachen Setup kalkulierbar
sein, aber bei größeren Projekten ist sie es nicht mehr, insofern
sollte man sich diese Krücke gar nicht erst angewöhnen.  (Ganz früher
gab's mal noch keinen CTC-Modus beim AVR, da ging es nicht besser.)

> Der Timer0 kann bei größtmöglichem Prescaler und einem Takt von ~1.8MHz
> nur maximal ~142ms laufen bis zum Overflow. Um jedoch eine Sekunde
> zuerreichen muss dieser halt öfters aufgerufen werden.

Das kann man im Timerinterrupt selbst erledigen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>> Besser, aber immer noch reichlich vermurkst.

>Wow, der berühmte Schlag ins Gesicht.

Die ungeschminkte Wahrheit.

>> Sicher. Zum ersten macht man beim AVR keinen Timer Reload sondern nutzt
>> den CTC Modus.

>Hum, finde ich nicht weniger umständlich wenn ich verschiedene
>Wartezeiten mit einem Timer habe.

;-)
Wirklich? Nicht wirklich.

>Der Timer0 kann bei größtmöglichem Prescaler und einem Takt von ~1.8MHz
>nur maximal ~142ms laufen bis zum Overflow. Um jedoch eine Sekunde
>zuerreichen muss dieser halt öfters aufgerufen werden.

Richtig, aber das macht man anders, allein schon aus ästhetischen 
Gründen. Vom sinnvollen und formal richtigen Programmablauf mal ganz zu 
schweigen.
Man zählt im Interrupt eine Variable hoch, z.B. im 10ms Raster. Damit 
kann man dann im Hauptprogramm entsprechende Aktionen ableiten.

>Hum, das wusste ich nicht, dachte ich muss vor jeder Änderung das
>Display löschen.

So ein LCD ist keine Kreidetafel ;-)

MFG
Falk

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
da bin ich wieder um zu nerven :D.

Jörg Wunsch schrieb:
> Es geht hier nicht darum, ob es umständlich ist, sondern ob es
> korrekt (im Sinne des erzielten Timings) ist.  Das ist die
> Nachlademethode nicht, da du eine Interruptlatenz hast, die dort
> mit reinzählt, während sich beim CTC-Modus die Hardware darum
> kümmert, dass beim Erreichen des Zählerwertes augenblicklich der
> Zähler gelöscht wird.

Das wird richtig sein, aber es geht mir ja nicht um die letzten 3ms da 
es hier um keine Zeit kritische Anwendung geht. Beim einen zum Beispiel 
soll einfach gewartet werden, dass das Display nicht flackert. Aber, da 
ich ja ein bisschen perfektionistisch bin (mag auf den ersten Blick vllt 
nicht erkennbar sein :P) werde ich mir den CTC Modus auch noch 
anschauen.

Falk Brunner schrieb:
> So ein LCD ist keine Kreidetafel ;-)

Also wann müsste ich nun, das Display konkret löschen?

MFG Julian

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>Also wann müsste ich nun, das Display konkret löschen?

Nahezu niemals.

MFG
Falk

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann werd ich es einmal beim Willkommen machen und dann einfach nicht 
mehr^^

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:

>>Also wann müsste ich nun, das Display konkret löschen?
>
> Nahezu niemals.

Allgemein: wenn du nicht mehr entscheiden kannst, was die vorange-
gangenen Schritte ggf. an Müll auf dem Display hinterlassen haben
könnten und damit nicht genau weißt, wo du überall jetzt drüber
schreiben musst (eine einzelne Stelle kann man ja durch Überschreiben
mit einem Leerzeichen löschen).

Bei deiner einfachen Applikation ist das aber vermutlich immer
deterministisch.

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Nahezu niemals.

Blödsinn, meine clrs() sind essentiell. Ich habe die weggelassen, dass 
Resultat war, wie ich es mir gedacht hatte, Blödsinn. Wenn ich nach 
einem langem String einen kurzen schreibe, bleibt das vorherige soweit 
stehen soweit der kurze ihn nicht überschrieben hat. Mit Leerzeichen 
auffüllen wäre natürlich auch eine Möglichkeit, aber warum dann nicht 
gleich löschen?



Anbei mein überarbeiteter Code.

Autor: Nn Nn (jaytharevo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Nach einem Edit kann ich leider keine Datei mehr anhängen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Julian Schild (jaytharevo)

>Blödsinn, meine clrs() sind essentiell.

Du bist ja auch der grosse Programmiermeister.

>einem langem String einen kurzen schreibe, bleibt das vorherige soweit
>stehen soweit der kurze ihn nicht überschrieben hat.

Niemand hat was anderes bahuptet. Aber das Problem ist leicht ohne clr 
und komplettes Neuschreiben des LCD lösbar.

> Mit Leerzeichen
>auffüllen wäre natürlich auch eine Möglichkeit, aber warum dann nicht
>gleich löschen?

Weil das clr zu lange dauert, nämlich ~1,4ms. Klingt wenig, ist aber 
viel, wenn an der falschen Stelle im Programm steht. Ausserdem flackert 
die Anzeige beim kompletten Löschen und Neuschreiben. Beim Überschreiben 
(auch mit Leerzeichen zu füllen) nicht.

MfG
Falk

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>    * DA_Program_optimized.c (7,9 KB, 1 Downloads) | Codeansicht

Deine neue Version ist nicht wirklich besser.

Sag mal in Worten, was dein uC tun soll, dann kann ich dir vielleicht 
das Programm so schreiben, wie man es richtig macht.

MFG
Falk

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haha, langsam gewöhnt man sich ja doch an deinen Charme ;).
Spaß bei Seite, finde ich gut, dass du hier nicht um den heißen Brei 
redest.


Naja um was geht es.
Ich habe 2 Spannungen. Die eine Spannung steht für eine Leistung die 
andere ob die erste richtig ist (hört sich dumm an, hängt mit der 
Linearität eines ICs zusammen). Wenn die zweite Spannung >1,2V ist muss 
ich aufhören das erste zuwandeln. Sollte die erste Spannung aber richtig 
sein, dann muss die Leistung berechnet werden und zwar über einen 
gleitenden Mittelwert. Die Leistung entspricht 4W/1V. Soll heißen, dass 
wenn der ADU 1V wandelt dies 4W entspricht. Diese 4W sollten, dann auch 
am LCD ausgegeben werden.
Weiters soll solange die zweite Spannung <1,2V im Hintergrund ein Timer 
laufen, welcher nach 1min am PortC Pin4 ein Abschaltsignal senden soll 
(soll einfach High werden).
Nach dem abgeschalten wurde soll der µC sich schlafen legen und auf 
einen Interrupt warten der von der Input Capture Unit ausgelöst werden 
soll.
Am ICP Pin soll, dann die Frequenz festgestellt werden. Wenn sie 
zwischen 600 und 700Hz liegt darf er das Ganze wieder von vorne machen 
wenn nicht wieder schlafen gehen.

Hoffe, dass ist genau genug beschrieben.

MFG Julian

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>Ich habe 2 Spannungen. Die eine Spannung steht für eine Leistung die
>andere ob die erste richtig ist (hört sich dumm an, hängt mit der
>Linearität eines ICs zusammen).

Fällt mit zwar schwer das so zu glauben, aber das wollen wir einfach mal 
annehmen.

> Wenn die zweite Spannung >1,2V ist muss
>ich aufhören das erste zuwandeln.

Wie aufhören?

> Sollte die erste Spannung aber richtig
>sein, dann muss die Leistung berechnet werden und zwar über einen
>gleitenden Mittelwert.

Über wieviel Werte soll die Mittelwertbildung erfolgen? Welche 
Abtastrate?

>Weiters soll solange die zweite Spannung <1,2V im Hintergrund ein Timer
>laufen, welcher nach 1min am PortC Pin4 ein Abschaltsignal senden soll
>(soll einfach High werden).

Also wenn die 2. Spannung für 1min <1,2V ist, schaltet der uC ab. Und 
was ist, wenn zwischenduch einmal eine Messung >1,2V ist?

>Nach dem abgeschalten wurde soll der µC sich schlafen legen und auf
>einen Interrupt warten der von der Input Capture Unit ausgelöst werden
>soll.

Das ist leicht.

>Am ICP Pin soll, dann die Frequenz festgestellt werden. Wenn sie
>zwischen 600 und 700Hz liegt darf er das Ganze wieder von vorne machen
>wenn nicht wieder schlafen gehen.

Auch leicht.

>Hoffe, dass ist genau genug beschrieben.

Programmieren braucht viele Details ;-)

MFG
Falk

P S Ich werd mich in den nächsten Tagen mal dransetzen.

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
haha ich find das so lustig das du mir da mal meine Diplomarbeit 
programmierst. Wenn ich denk, das ich vor einem halben Jahr bei 0 
angefangen hab und eigentlich bis ca. 120h investiert hab und du sagst 
so einfach,

"> P S Ich werd mich in den nächsten Tagen mal dransetzen."


Nun zu deinen Fragen:

Falk Brunner schrieb:
> Fällt mit zwar schwer das so zu glauben, aber das wollen wir einfach mal
> annehmen.

Der IC heißt LM13700 und ist ein so genannter Steilheitsintegrator (so 
heißt der glaub ich). Jedenfalls richtet der mir die Spannung so, dass 
ich sie nachher verarbeiten kann.

Falk Brunner schrieb:
> Wie aufhören?

Naja, da die zweite Spannung anzeigt, dass die erste ein Blödsinn ist 
soll diese so lange nicht mehr gewandelt werden und auch nicht am LCD 
angezeigt werden, so lange die zweite Spannung >=1,2V ist.

Falk Brunner schrieb:
> Über wieviel Werte soll die Mittelwertbildung erfolgen? Welche
> Abtastrate?

4.
Der Abtastrate hab ich gar nicht so viel Aufmerksamkeit geschenkt, da 
diese bereits über einen Kondensator integriert wurde.

Falk Brunner schrieb:
> Also wenn die 2. Spannung für 1min <1,2V ist, schaltet der uC ab. Und
> was ist, wenn zwischenduch einmal eine Messung >1,2V ist?

Dann muss der Zähler für die eine Minute wieder zurückgestezt werden und 
von neuem begonnen werden mit zählen.

Falk Brunner schrieb:
> Das ist leicht.
> Auch leicht.

Das freut mich. Das ICP hab ich ja noch überhaupt nicht durchschaut.

An dieser Stelle mal ein "DANKE" an dich Falk.

MFG Julian

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> haha ich find das so lustig das du mir da mal meine Diplomarbeit
> programmierst

Ist jetzt bitte nicht dein Ernst, oder? Falls doch, so hoffe ich sehr 
für dich, dass Du hier nicht unter deinem richtigen Namen postest.

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich werde das Programm natürlich NICHT übernehmen.
Es interessiert mich nur wie Falk, dass programmieren würde
da er anscheinend nicht lang benötigen wird.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst ihn doch allemal als Quelle mit angeben. ;-)

Autor: Julian from iPod (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
außerdem.
Finde es sowieso genial, wenns ums meckern geht finden sich auf ein mal 
Leute, herrlich.

Autor: Falk Brunner (falk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So, hier mal der Entwurf. Kompiliert fehlerfrei, ist aber logischerweise 
nicht getestet, da ich die Hardware nicht hab. Das Prinzip sollte aber 
klar werden. Statemachine, saubere Struktur.

Ein paar Anmerkungen.

Deklarationen immer in .h Files, nicht in .c, sauberer Stil
Konstanten als #define in die Header schreiben, keine "magic numbers" im 
Quelltext.
Deine Mittelwertberechnung ist ungenau, erst alles addieren, dann 
dividieren, siehe Festkommaarithmetik.
Besonders auf Mikrocontrollern streng definiert Datentypen aus stdint 
nutzen, unsigend short int kann 8 oder 16 Bit sein, einer der vielen 
Diffusitäten von C.
ADC lesen mit Zugriff auf ADCW
Die Aufgabe ist LOCKER mit einem 8-Bit Timer lösbar, der wertvole 16 Bit 
Timer 1 muss hier nicht verplempert werden.
Wenn man einen 32kHz Uhrenquarz am Timer 2 asynchron laufen lässt, kann 
man noch mal RICHITG Strom sparen, siehe Sleep Mode
Was noch fehlt ist das Auswerten der Frequenz nach dem wiederaufwachen.

MFG
Falk

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
bin beeindruckt. Aber warum ist deine Variante nun besser als meine?
Ich bin leider noch nicht dazu gekommen es zu probieren, werde es aber 
so bald als möglich nach holen. Nächste Woche stehen eh die Osterferien 
vor der Tür :).

Falk Brunner schrieb:
> Wenn man einen 32kHz Uhrenquarz am Timer 2 asynchron laufen lässt, kann
> man noch mal RICHITG Strom sparen, siehe Sleep Mode

Wie geasgt, ist nicht mehr möglich, da Schaltung fest steht.


MFG Julian

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>bin beeindruckt. Aber warum ist deine Variante nun besser als meine?

Weil sie von mir ist ;-)

>Ich bin leider noch nicht dazu gekommen es zu probieren,

Viel wichtiger ist das VERSTEHEN! Dann wird dir vielleicht auch klar, 
warum sie besser ist.

MfG
Falk

Autor: Julian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
schau mir das Programm jetzt sicher schon zum 5. mal durch, jedes mal 
mit einem Grinsen, und muss sagen, dass es schon sehr intelligent gelöst 
ist. Aber, da spielt die Erfahrung halt eine große Rolle. Diese streng 
definiert Datentypen aus stdint
sind mir halt lieder nicht sehr geläufig. Ich bin bei meinem 
Programmierstil halt leider stark von unserem Unterricht und wie unser 
Lehrer programmiert beeingflusst worden. Das mit switch ist natürlich 
genial, leider ist mir diese Funktion in 4 Jahren C ein bis zweimal 
gezeigt worden....

Was ich von dir übernehmen werde ist die Timer0 Lösung. Hier mit beiden 
Timern herum zu spielen ist, in der Tat, etwas umständlich.


MFG Julian

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
            case power_down:
                sleep_mode();
                state = resync;


Kann mir nicht vorstellen das ich den state noch nach dem aktivieren des 
Schlafmodus verändern kann. Oder doch?

Ich bin gerade dabei ICP zu implementieren. Jetzt hab ich eine Frage. 
Muss der Timer1 eig die ganze Zeit laufen? Blödsinn oder?
ISR( TIMER1_CAPT_vect )
{TCCR1B = (1<<CS10);    // Timer aktivieren ohne Prescaler
iZaehlerStand=TCNT1L;
iZaehlerStand += (TCNT1H<<8);
}

Nachdem rising edge gekommen ist einfach den Timer anwerfen oder?

MFG

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)
            case power_down:
                sleep_mode();
                state = resync;

>Kann mir nicht vorstellen das ich den state noch nach dem aktivieren des
>Schlafmodus verändern kann. Oder doch?

Nach dem wieder Aufwachen passiert das.

>Ich bin gerade dabei ICP zu implementieren. Jetzt hab ich eine Frage.
>Muss der Timer1 eig die ganze Zeit laufen?

Ja.

> Blödsinn oder?

Nö.

>ISR( TIMER1_CAPT_vect )
>{TCCR1B = (1<<CS10);    // Timer aktivieren ohne Prescaler
>iZaehlerStand=TCNT1L;
>iZaehlerStand += (TCNT1H<<8);

Lass den unsinnigen 8 Bit Zugriff! Dafür gibt es TCNT1, das ist der 
Timer als 16 Bit Variable. Der GCC kümmert sich darum.

>Nachdem rising edge gekommen ist einfach den Timer anwerfen oder?

Nöö, laufen lassen. Die Differenz der Zeiten zwischen zwei (rising edge) 
Interrupts ist gleich der Periodendauer.

MfG
Falk

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Nöö, laufen lassen. Die Differenz der Zeiten zwischen zwei (rising edge)
> Interrupts ist gleich der Periodendauer.

Ja, deswegen kommt es mir etwas unsinnig vor den Timer1 die ganze Zeit 
laufen zu lassen. Ich mein wenn meine Schaltung über Nacht wartet bis 
das Einschaltsignal kommt dann gibts ja zig tausend Überläufe. Außerdem 
würde der µC auch jedes mal aufwachen und dann erst wieder schlafen 
gehen...

Etwaige Messungenauigkeiten sind mir egal. Ich frag mich nur ob das 
laufen des Timers notwendig ist um die rising Edge zu erfassen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>> Nöö, laufen lassen. Die Differenz der Zeiten zwischen zwei (rising edge)
>> Interrupts ist gleich der Periodendauer.

>Ja, deswegen kommt es mir etwas unsinnig vor den Timer1 die ganze Zeit
>laufen zu lassen.

Muss er aber. Das ist ja schliesslich deine Zeitbasis für die 
Frequenzmessung.

> Ich mein wenn meine Schaltung über Nacht wartet bis
>das Einschaltsignal kommt dann gibts ja zig tausend Überläufe.

Das tut dem Timer nicht weh.

> Außerdem
>würde der µC auch jedes mal aufwachen und dann erst wieder schlafen
>gehen...

Nöö, wer sagt denn, dass der Timer Overflow einen Interrupt auslösen 
muss? Das muss nur die ICP Funktion. Kann man alles einstellen.

>Etwaige Messungenauigkeiten sind mir egal.

Warum misst du dann überhaupt?

> Ich frag mich nur ob das
>laufen des Timers notwendig ist um die rising Edge zu erfassen.

EINE Flanke kann man auch ohne Timer erfassen. Das kann beim ATmega8 
aber nur die INT Pins. Beim pinkompatiblen ATmega88 kann an jedem Pin 
ein Flankenwechsel erfasst werden, Pin Change Interrupt.
Aber für eine Periodendauermessung ist ICP schon das Mittel der Wahl.

MFG
Falk

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Warum misst du dann überhaupt?

Weil es egal ist ob bei der Messung 600 oder 800 Hz heraus kommt, 
solange es in einem gewissen Bereich liegt ist alles in Butter.

Falk Brunner schrieb:
> EINE Flanke kann man auch ohne Timer erfassen. Das kann beim ATmega8
> aber nur die INT Pins.

Die sind leider bereits durch das Display belegt. Außerdem soll dir 
Frequenz zu Fehlererkennung dienen. Der Controller soll nicht durch 
jedes beliebige Signal eingeschalten werden.

Also noch mals.
Ist es möglich die rising edge zu erfassen OHNE das der Timer1 im 
Hintergrund die GANZE Zeit laufen muss oder ist es GRUNDSÄTZLICH NICHT 
möglich?


MFG Julian

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>Ist es möglich die rising edge zu erfassen OHNE das der Timer1 im
>Hintergrund die GANZE Zeit laufen muss

Sicher, aber dann muss die CPU in einer Art Endlosschleife das Pin 
abfragen. Nicht wirklich stromsparender.
Wo ist das Problem mit dem laufenden Timer1?

MfG
Falk

Autor: Nn Nn (jaytharevo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ok du wirst mich dafür zwar an den Pranger stellen Falk, aber ich muss 
schauen, dass ich das Programm fertig bekomme. Deswegen ist es zur Zeit 
sehr umständlich und nicht schön programmiert (Interrupts sollten nie so 
lange sein, viele variablen,...). Falls ich noch ein mal die Zeit habe 
werde ich es besser schreiben. Aber im Moment steht halt die 
Fertigstellung im Vordergrund. Deswegen schau bitte noch einmal drüber 
ob es so funktionieren KÖNNTE.


Danke.

MFG Julian

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>ok du wirst mich dafür zwar an den Pranger stellen Falk,

Viel schlimmer. Ich strafe dich mit Ignoranz.

> aber ich muss
>schauen, dass ich das Programm fertig bekomme.

Jaja.

> Deswegen ist es zur Zeit
>sehr umständlich und nicht schön programmiert (Interrupts sollten nie so
>lange sein, viele variablen,...). Falls ich noch ein mal die Zeit habe
>werde ich es besser schreiben.

Wenn du es eilig hast, gehe langsam.

Konfuzius

Mit diesem "mal schnell fetig machen, hab keine Zeit für Schönschreiben" 
wirst du immer wieder richtg schön auf Maul fallen. Viel Spass dabei.

> Aber im Moment steht halt die Fertigstellung im Vordergrund.

> Deswegen schau bitte noch einmal drüber ob es so funktionieren KÖNNTE.

pah

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lulz.....

Edit: Außerdem, um es besser zu schreiben müsste ich es so machen wie 
du, also mit dem Switch und du wirst doch verstehen, dass ich dein 
Programm nicht abkupfern kann, oder nicht?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso abkupfern? Und der switch() ist nicht patentgeschützt.
Nimm mein Programm und bau die Frequenzmessung sauber ein.

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Nimm mein Programm und bau die Frequenzmessung sauber ein.

Genau DAS ist doch abkupfern. Ich kann ja nicht das von dir geschriebene 
Programm nehmen. Dann kann ich gleich meinen 5er abholen....

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>> Nimm mein Programm und bau die Frequenzmessung sauber ein.

>Genau DAS ist doch abkupfern. Ich kann ja nicht das von dir geschriebene
>Programm nehmen. Dann kann ich gleich meinen 5er abholen....

Erzähl keinen Unsinn. Willst du es per Hand abschreiben?
Setz ne Quellenangabe in deine Arbeit und gut. Auch in einer 
Diplomarbeit darf man sich helfen lassen.
Der Anteil an Eigenleistung in einer Diplomarebit ist nicht 100%, 20% 
und bisweilen weniger sind OK, hab ich mal gehört.
Schliesslich hast du den uC auch nicht selber gebaut.

MFG
Falk

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Setz ne Quellenangabe in deine Arbeit und gut. Auch in einer
> Diplomarbeit darf man sich helfen lassen.

Sehe ich auch so.

Natürlich solltest du aber verstanden haben, was eine "state
machine" (dt.: zustandsgesteuerter Automat) ist und warum der
switch sinnvoll benutzt wird, um eine solche zu implementieren.
Sonst könnte es sein, dass dir das einer in der Verteidigung als
peinliche Frage stellt...

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk was für eine lcd.h verwendest du?

Ich bekomme lauter Fehler beim kompilieren. Lauter unidefined references 
die mit dem LCD zu tun haben.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>Falk was für eine lcd.h verwendest du?

Die aus dem Tutorial. Musst du halt wieder auf deine etwas anderen 
Funktionsnamen umschreiben.

MfG
Falk

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hoi,
hatte nur die lcd.c Datei nicht eingebunden.
Jetzt bekomm ich aber einen anderen Fehler:

>make: *** No rule to make target `../../DA', needed by `lcd.o'.  Stop.

Kannst du damit was anfangen?

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem wurde behoben.

Hab dein Programm probiert, geht nicht sonderlich. Kommt über Willkommen 
nicht raus. Blinkt fröhlich vor sich hin.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>Hab dein Programm probiert, geht nicht sonderlich. Kommt über Willkommen
>nicht raus. Blinkt fröhlich vor sich hin.

Ist schon wirklich schlimm, dass die Lösung nicht fix und fertig auf dem 
Silbertablett serviert wird. Und lesen ist auch ncht deine Stärke.

Beitrag "Re: Stromsparen und Atmega8?"

Und DU willst eine DIPLOMARBEIT schreiben? So wie du hier rummjammerst 
und dich anstellst ist das nicht mal Praktikanenniveau!

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Ist schon wirklich schlimm, dass die Lösung nicht fix und fertig auf dem
> Silbertablett serviert wird.

Ist mir klar, es sind wären einige Dinge zu ändern. Trotz einiger 
Versuche kommt er nicht über Willkommen hinaus.
Hab einiges versucht. Code auskommentieren, neuen schreiben,... ändert 
sich nicht viel. Timer0 Überlauf kommt. Was übersehe ich?

>Und lesen ist auch nicht deine Stärke.

In deinem Beitrag schreibst du lediglich wie man es machen sollte.


>Und DU willst eine DIPLOMARBEIT schreiben? So wie du hier rummjammerst
>und dich anstellst ist das nicht mal Praktikantenniveau!

:(

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian Schild schrieb:
> Blinkt fröhlich vor sich hin.

Was heißt das denn genau?  Ist ja keine LED dran, die blinken könnte...

Falls du den Cursor des LCD meinst: das macht der Controller im LCD
selbst, dafür braucht man keine Interaktion vom Master.

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das Willkommen blinkt.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Falks Programmrumpf fehlt meiner Erinnerung nach noch irgendeine
ISR (in die du natürlich deinen eigenen Code reinbringen musst).
Dadurch springt das Programm bei jedem Interrupt wieder an Adresse 0.

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
// Interrupt bei Timer0 Overflow
ISR(TIMER0_OVF_vect) {  
    static uint8_t tick;

    PORTB = ~PORTB;                     // Kontrollausgabe ob Timer Überlauf kommt

    tick++;
    if(tick==15) {                      // ~0.5 Sekunde 
        tick=0;
        flag_timer=1;
    }
}

Hat er doch. oO
Oder meinst du etwas anderes :)?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwo macht der Controller einen powerdown, daraus muss er doch
wieder aufwachen.  Habe mir nicht die Mühe gegeben, alles darin zu
verstehen.

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wurde ausgebessert auf IDLE Mode.
Komisch komisch....

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werde wohl schon wieder mit Ignoranz bestraft :(.

Vllt könnte sich unser Falk durchringen und mir sagen was ich übersehe 
:).

BITTE BITTE BITTE BITTE BITTE :)

MFG

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er hat deine Schaltung doch auch nicht (und wird sie sicher auch nicht
aufbauen extra für dich).

Du kennst die alte Regel der Softwareerstellung?  Die ersten 90 % des
Projekts nehmen 90 % der Zeit in Anspruch.  Die verbliebenen 10 %
brauchen dann jedoch nochmal 90 %.  Irgendwo an der Stelle bist du
gerade.

Da hilft dann kein Draufgucken mehr, sondern nur noch debuggen.  Da
du mit einem ausreichend altertümlichen Controller ins Rennen gegangen
bist, der kein Online-Debugging kann, musst du dich wohl oder übel
mit einer Simulation rumquälen.  Oder du schmeißt den alten ATmega8
doch noch raus und nimmst einen ATmega88 und einen AVR Dragon, dann
kannst du das am "lebenden Objekt" angucken.

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schuld an dem ständigen wiederholen war die ADU- Konfiguration. Nachdem 
ich sie neu geschrieben hab hat es funktioniert.

Hab jetzt auch eine "saubere" Statemachine programmiert.
Werd sie nach ein paar "Schönheitskorrekturen" hier reinstellen falls 
Interesse besteht.

MFG Julian

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>Hab jetzt auch eine "saubere" Statemachine programmiert.

Schön.

>Werd sie nach ein paar "Schönheitskorrekturen" hier reinstellen falls
>Interesse besteht.

Tu das.

MfG
Falk

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HA! Ich wusste doch du schaust noch zu ;).

Boa, freu ich mich auf dein Kommentar wie ich, dass schon wieder 
vermurkst hab.
Jetzt kann ich das Programm auch ohne Gewissensbisse nehmen, da kaum 
noch was von dir ist.

Autor: Nn Nn (jaytharevo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt bin ich mal gespannt wie ein Flitzebogen ;) xD!

Wie immer Falk, die ungeschminkte Wahrheit, danke!

MFG Julian

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>Wie immer Falk, die ungeschminkte Wahrheit, danke!

Nun ja. Es bewegt sich in die richtige Richtung. Allerdings fehlt wieder 
ein gutes Stück, dass ich dir eigentlich schon mal gut gezeigt habe.
Und dieses unsinnige vWait_Timer0() ist auch wieder drin! NEIN! Der 
Timer läuft immer. Und man muss nicht dauernd den Presclaer umstellen. 
Wie das sinnvoll geht, habe ich gezeigt.

Was auch das Lesen erschwert sind die vermurksten Tabulatoren. Man 
sollte seine Editor so einstellen, dass der keine Tabulatoren erzeugt, 
sondern Leerzeichen.
Dann gibt es auch keine Darstellungsprobleme mit der Einrückung, wenn 
ein anderer Editor auf einen anderen Tabulatorabstand eingestellt ist.

Von mir würdest du eine 3- bekommen.

MFG
Falk

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wow, richtige Richtung :D! Wohooo!
Die 3- bekomme ich nur wegen dem "vermurkstem" Timer?

Wieso ist, dass so schlecht? Ich mein, dass macht die Sache doch um 
einiges einfacher und den Timer1 muss ich sowieso wegen ICP verwenden.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Julian Schild (jaytharevo)

>Die 3- bekomme ich nur wegen dem "vermurkstem" Timer?

Im Wesentlichen ja.

>Wieso ist, dass so schlecht?

Weil man den Timer nicht grundlos dauern ein. und aus schaltet.

> Ich mein, dass macht die Sache doch um
>einiges einfacher

Keine Sekunde.

> und den Timer1 muss ich sowieso wegen ICP verwenden.

Eben DESHALB muss der Timer immer laufen!

MFg
Falk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.