Forum: Compiler & IDEs EEPROM Adresse über 255 und SOFT PWM Frage/Anliegen


von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe meinen ganzen Code mal angehangen, bzw. so weit wie ich jetzt 
bin.

Der Code kurz erklärt:

Zeile 9 - 13 prüfen ob ein bestimmter Wert im EEPROM steht.. Falls 
nicht, werden "Defaultwerte" in den EEPROM geschrieben.

Kann man das irgendwie ändern das ich nicht immer den Wert in der 
eeprom.h ändern muss sondern das nach einem "Flash" immer die 
Defaultwerte neu geschrieben werden?

Zeile 22 - 30

Je nachdem welcher "Boardmodus" eingestellt wird, soll das Board I/O 
oder PWM Board sein.

I/O

Das Board selber verfügt über mehrere Modes (onoff.* files)
1
volatile int onoffmodes[NUM_OF_ONOFF_MODES][NUM_OF_CHANS];

Ist der I/O Modus eingestellt kann man die "Modes" durchschalten.

In der loop wird dann nur verglichen und ggf. geschaltet...
1
if (IOs[i] != isIOs[i]) {
2
  onoff(i);
3
}

Das ganze hatte ich vorher nur mit einem Mode am laufen, das lief 
problemlos. Da die Daten auch "gespeichert" werden können sollen greife 
ich auf den EEPROM zurück. Das lief bis 2 Modes problemlos.

Nun mekkert der compilier mit
1
...........
2
...........
3
eeprom.c:520:52: warning: large integer implicitly truncated to unsigned type [-Woverflow]
4
 uint8_t eeDataPWMCH31_7 EEMEM                    = 521;
5
                                                    ^
6
eeprom.c:521:52: warning: large integer implicitly truncated to unsigned type [-Woverflow]
7
 uint8_t eeDataPWMCH32_7 EEMEM                    = 522;

Wie bekomme ich mehr EEPROM Adressen als 255 zugewiesen? Also das ganze 
funktioniert ja so.. nur eben.. ja.. sobald ich mehr EEPROM Adressen 
will, geht es nicht mehr...

Was kann ich dagegen machen?

Nun soll das Board noch Software PWM haben....

Also wenn der Boardmode auf 2 (PWM) ist soll er.. ebenso wie bei IO die 
PWM Werte vergleichen und 32CH Software PWM machen...

Wie stelle ich das am besten an?

Der ATMega128 wird mit einem 16Mhz Quarz betrieben.

: Verschoben durch Moderator
von AtzeM (Gast)


Lesenswert?

Ohne mir das ganze Zeugs reingezogen zu haben, was wohl bei der 
Datenmenge  und der kurzen und "wirren" Beschreibung viele Mitleser 
abschrecken wird...

 ->  irgendwo scheinst Du da wohl einen Overflow deiner Variable (8bit 
!; max 255dec) zu haben... Da schau mal nach.

von AtzeM (Gast)


Lesenswert?

Du scheinst wohl einem 8bit Wert Zahlen größer 255 zuweisen zu wollen...

von A. B. (Gast)


Lesenswert?

Ohne jemandem zu nahe treten zu wollen: Es wäre ratsam, zuerst ein 
C-Buch gründlich durchzuarbeiten, speziell die Begriffe 'array', 
'struct', 'for'-Schleife. Das spart viel Tipparbeit (was da in eeprom.c 
bzw. eeprom.h steht, ist in meinen Augen eher eine Strafarbeit). Und 
hinterher auch Flash ...

Vielleicht wird dann auch klar, dass es bei dem Fehler bei
  uint8_t eeDataPWMCH31_7 EEMEM                    = 521;
überhaupt nicht um eine EEPROM-Adresse geht (darum kümmert sich der 
Compiler intern, die bekommt man normalerweise nicht zu Gesicht), 
sondern, dass da einer uint8_t-Variablen (die nur Werte von 0 bis 255 
annehmen kann!) ein Wert außerhalb des möglichen Bereichs zugewiesen 
werde soll. Das macht keinen Sinn.

von Daniel (Gast)


Lesenswert?

Ich habe jetzt die /usr/lib/avr.... eeprom.h abgeändert sodass auch 
uint16_t geht...

Dazu die uint8_t in meinem Code in uint16_t geändert...

Tada.. Funktioniert.

von OMG (Gast)


Lesenswert?

Daniel schrieb:
> Tada.. Funktioniert.

Dieses Chaos soll funktionieren?

Ich habe auch keine Lust das alles genau durchzuschauen, aber
eines ist nach einem kurzen Blick in ein paar Sources sicher:

Die definierst mehrmals (also in mehreren Fällen) Variablen
in Header-Dateien. Das tut man nicht und das wird dir - wenn
nicht schon passiert - irgendwann auf die Füsse fallen. Das
ist Programmieren unter aller Sau denn du weisst gar nicht
so recht was du da tust.

von Daniel (Gast)


Lesenswert?

Nunja... Ich komme aus einer Code Welt... Wo es so was kompliziertes 
nicht gibt.
1
function foobar($value) {
2
  Tu etwas
3
}

vs
1
void foobar(int $value) {
2
  Tu etwas
3
}

Oben ist es völlig gleich ob das nen string, nen int oder was auch immer 
ist.. Und auch ob 0 oder 250 oder 18374728

Das ist dem Code völlig schnuppe.

Und im unteren?! Alles nur eingeschränkt.

C halt

von OMG (Gast)


Lesenswert?

Daniel schrieb:
> Nunja... Ich komme aus einer Code Welt... Wo es so was kompliziertes
> nicht gibt.

Faule Ausrede.

Das mehrfache Definieren von einer Variablen desselben Namens - so
wie es bei deinem Sourcen-Gefüge passieren kann - wird dir in
"einer anderen Code Welt" auch auf die Füsse fallen.

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.