Forum: Mikrocontroller und Digitale Elektronik Festkommaarithmetik und Int32 Konstanten?


von Ernst B. (puravida)


Lesenswert?

Hi!

Ich habe max. sieben AVR µC und überwache die anliegende Spannung mit 
Hilfe des Bandgap-Wertes der µC. Sechs der µC senden per Funk ihren 
ADC-Wert der Spannungsüberwachung an den siebenten µC der sozusagen die 
Zentrale bildet.

Jetzt ist es so, daß diese Bandgap-Spannung sehr stark differiert von µC 
zu µC und ich muß für jeden µC seine spezielle Bandgap-Spannung in die 
Berechnung mit einbeziehen.

Ich habe mich außerdem an den Artikel Festkommaarithmetik gehalten damit 
ich nicht mit float-Variablen arbeiten muß und habe von dort den Tipp 
übernommen Dinge, soweit sie zu berechnen sind mal zu berechnen und als 
Konstante abzulegen.

Das führt bei mir zu folgender Codezeile:
1
const uint32_t spannungsfaktor = ((uint32_t)ADC_RESOLUTION*(uint32_t)BANDGAP_ZENTRALE);

Wenn ich jetzt alle anderen Bandgap-Werte auch als Const abspeichere 
etwa in der Form
1
const uint32_t spannungsfaktor[7];
2
spannungsfaktor[0] = ((uint32_t)ADC_RESOLUTION*(uint32_t)BANDGAP_ZENTRALE);
3
...

frage ich mich:

1. Darf man Array-Werte überhaupt zu Konstanten erklären?
2. Ist es gescheit so viele uint32 Variablen zu definieren? Ich denke, 
da wird der µC bald anfangen eine Menge hin und her zu schieben.

Alternativ könnte ich die ganze Berechnung samt Umwandlung in einen 
String auf den einzelnen µC machen lassen und ich übertrage dann ein 
Array bestehend aus 12Byte.

Zeit hätten die einzelnen µC genug. In der Zentrale kommt doch einiges 
an Code zusammen da die Zentrale herausfinden muß welcher Datenstrom von 
welchem µC kommt, die Umrechnungen der ADC-Werte und Umwandlungen in 
String und die Anzeige fürs LCD aufbereiten.

Ich sehe es aber als Nachteil an 12 Bytes zu übertragen statt nur zwei 
Bytes für den ADC-Wert. Wie ist da das typische Vorgehen in so einem 
Fall? So wenig Daten wie möglich übertragen und alles was geht in der 
"Zentrale" berechnen oder lieber die Last verteilen?

LG
Ernst

von holger (Gast)


Lesenswert?

>Jetzt ist es so, daß diese Bandgap-Spannung sehr stark differiert von µC
>zu µC und ich muß für jeden µC seine spezielle Bandgap-Spannung in die
>Berechnung mit einbeziehen.

Für eine schnöde Spannungsüberwachung würde ich einfach
Min Max Grenzen festlegen die die Bandgap Toleranzen mit ein bisschen
Aufschlag enthalten und sonst gar nichts berechnen. Da geht es ja nun
nicht um 50% Abweichung;)

von Ernst B. (puravida)


Lesenswert?

holger schrieb:
>>Jetzt ist es so, daß diese Bandgap-Spannung sehr stark differiert von µC
>>zu µC und ich muß für jeden µC seine spezielle Bandgap-Spannung in die
>>Berechnung mit einbeziehen.
>
> Für eine schnöde Spannungsüberwachung würde ich einfach
> Min Max Grenzen festlegen die die Bandgap Toleranzen mit ein bisschen
> Aufschlag enthalten und sonst gar nichts berechnen. Da geht es ja nun
> nicht um 50% Abweichung;)

Das wäre natürlich auch eine Möglichkeit.

Wenn man aber doch wollte, was wären die Antworten auf meine Frage oben?

LG
Ernst

von dummschwaetzer (Gast)


Lesenswert?

ErnstB schrieb:
> const uint32_t spannungsfaktor[7];
> spannungsfaktor[0] = ((uint32_t)ADC_RESOLUTION*(uint32_t)BANDGAP_ZENTRALE);
...
da wird der Kompiler meckern
> Ich sehe es aber als Nachteil an 12 Bytes zu übertragen statt nur zwei
> Bytes für den ADC-Wert. Wie ist da das typische Vorgehen in so einem
> Fall? So wenig Daten wie möglich übertragen und alles was geht in der
> "Zentrale" berechnen oder lieber die Last verteilen?
Wenn noch genug Reserve in den 6 sendenden spricht auch nichts dagegen, 
in den diesen den Wert erst zu normieren.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Ernst B. schrieb:

> Wenn man aber doch wollte, was wären die Antworten auf meine Frage oben?

Kommt drauf an...

...in welchem Kontext das ganze steht. Meine Kristallkugel sagt, es ist 
eine lokale Variable. ...Moment, jezt sehe ich deutlich eine globale...

von PuraVida (Gast)


Lesenswert?

Johann L. schrieb:
> Ernst B. schrieb:
>
>> Wenn man aber doch wollte, was wären die Antworten auf meine Frage oben?
>
> Kommt drauf an...
>
> ...in welchem Kontext das ganze steht. Meine Kristallkugel sagt, es ist
> eine lokale Variable. ...Moment, jezt sehe ich deutlich eine globale...

Servus!

Ich meine hier in den Artikeln gelesen zu haben, daß man const so zeitig 
wie möglich Deklarieren soll. Also ist es im Moment eine globale 
Variable. Aber da bin ich flexibel, kann von mir aus auch eine lokale 
main Variable sein.

LG

von Detlev T. (detlevt)


Lesenswert?

Wenn du const angibst, sollte der Compiler meckern, wenn man trotzdem 
etwas zuweist. Dazu ist dieses Attribut ja u.a. da. Daher muss man das 
Array per Initialisierung füllen.
1
const uint32_t spannungsfaktor[7] = {(uint32_t)ADC_RESOLUTION*(uint32_t)BANDGAP_ZENTRALE),...........};
Das belegt dann beim GCC aber trotzdem noch wertvolles RAM. Das 
Verschieben ins Flash sollte man daher immer in Erwägung ziehen.

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.