Hi,
nach stunden des Probierens und suchen hier meine Fragen....
Ich möchte am Analog eingang einen Strom messen, und diesen Wert ins
eeporm speichern damit ich ihn nach dem einschalten wieder habe, das
Ganze wird an einer 12V 3Ah Batterie angeschloßen.
Zum Testen hab ich Versucht and den PC0 einen Widerstand hängen und den
auf die 5V vom µC gehängt, aber nach einen Spannungswert hat es mir
nicht ausgesehen.. (hab es um den Wert zu sehen in den eeprom
gepseichert)
1) wie könnte ich den adc wert sonst ausgeben ohne lcd display bzw.
eeprom ?
2) Soweit ich das richtig nachgelesen habe bekomme ich vom analog
eingang aber nur einen Spannungs wert und damit ich ich auf meinen Strom
komme müsste das dann so aussehen
u = ADC*5.0;
i = u/r;
3) Daher das eeprom auf ca. 100.000 cyclen brenzt ist, wird es nicht
sinnvoll sein den Wert immer zu beschreiben.
Meine Idee wäre so eine art dauerplus damit der µC immer unter
spannung (Ruhemodus oder so) ist und der Wert im RAM somit erhalten
bleibt aber geht das ohne das die Baterie gleich leer ist ?
1) seriell - ggf. mit einem USB-seriell (TTL)Adapter und einem
Terminalprogramm
2) Du bekommst Werte zwischen 0 und 1023. Was sie bedeuten hängt von der
Referenzspannung ab. Strom messen willst Du über einen Shunt? Mach mal
ne Skizze.
3) Miss mit einem anderen ADC die Betriebsspannung, und nur wenn sie
einbricht, speicherst Du im Eeprom. Meist hält der Elko hinter der
Spannungsversorgung so lange durch.
Hi Patrick,
dein AD-Wandler liefert einen Wert zwischen 0 und 1023 (bei 10 bit
Auflösung) Liegt dein Vref an 5V, dann bedeutet 0=0V, 1023=5V. Du musst
also rechnen: Vgemessen=ADWert*Vref/1023. Warum brauchst du den Wert
nach dem Wiedereinschalten? Du kannst den Wert im eeprom ja auch nur
dann aktualisieren, wenn er sich ändert. Mit zu deinem code kann ich
nichts sagen, da ich kein C kann.
Grüße von tschoeatsch
ok, danke
@Rainer:
Also dann würde ich z.B PC1 die AVCC (5V) messen und wenn diese unter
4.5V
abfällt könnte ich ihn in den set_sleep_mode(SLEEP_MODE_PWR_DOWN)
setzetn.
Wenn am INT0 wieder 5V anliegen sollte der Interrup reagieren und ihn
wieder starten.
Ist das so richtig oder habe ich einen denkfehler ?
@Michael:
denn Wert möchte ich nach dem einschalten nur zwecks interesse sehen
eventuell mit einer History über die letzen 10 Werte oder so,
momentan noch eher für Testzwecke.
Das mit dem eeprom werde ich lassen wegen der begrenzenten schreib
zyklen.
Der sleep mode spart nur Energie - wenn die Betriebsspannung weg ist,
ist der Ram-Inhalt (die Variable) auch weg, egal ob sleep mode oder
nicht.
Wenn die Betriebsspannung dann wiederkommt, startet das Programm von
vorn (z.B. durch die empfohlene Reset-Beschaltung) - ganz ohne
Interrupt.
Patrick Kag schrieb:> Also dann würde ich z.B PC1 die AVCC (5V) messen und wenn diese unter> 4.5V> abfällt könnte ich ihn in den set_sleep_mode(SLEEP_MODE_PWR_DOWN)> setzetn.
hi,
damit verbraucht er nur weniger strom und geht auch aus, wenn die
betriebsspannung ganz weg ist.
ausserdem wird der gemessene wert immer nahezu 1023 sein, wenn avcc die
referenz ist und du avcc misst.
da hakt es noch an vielen ecken, mach mal einen schaltplan.
gruß,
norbert
Patrick Kag schrieb:> Zum Testen hab ich Versucht and den PC0 einen Widerstand hängen und den> auf die 5V vom µC gehängt, aber nach einen Spannungswert hat es mir> nicht ausgesehen.. (hab es um den Wert zu sehen in den eeprom> gepseichert)
Das klingt nicht richtig.
Zum Testen verwendest du am bersten ein Potentiometer, das du so
verschaltest
1
+5V +
2
|
3
+-+
4
10k | |
5
--------------- zum ADC Pin
6
| |
7
+-+
8
|
9
+ GND
mit dem Poti kannst du dir dann eine Spannung zwischen 0 und 5V
einstellen, die du mit dem ADC messen kannst.
Aber mit einem einzelnen Widerstand wirst du da nichts reissen. Durch
den ADC fliesst so wenig Strom durch den Widerstand, das du da keinen
Spannungsabfall feststellen kannst. Es sei denn der Widerstand ist recht
groß, aber dann kriegst du wieder andere Probleme mit dem ADC.
> 1) wie könnte ich den adc wert sonst ausgeben ohne lcd display bzw.> eeprom ?
Deine tatsächlich beste Wahl wäre entweder erst mal ein LCD in Betrieb
zu nehmen oder die UART in Betrieb zu nehmen, damit du dir Zahlenwerte
direkt ausgeben lassen kannst.
Meiner Meinung nach ist es gerade als Neuling ein Fehler, auf
vernünftige Debug Hilfen, wie zum Beispiel Möglichkeiten zur Ausgabe, zu
verzichten. Selbst wenn deine endgltige Schaltung kein Display haben
wird, ist es trotzdem eine gute Idee, in der Entwicklungsversion
irgendeine Form der Ausgabe zur Verfügung zu haben. Wie du das mit ein
paar LED gemacht hast - das kann natürlich reichen. Mit den gleichen
Pins hättest du aber auch ein LCD ansteuern können und damit wesentlich
mehr Flexibilität beim Debuggen gehabt.
> 2) Soweit ich das richtig nachgelesen habe bekomme ich vom analog> eingang aber nur einen Spannungs wert
Dazu haben andere schon etwas gesagt.
Ich möchte eigentlich dazu nur ergänzen: Ich denke, du machst wieder den
Kardinalfehler Nummer 1 aller Neulinge. Du willst zu viel auf einmal,
indem du sofort auf das endgültige Ziel losgehst. Dazu schreibst du Code
und nichts funktioniert. Dann ist das Gejammer groß und man muss auf die
Neulinge einreden, wie auf ein krankes Kind, bis man sie dazu bringt,
mit einem ganz einfachen Programm anzufangen und das dann schrittweise
und mit viel testen bis zum endgültigen Programm auszubauen.
> switch (lastValue)> {> case > 700:
was auch immer du da programmierst, korrektes C ist das nicht.
Ok, der GCC hat so manche Erweiterung, allerdings würde ich mir
überlegen, ob ich die benutzen will. Ein
1
if(lastValue>700)
2
...
3
elseif(lastValue>600)
4
...
5
elseif...
ist ganz normales C, das jeder C Compiler versteht. Und durch den
Wegfall der ganzen break ist das in Summe auch noch kürzer in der
Schreibweise. Ich sehe hier keinen Vorteil in der Benutzung von
irgendwelchen Erweiterungen im switch-case. Ich würde einen Vorteil
darin sehen, wenn man sich die Anzahl der zu leuchtenden LED aus dem
Wert ausrechnet und dann zb mit einem Array das auszugebende Muster
bestimmt. So nach dem Muster
1
uint8_tMuster[]={0b11111111,// 0
2
0b11111110,// 128
3
0b11111100,// 256,
4
....
5
};
6
7
AnzahlLed=lastValue/128;
8
PORTD=Muster[AnzahlLed];
Das wäre schön einfach und kurz. Aber das tust du ja nicht.
Zusammen mit den ADC Routinen aus dem AVR-GCC-Tuorial hätte dein erstes
Testprogramm zum ADC so aussehen können
1
.....
2
3
uint8_tMuster[]={0b11111111,// 0
4
0b11111110,// 128
5
0b11111100,// 256,
6
0b11111000,
7
0b11110000,
8
0b11100000,
9
0b11000000,
10
0b10000000,
11
0b00000000
12
};
13
14
15
intmain()
16
{
17
uint16_tvalue;
18
19
DDRD=0xFF;
20
21
ADC_init();
22
23
while(1){
24
value=ADC_Read(0);
25
if(value>1023)
26
value=1023;
27
value/=128;
28
PORTD=muster[value];
29
}
30
}
Poti an den ADC angeklemmt und die LEDs müssten bereits auf drehen am
Poti reagieren, was dir die Gewissheit gibt, das der ADC mal prinzipiell
arbeitet und du vernünftige Werte kriegst.
Ausbauen kann man immer noch. Aber das wäre mein erstes Testprogramm.
Gedanken über EEPROM oder Sleep Modi kann ich mir immer noch machen.
Aber sicher nicht jetzt, wenn es darum geht, dem ADC ein erstes
Lebenszeichen zu entlocken. Und das beste drann: das hat keine Stunden
gedauert sondern lediglich ein paar Minuten.
Hallo Karl,
danke, für die Hilfe ich habe mich jetzt nur auf das Lesen es ADC
konzentriert...
meine Schaltung hab ich auch dran gehängt.
Mein aktuelles Problem ist das der ADC wert > 205 und < 409 ist und das
Immer sogar wenn nichts angeschlossen ist ?
Ich konnte den Fehler noch nicht finden, daher ich noch kein Poti habe
verwende ich verschiedene widerstände.