PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variable per Tastendruck dauerhaft ändern. Bootloader?



tobiastob
14.11.2007, 19:25
Hallo

ist es möglich, per Taster am I/O Pin eine zuvor deklarierte Variable zu ändern (z. B. den Wert um 10 erhöhen) , sodass sie auch nach einem Neustart des Controllers diesen Wert beibehält?
Soweit ich das verstanden habe, funktioniert das mit einem Bootloader bei einem ATMega über RS232 (http://www.microsyl.com >> MegaLoad). Aber funktioniert das auch mit einem Attiny13 und Taster?

Grüße
Tob

Rofo88
14.11.2007, 19:53
Dafür brauchst Du keinen Bootloader.
Der Tiny13 hat EEPROM, einen Speicher der auch ohne Spannung seine Daten behält.

Den EEPROM kannst Du im µC-Programm Lesen und Schreiben und nach nem neustart hat er auch noch die gespeicherten Werte.

radbruch
14.11.2007, 19:56
Hallo tobiastob

Bei meinem ATtiny13 schreibe ich Werte die ich dauerhaft speichern möchte in das EEProm:


void EEPROM_write(unsigned char ucAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEPE));
/* Set Programming mode */
EECR = (0<<EEPM1)|(0>>EEPM0);
/* Set up address and data registers */
EEARL = ucAddress;
EEDR = ucData;
/* Write logical one to EEMPE */
EECR |= (1<<EEMPE);
/* Start eeprom write by setting EEPE */
EECR |= (1<<EEPE);
}

unsigned char EEPROM_read(unsigned char ucAddress)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEPE));
/* Set up address register */
EEARL = ucAddress;
/* Start eeprom read by writing EERE */
EECR |= (1<<EERE);
/* Return data from data register */
return EEDR;
}

(Code aus dem ATtiny-Datenblatt)

Das funktioniert aber nur bei byte/integer-Werten einfach, bei anderen Datentypen ist es etwas komplizierter (über pointer auf die Variablen kommt man hier zu den Bytes)

Beim allerersten Programmlauf schreibst du den Defaultwert deiner Variablen in das EEProm und kommentierst dann den Schreibbefehl aus. Bei allen anderen Programmstarts liest du zu Beginn den Wert der Variablen aus dem EEProm wieder aus. Auf Tastendruck kannst du nun auch einen anderen Wert ins EEProm schreiben und diesen beim nächsten Start wieder auslesen.

Gruß

mic

wkrug
14.11.2007, 20:18
Bei CodeVision AVR läuft das folgendermassen.
Bei der Deklaration der Variablen-

Beispiel:
eeprom unsigned int ee_testvar=1234; /* Die EEPROM Variable */
volatile unsigned int ui_testvar; /* Die Spiegel Variable im RAM */

wird eine .eep Datei angelegt.
Wenn man diese beim Proggen in den Controller schreibt sind die default Werte schon mal drin.

Beim Programmstart wird diese Variable wieder eingelesen

ui_testvar=ee_testvar;

und kann ganz normal im Programm wieder verwendet werden.

Will man einen neuen Wert wieder in das EEPROM zurückschreiben geht das einfach so.

ee_testvar=ui_testvar;

Wie das bei Win AVR zu machen ist kann ich leider nicht sagen.
Ich lese grundsätzlich alle ofter benötigten EEPROM Variablen beim Programmstart in normale Variablen ein, da ein Zugriff auf das EEPROM wesentlich länger dauert, als ein Zugriff aufs RAM

tobiastob
15.11.2007, 00:24
Danke euch. Das ist ja doch weniger aufwändig, als ich dachte. Ich hab bisher Bascom und ponyprog verwendet. Benutzt das hier zufällig auch jemand und weiß schon, wie es da funktionert (und würde es mir verraten)? Falls nicht, ists auch ok, dann versuch ich selbst mein Glück. Jetzt weiß ich ja zumindest, wonach ich da suchen muss.

Ich hätte noch eine Frage. Was ich am Ende gerne hätte, wäre ein über PWM regulierbarer Motor. Und mittlerweile glaube ich, dass sich das mit einem Drehregler besser handhaben ließe. Meine Idee wäre nun, einen Trimmer an einen ADC Port zu setzen, und den Messwert dann nach einer kurzen Umrechnung als Variable für die PWM zu nutzen.
Ist das ein vernünftiger Ansatz, oder geht das anders viel leichter? Oder überhaupt anders?
Ist für PWM ein externer Quarz nötig, oder macht sich das kaum bemerkbar?

Gruß
der Tob

wkrug
15.11.2007, 10:28
Geber:
Das mit dem Poti kannst Du so machen, auch wenn Potis mit zunehmendem Alter zu kratzen beginnen.

Man kann natürlich auch mit Taster die Drehzahl rauf und runter regeln.
Es kommt halt auf die Applikation an die man vorhat.

PWM:
Wenn es Dir nicht auf die absolut genaue Einhaltung der PWM Frequenz ankommst kannst Du jederzeit den internen Oszillator der AVR's verwenden.

BASCOM:
Mit BASCOM kann ich Dir leider nicht helfen - ich würd aber die Frage mal im AVR BASIC Forum hier stellen, da wird Dir sicher geholfen.

tobiastob
15.11.2007, 11:31
Ist das Kratzen bei Spindeltrimmern auch so, oder nur bei "normalen" Potis? Zu stark werde ich ihn aber wohl auch nicht beanspruchen.
Ich dachte an den hier http://www.reichelt.de/?;ACTION=3;LA=4;GROUP=B23;GROUPID=3130;ARTICLE=364 4;START=0;SORT=preis;OFFSET=1000;SID=150v6B49S4AQ8 AAFJN4xEd340140d85aabc1350b1df82cb707e81
also einen 50 Ohm Spindeltrimmer (und ca 50 Ohm Gegenwiderstand). Gingen auch ein 10 Ohm Spindeltrimmer , oder ist das für den ADC eine zu geringe Bandbreite?
Wegen Bascom frag ich da mal nach - danke.

der Tob

chr-mt
15.11.2007, 12:37
dim EE_variable as eram integer
dim Variable as integer


EE_Variable=variable 'Schon steht's fest im EEPROM

Variable=EE_Variable 'Und so liest man aus dem EEPROM

Musst übrigens immer den Weg über eine Variable gehen.
EE_Variable=16 'geht nicht

Variable=16
EE_Variable=variable 'Das geht.



Gruß
Christopher

McJenso
15.11.2007, 17:21
Hallo,

warum möchtest du 50 Ohm nehmen? Nimm 10K, ein Beinchen an Vcc, ein Beinchen an 0V und den Schleifer auf den ADC-Pin. Darfst halt nicht vergessen externe Referenz einzustellen.

Gruß

Jens

Besserwessi
15.11.2007, 17:56
Ein Spindeltrimmer ist zur PWM regelung eins Motor eher übertrieben. Das Kratzen ist bei den Spindetrimmern auch nicht weniger, nur die verstellt man nicht so gerne. Hier ließe sich das Kratzen auch mit einem Kondensator am ADC Eingang deutlich verringern.

tobiastob
15.11.2007, 20:14
Na gut. Dann nehm ich ein normales 10k Ohm Einstellpotentiometer. Ich dachte, der Energieverbracuh könnte geringer sein, wenn ich kleine Widerstände einsetze. Ist das nicht so? Und wie groß sollte der Kondensator sein? Eine ganz kurze Begründung wäre hilfreich, damit ich das in Zukunft selbst abschätzen kann.

Danke für den Code, Christopher!

McJenso
15.11.2007, 20:48
Hallo Christopher,

große Widerstände -> kleiner Strom
kleine Widerstände -> großer Strom

Darum auch Widerstand und nicht Wiederstand :wink:

Technisch ausgedrückt: I = U / R
I Strom
U Spannung
R Widerstand

Wenn du den Wert öfters ändern willst, nimmst du am besten ein richtiges Potentiometer und nicht diese kleinen Trimmer.
Als Kondensator würde ich jetzt aus dem Bauch heraus 1µF oder etwas kleiner nehmen. Mag vielleicht noch jemand was zu schreiben. Ich denke allerdings, dass der Motor so träge ist, dass ihn das Knachsen nicht beeindruckt.

Gruß

Jens

radbruch
15.11.2007, 21:57
Mag vielleicht noch jemand was zu schreiben.
100% Zustimmung

tobiastob
15.11.2007, 22:19
Deine kleine schulphysikalische Auffrischung klingt erschreckend einleuchtend. Danke :oops:
So oft werde ich nicht am Potentiometer drehen müssen. Also wird es wohl zwar kein Trimmer werden, aber ein eher kleines Potentiometer.
Meint ihr mit Knacksen kurze, "extreme", also ungewollte Widerstandsänderungen, während man am Poti dreht?
Der Motor ist eigentlich ein PC-Lüfter. Der dürfte relativ träge sein. Das heißt dann wohl, ich brauche keinen Kondensator. Verrätst du mir noch, wie du auf den Wert von 1µF gekommen bist? Sind das Erfahrungswerte, oder gibt es da eine Art Formel?

radbruch
15.11.2007, 22:31
Das sind Bauchwerte. Je größer der Kondensator ist, umso langsamer folgt die Spannung am ADC der Widerstandsänderung des Poties. Genaue Lade- und Entladezeiten könnte man sicher ausrechnen, aber Versuch und Irrtum führen hier wohl schneller zum Ziel.

tobiastob
17.11.2007, 21:58
Ok, ich orientiere mich bei Kondensatoren immer an den Schaltplänen anderer. Die Lade- und Endladezeit auszurechnen würde ja auch auch nur dann helfen, wenn ich wüsste, welche Zeit ideal ist. Das soll jetzt aber nicht nach Klugscheißerei klingen. Ist nur das, was ich mich immer frage, wenn ich mir Pläne ansehe und versuche sie nachzuvollziehen.


Gruß
Tob

wkrug
17.11.2007, 22:38
Bei den Kondensatoren in selbst entwickelten Schaltungen befrägt man in erster Linie mal das Datenblatt des verwendeten Chips und baut dann mal die vorgeschlagenen Werte ein.
Üblicherweise wird die Versorgungsspannung von IC's mit 100nF Keramikkondensatoren am Chip gepuffert.
Bei solchen Anwendungen wie hier kommt es auf die gewünschte maximale Reaktionszeit an. Da die ja hier keine wirklich wichtige Rolle spielt kann man dabei auch gerne nach Bauchgefühl hantieren.
Ich meine aber das hier ein 220, od. 470nF Kondensator auch ausgereicht hätte - ein 1µF Keramikkondensator ist schon ein ziemlicher Bauklotz.
Bei der praktischen Erprobung wird man dabei keinen wirklich großen Unterschied feststellen können und Kondensatoren dieser Kapazitätsgröße finden sich in fast jeder Bastelkiste.