Forum: Compiler & IDEs Timerprobleme (Unterspannungsanzeige)


von Robert S. (razer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo an alle

Ich hab ein Programm geschrieben, das alle ~5 Sekunden einen Wert über
A2D einließt (Timergesteuert). Wenn dieser Wert unter 614 ist, wird
dieser im Eeprom abgelegt und ein Zähler um 1 erhöht. Doeser wird auch
im Eeprim abgelegt. Erst wenn der Wieder einmal über 614 war, kann der
Wert und der Zähler um eins erhöht werden. Das ganze hab ich für 2 A2D
Kanäle gemacht. Weiters hab ich eine Unterfunktion zum Auslesen der
Wert aus dem Eeprom. (FUnktionsaufruf wenn PD7 gedrückt ist).

Nur leider funktioniert es nicht wie sollte. Bei jeder MEssungen kommen
zusätzlich Zeichen aufs Display die eigentlich nicht dort hingehören.
Ich weiß aber nicht warum

Sobald ein falsches Zeichen aus der main (messfunktion) am Display ist,
werden bei der lesefunktion auch falsche Zeichen Dargestellt.

Das Abspeichern im Eeprom funktioniert auch nicht.

Als Prozessor verwende ich einen Mega8.

Ich hoffe mir kann jemand helfen. Im Anhang ist die main.

Danke im Voraus

Gruß Robert

von johnny.m (Gast)


Lesenswert?

Ein Fehler fällt mir schon mal sofort auf: Was soll die Deklaration
volatile uint16_t zelle[1]; ???
Ein Array mit einem Element? Da im Programmverlauf 2 Elemente des
Arrays angesprochen werden, ist eine Fehlfunktion hier schon mal
vorprogrammiert.

Gruß

Johnny

von Robert S. (razer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo

Ich hab nun vieles geändert. Und es funktioniert so einigermaßen.

edoch funktioniert der Zähler für den Eeprom noch nicht Richtig. Der
EEprom hat doch nach einem Flash den Wert 255 (0xFF). Jedoch stimmt der
Wert beim nächsten Zählerzugriff nicht und es steht ein falscher Wert.
Ab hier zählt nun der Zähler im um 1 aufwärts.

Was ist da los?? Wann wird der EEprom gelöscht?? Nur wenn ich das
explizit im AVRDUDE mach???

Weiters versteh ich noch nicht das Auslesen. Das Auslesen der WORDs
funktioniert nur mit den Adressen 4,6. Ich dacht die Adressen sind
2,4.

Warum??

Im Anhang wieder der aktuelle Code

Gruß Robert

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Wann wird der EEprom gelöscht?

It depends.  By default, bei einem chip erase.  Du musst erst
die EESAVE-Fuse programmieren, damit das nicht mehr passiert.

Außerdem hat AVR Studio wohl (zumindest bei Benutzung des JTAG ICE)
noch eine, naja, Nicht-Intuitivität, wo du neben der EESAVE-Fuse noch
irgendwo versteckt irgendeinen Haken abwählen musst, der im
Einschaltzustand ebenfalls zur Zerstörung des EEPROM führt...  Ich
weiß, warum ich AVR Studio nicht leiden kann. ;-)

von Werner B. (Gast)


Lesenswert?

> Wann wird der EEprom gelöscht?

Das jeweilige Byte automatisch bei/vor jedem beschreiben.

P.S.
Falls es keine Rolle spielt ob exakt auf adresse 0, 2 oder 4 rate ich
das ganze dem Compiler und Linker zu überlassen.

Als Beispiel
1
...
2
#include <avr/eeprom.h>
3
4
#define IP_ADDRESS      {172,16,50,212}
5
#define MAC_ADDRESS     {0x00,0x00,0x1b,0x35,0xa4,0xaf}
6
7
uint8_t eeMYIP[4] __attribute__ ((section(".eeprom"))) = IP_ADDRESS;
8
uint8_t ee_mymac[6] __attribute__ ((section(".eeprom"))) =
9
MAC_ADDRESS;
10
11
//IP Adresse des Web Servers
12
uint8_t MYIP[4];
13
14
//MAC Adresse des Web Servers
15
uint8_t mymac[6];
16
17
...
18
19
    // MAC Adresse aus eeprom lesen
20
    eeprom_read_block(&mymac[0], &ee_mymac[0], sizeof(mymac));
21
    // IP Adresse aus eeprom lesen
22
    eeprom_read_block(&MYIP[0], &eeMYIP[0], sizeof(MYIP));
23
...

Das Schreiben erfolgt sinngemäß mit eeprom_write_block()

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.