mikrocontroller.net

Forum: Compiler & IDEs Integer-Problem


Autor: Enteroctopus Dofleini (enteroctopus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich bin hier grade am verzweifeln. Ich habe mit ein Tastenfeld mit 3 
Tasten(Taster) gebaut. Hinter Jedem Taster liegt ein Wiederstand. Wenn 
ich mich nicht irre sind dies: 560; 1,2k; 2,2k.

Über einen der ADC-PINs wird dann gemessen welcher Taster gedrückt 
wurde.

Das ganze hat auch immer mal wieder funktioniert, jedoch habe ich 
Probleme mit dem Integer, den mir der ADC zurückgibt.
Die funktion zum Messen des ADC-Wertes habe ich hier aus dem Forum und 
ist meiner Meinung nicht daran schuld. Es ist im Prinzip eine 
Single-conversion, die nach mehrmaligem Messen einen 
Druchschnitterrechnet.

Wie gesagt, hat alles auch schon funktioniert.
Für den "Nach-Links-Knopf" habe ich einen Wert von ~339; Enter hat ~448, 
Rechts ~224.

Das eigentliche Proble ist, das ich 3 Zeilen im Programm geändert habe 
und nun (mal wieder) statt dem Wert 339 wirkürlich zb: 8339 oder 1339 
ausgegeben bekomme.

Da ich aus der PC-Programmierung (Java) komme sind mir fehler dieser Art 
nicht sonderlich bekannt.

Ich habe schon an einen Überlauf gedacht, jedoch kann ich mir nicht 
erklären wie sieder zu stande kommen soll.
Ich mache 15 Messungen. Pro Messung ein max.-Wert von 1023.
15*1023 = 15345 ; das sollte doch eigentlich in einen uint16 passen?!
Danach wird wieder durch 15 geteilt um auf den Mittelwert zu kommen.

Aber wie gesagt, der Fehler tritt erst auf, seit dem ich 2 Ausgaben mehr 
auf das Display werfe.
Selbst wenn ich die Zeilen wieder rausnehme bekomme ich keinen richtigen 
Wert mehr.

Ich werd jetzt aus frust einen anderen Mega testen. Mir wäre aber sehr 
beholfen wenn ihr mir mögliche fehlerquellen bei Integerberechnungen 
nahelegt.

Ich dreh hier sonst noch durch ...

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ohne Quellcode kann dir hier kaum jemand helfen.

Aber ich würde 16 Messungen machen und durch 16 Teilen - das gefällt dem 
µC besser.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enteroctopus Dofleini schrieb:

> Ich mache 15 Messungen. Pro Messung ein max.-Wert von 1023.

16 wären besser.
16 ist eine 2-er Potenz

> Aber wie gesagt, der Fehler tritt erst auf, seit dem ich 2 Ausgaben mehr
> auf das Display werfe.
> Selbst wenn ich die Zeilen wieder rausnehme bekomme ich keinen richtigen
> Wert mehr.

Fehler dieser Art sind oft an ganz anderer Stelle zu suchen.
Array-Überläufe, Stack zerschossen oder anderes in dieser Richtung.

> Ich dreh hier sonst noch durch ...

Sollst du nicht.
Geh deinen Code durch. Überprüf jede einzelne Operation.
Kann das Ergebnis den zulässigen Zahlenbereich verlassen?
Ist ein Array im Spiel? Kann es sein, dass der Array Index hinter oder 
vor dem Array liegt
Ist ein Pointer im Spiel? Zeigt der immer auf etwas sinnvolles?
Handelt es sich um einen String? Habe ich bedacht, dass ich für das '\0' 
Byte ein Byte mehr reservieren muss als augenscheinlich notwendig.
Kann es sein, dass ich zuviele lokale Variablen habe und mir der Stack 
in den Heap wächst?

Es gibt noch mehr potentielle Problem, aber mit der Liste sollte das 
meiste abgehakt sein. Letztendlich geht es meistens darum, dass das 
Programm Speicherzellen verändert, die eigentlich nicht verändert werden 
dürften.

Autor: Enteroctopus Dofleini (enteroctopus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal versucht das ganze in Minimalkonfiguration Nachzustellen. 
Jetzt ist mir zu mindest ersichtlich, das die letzte Ziffer auch an 
erster Stelle steht.
Ich gehe mal davon aus das es ein Problem mit dem Zeiger ist.
Aber wie kann ich das vermeiden?

int main(void){
    char *buffer;

    // TastennummerN: Links: 339; Enter 448; Rechts: 224
    unsigned long num=0;

  initLCD();

  DDRC = (1<<PC0) | (1<<PC1) | (1<<PC2);// | (1<<PC0);
  PORTC = (1<<PC1) | (1<<PC2);

    while(1) {

    num=ReadChannel(PC0);
    ltoa(num, buffer, 10);
    lcd_puts( buffer );
    lcd_puts("\n");
    num=0;
    }
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> char *buffer;
danach hast du ein Zeiger, aber dieser zeitg irgednwo hin. Du musst erst 
speicher anfordern.


oder besser

char buffer[10];

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enteroctopus Dofleini schrieb:

> Aber wie kann ich das vermeiden?

Speicher fuer deinen String beschaffen waere ein guter Anfang.

Z.B:
    char buffer[ 7];

Und ein C-Buch waere gut und programmieren nochmal von Anfang an lernen.

Autor: Enteroctopus Dofleini (enteroctopus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Stegemann schrieb:
> Enteroctopus Dofleini schrieb:
>
>> Aber wie kann ich das vermeiden?
>
> Speicher fuer deinen String beschaffen waere ein guter Anfang.
Nein. Ein indiziertes Array ist durchaus noch etwas anderes!
>
> Z.B:
>     char buffer[ 7];
>
> Und ein C-Buch waere gut und programmieren nochmal von Anfang an lernen.
Sorry, aber solche Anworten bringen mich nicht weiter und ist der Grund 
warum ich selten in Foren unterwegs bin! C-Bücher habe ich zu hauf hier 
liegen, aber Schulwissen ist hier nicht gefragt!

Da steht nämlich nicht mehr, sondern weniger drin als der Copiler 
wirklich macht!

Ein chararray hilft mir hier nicht weiter, da hierbei die letze stelle 
abgeschnitten wird - warum auch immer.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enteroctopus Dofleini schrieb:


> Ein chararray hilft mir hier nicht weiter,

Doch. Das tut es.
Zumindest in deinem hier geposteten Demo-Programm

> da hierbei die letze stelle
> abgeschnitten wird - warum auch immer.

Wahrscheinlich, weil du es zu klein dimensioniert hast.

> C-Bücher habe ich zu hauf hier
> liegen, aber Schulwissen ist hier nicht gefragt!

Wenn du irgendwo etwas abspeichern willst, benötigst du eine 
Speicherfläche dafür. Eine Pointervariable ist selbst keine 
Speicherfläche, sie verweist nur auf eine.

Ein Pointer ist im Grunde nichts anderes als ein Zettel in der 
Bibliothek, auf dem steht: Das Malbuch findet sich im Gang 5, Regal 2, 
unterste Ablage.

Nur wenn das auf dem Zettel steht, sollte besser sichergestellt sein, 
dass im Gang 5, Regal 2, unterste Ablage auch tatsächlich das Malbuch 
steht, in dem du zu malen gedenkst.

Dem Compiler ist das wurscht. Der schreibt auch dorthin, wenn dort die 
Magna Carta steht.

Autor: Michael W. (retikulum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wieso ein long? Int reicht vollkommen.

Michael

Autor: Enteroctopus Dofleini (enteroctopus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, das Bsp mit dem Zettel ist nicht besonders optimal: Ein Zettel ist 
eine Speicherfläche!

Aber wieso wird denn beim char[4] die letze Stelle abgeschnitten?
Statt 448 bekomme ich immer nur 44

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enteroctopus Dofleini schrieb:
> Naja, das Bsp mit dem Zettel ist nicht besonders optimal: Ein Zettel ist
> eine Speicherfläche!

Auch ein Pointer ist eine Speicherfläche. Aber er nimmt nur die Adresse 
im Speicher auf, wo die von dir gewünschte Information steht.
(Insofern ist die Aussage von weiter oben: "Ein Pointer ist keine 
Speicherfläche" misverständlich. Gemeint war: Du speicherst dort nicht 
deine Texte oder sontige Daten ab, sondern die Adresse wo die Daten zu 
finden sind)

Die Analogie mit Zettel und etwas was darauf geschrieben steht, stimmt 
sogar ziemlich gut. Auf manchen Zetteln steht die von dir gewünschte 
Information. Auf wieder anderen steht drauf: Um die Information zu 
finden, sieh dort und dort nach. Letzteres sind genau die Pointer.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enteroctopus Dofleini schrieb:
> Naja, das Bsp mit dem Zettel ist nicht besonders optimal: Ein Zettel ist
> eine Speicherfläche!
>
> Aber wieso wird denn beim char[4] die letze Stelle abgeschnitten?
> Statt 448 bekomme ich immer nur 44


Dann zeig den Code dafür.
Solange du ltoa irgendwo in den Speicher schreiben lässt (weil du ihm 
einen uninitialisierten Pointer übergibst), kannst du dich auf nichts 
verlassen.

Autor: Enteroctopus Dofleini (enteroctopus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Enteroctopus Dofleini schrieb:
>> Naja, das Bsp mit dem Zettel ist nicht besonders optimal: Ein Zettel ist
>> eine Speicherfläche!
>
> Auch ein Pointer ist eine Speicherfläche. Aber er nimmt nur die Adresse
> im Speicher auf, wo die von dir gewünschte Information steht.
>
> Die Analogie mit Zettel und etwas was darauf geschrieben steht, stimmt
> sogar ziemlich gut. Auf manchen Zetteln steht die von dir gewünschte
> Information. Auf wieder anderen steht drauf: Um die Information zu
> finden, sieh dort und dort nach. Letzteres sind genau die Pointer.

Richtig, richtig...

Mal kurz und schmerzlos: So blöd bin ich nicht, nur weil ich 14 Jahre 
kein C mehr gesprochen habe heisst das nicht das ich nichts mehr wüßte!

Mir ist der unterschied durchaus bewusst, aber hilft mir das nicht 
weiter...

Zeiger -> zeigt auf den Anfang in eines undefinierten Speicherbereich
Array -> Indizierter Speicherbereich bei dem anfang un Ende bekannt sind 
und auf den mittels Zeiger zugegriffen werden kann

Es sei jetzt (noch)mal dazu gesagt, das es mit dem Zeiger bereits 
funktioniert hat ( in einem wesentlich größerem Code).
Mit dem Array widerum wurde immer die letzte Stelle abgeschnitten, daher 
habe ich mich mit dem Zettel bisher zufrieden gegeben.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enteroctopus Dofleini schrieb:

> Mal kurz und schmerzlos: So blöd bin ich nicht, nur weil ich 14 Jahre
> kein C mehr gesprochen habe heisst das nicht das ich nichts mehr wüßte!

Es sieht aber definitiv so aus, als ob du das nicht mehr wüsstest.
Das was du hier treibst, ist noch nicht mal im Ansatz argumentier- oder 
interpretierbar. Es verstößt gegen jegliche C-Regeln und du landest 
sofort bei dem, was der C-Standard "undefiniertes Verhalten" nennt.

> Es sei jetzt (noch)mal dazu gesagt, das es mit dem Zeiger bereits
> funktioniert hat ( in einem wesentlich größerem Code).

Es mag so ausgesehen haben.
Funktioniert hat es aber nie wirklich. Du hattest einfach nur das Pech, 
dass sich der Fehler nicht gezeigt hat.

Merke: Nur weil ein Programm kein Fehlverhalten zeigt, heißt das noch 
lange nicht, dass es fehlerfrei ist. Durch Testen kann man immer nur das 
Vorhandensein von Fehlern nachweisen, aber nie die Fehlerfreiheit eines 
Programmes.

> Mit dem Array widerum wurde immer die letzte Stelle abgeschnitten, daher
> habe ich mich mit dem Zettel bisher zufrieden gegeben.

Dann sollte man dort den Hebel ansetzen.
Wenn du einen Fehler korrigierst und das Programm funktioniert immer 
noch nicht richtig, hast du noch mindestens einen weiteren Fehler im 
Programm. Fehler werden nicht dadurch korrigiert, indem man einen 
Gegenfehler einbaut, sodass sich beide scheinbar aufheben.

Das hier
int main(void){
    char *buffer;

    ...

    ltoa(num, buffer, 10);

    ...
}

ist definitiv und unzweifelhaft ein Fehler. Sogar ein ziemlich schwerer 
Fehler. Auch dann, wenn dein Testprogramm scheinbar damit funktioniert.
int main(void){
    char buffer[10];   // nicht kleckern, klotzen!

    ...

    ltoa(num, buffer, 10);

    ...
}

Autor: Enteroctopus Dofleini (enteroctopus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mich wundert nur, das in einem "3-Zeiler" (siehe oben) so schwere fehler 
sitzen können.

Hier mal die abfrage des ADCs:
Ansonsten sollte der Minicode oben ausreichen um das ganze zu testen

uint16_t ReadChannel(uint8_t mux) {
  uint8_t i;
  uint16_t result;

  ADMUX = mux;                      // Kanal waehlen
  ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen

  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler
                               // setzen auf 8 (1) und ADC aktivieren 
(1)

  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man 
liest
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu 
lassen" */
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung
  while ( ADCSRA & (1<<ADSC) ) {
     ;     // auf Abschluss der Konvertierung warten
  }
  result = ADCW;  // ADCW muss einmal gelesen werden,
                  // sonst wird Ergebnis der nächsten Wandlung
                  // nicht übernommen.

  /* Eigentliche Messung - Mittelwert aus 15 aufeinanderfolgenden 
Wandlungen */
  result = 0;
  for( i=0; i<16; i++ ) {
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) ) {
      ;   // auf Abschluss der Konvertierung warten
    }
    result += ADCW;        // Wandlungsergebnisse aufaddieren
  }
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)

  result /= 16;                     // Summe durch vier teilen = arithm. 
Mittelwert

  return result;
}


Jetzt mal Hypothetisch:
Wenn ich ein Array nutze bei dem die letze Stelle abgeschnitten wird, 
kann das zu weiteren Problemen führen?
Der Genau Wert ist mir im grunde wurst, da es mit nur darum geht 
herauszufinden welcher Taster gedrückt wurde. Und da die beiden ersten 
Ziffern sich genügend unterscheiden wäre das kein Problem.

Autor: Enteroctopus Dofleini (enteroctopus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Enteroctopus Dofleini schrieb:
>
>> Mal kurz und schmerzlos: So blöd bin ich nicht, nur weil ich 14 Jahre
>> kein C mehr gesprochen habe heisst das nicht das ich nichts mehr wüßte!
>
> Es sieht aber definitiv so aus, als ob du das nicht mehr wüsstest.
...
Nicht behaupten - Wissen!

Genau so hat es ja nie funktioniert.
Ich bekomme nur eine Zweistellige Zahl, die allerdings 3 stellig sein 
muss.
Deshalb mein unverständniss...

>
> int main(void){
>     char buffer[10];   // nicht kleckern, klotzen!
> 
>     ...
> 
>     ltoa(num, buffer, 10);
> 
>     ...
> }
> 

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enteroctopus Dofleini schrieb:
> Mich wundert nur, das in einem "3-Zeiler" (siehe oben) so schwere fehler
> sitzen können.

So ist das nun mal in der C-Programmierung.
Es gibt kein Sicherheitsnetz.

> Hier mal die abfrage des ADCs:
> Ansonsten sollte der Minicode oben ausreichen um das ganze zu testen

Da brauche ich nichts testen. Fehler ist Fehler. Und dieser Fehler ist 
einer von der Sorte, der mit einem Blinklicht auf sich aufmerksam macht. 
Wenn man weiß, wonach man suchen muss, natürlich.

> Jetzt mal Hypothetisch:
> Wenn ich ein Array nutze bei dem die letze Stelle abgeschnitten wird,
> kann das zu weiteren Problemen führen?

Es deutet darauf hin, dass es noch mindestens einen weiteren Fehler 
gibt.

> herauszufinden welcher Taster gedrückt wurde. Und da die beiden ersten
> Ziffern sich genügend unterscheiden wäre das kein Problem.

Behebe die Ursachen und hör auf an den Symptomen rumzudoktern.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enteroctopus Dofleini schrieb:

> Mich wundert nur, das in einem "3-Zeiler" (siehe oben) so schwere fehler
> sitzen können.

Wenn man ausreichend Ahnungslosigkeit mit Arroganz koppelt, dann geht 
sowas ganz einfach. Und dir fehlen die wesentlichen Grundlagen fuer C.

> Der Genau Wert ist mir im grunde wurst, da es mit nur darum geht
> herauszufinden welcher Taster gedrückt wurde. Und da die beiden ersten
> Ziffern sich genügend unterscheiden wäre das kein Problem.

Das ist genau der Murks, den ich von Java-Entwicklern gewohnt bin...

Du hast von sowohl von mir, als auch von Karl Heinz (wie gewohnt sehr 
ausfuehrlich :-) Korrekturen bekommen - wie waere es, die erst einmal 
umzusetzen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Stegemann schrieb:

> ausfuehrlich :-) Korrekturen bekommen - wie waere es, die erst einmal
> umzusetzen?

:-)
Das tut er nicht, denn dann würden sich weitere Fehler bemerkbar machen.
Er ist von der Sorte, die lieber einen Pappendeckel über die Beule am 
Auto machen und den überlackieren, anstatt das fachmännisch richten zu 
lassen. Selbst dann, wenn die Beule in der Fahrertür so gross ist, dass 
er das Kupplungspedal nicht mehr erreichen kann. Dann muss eben ein 
Seilzug her, mit dem man die Kupplung bedienen kann. Oder es muss dann 
eben ohne Kupplung gehen. Wenn dann das Getriebe hops geht, ist auf 
keinen Fall die nicht fachmännisch behobene Beule schuld. Statt dessen 
kleben wir lieber das Loch im Getriebegehäuse mit Klebeband zu.

Autor: Enteroctopus Dofleini (enteroctopus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein letzes mal in diesem Forum: Eure korrekturen habe ich alle bereits 
vorher getestet und werden daher von mir nicht als solche bewertet.

Bisher waren es mal wieder 3 Std Forenzeit ohne fortschritt, im 
gegenteil ich werde als unwissen dahingestellt ohne das auch nur 
annähernd gefragt wurde was überhaupt alles schon getestet wurde.
Den einzigen Post der in meinen augen annhembar war ist der erste von 
Karl Heinz - Immerhin hat er sich bemüht auf die frage einzugehen.
Der rest war nichts weiter als - "ich möchte auch gerne was dazu 
schreiben"

Wenn doch alle so gut informiert sind, warum geht es dann nicht mit dem 
Array?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enteroctopus Dofleini schrieb:
> Ein letzes mal in diesem Forum: Eure korrekturen habe ich alle bereits
> vorher getestet und werden daher von mir nicht als solche bewertet.

Wem nicht zu helfen ist.

> Bisher waren es mal wieder 3 Std Forenzeit ohne fortschritt, im
> gegenteil ich werde als unwissen dahingestellt ohne das auch nur
> annähernd gefragt wurde was überhaupt alles schon getestet wurde.

Da geht es nicht um testen.
Der Fehler ist für jeden C-Programmierer so offensichtlich, 
offensichtlicher geht es nicht. Wenn alle Fehler so einfach zu finden 
wären, könnte ich meine 40-Stunden Woche auf 5 Stunden verkürzen.

> Wenn doch alle so gut informiert sind, warum geht es dann nicht mit dem
> Array?

Zeig doch mal, WAS nicht geht!
Aber genauen, exakten Code bitte.

In der Programmierung kommt man mit Winken aus der Ferne nicht weiter. 
Die Details sind es, die den Unterschied ausmachen.

Wahrscheinlich strotzt das Programm nur so von immer dem gleichen 
Fehler: Du schreibst in Speicherbereiche, in denen du nichts verloren 
hast (sprich: du benutzt uninitialisierte Pointer). Solange der Compiler 
dort keine anderen Variablen angesiedelt hat, sieht das dann so aus, als 
ob alles in Ordnung ist. Aber wehe, wenn sich die Memory-Konfiguration 
deines Programmes verändert ....

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enteroctopus Dofleini schrieb:

> Bisher waren es mal wieder 3 Std Forenzeit ohne fortschritt, im
> gegenteil ich werde als unwissen dahingestellt ohne das auch nur
> annähernd gefragt wurde was überhaupt alles schon getestet wurde.

Und da das Problem in deinem geposteten Testprogramm jetzt nun 
hinreichend oft durchgekaut wurde, hat es auch keinen Sinn danach zu 
fragen, was bei deinem richtigen Programm getestet wurde, solange die 
Erkentniss aus dem Testprogramm ("so gehts nicht") nicht konsequent in 
deinem richtigen Programm eingebaut und umgesetzt wurde.

Dir scheint nicht klar zu sein, dass das Auftreten eines Fehlers nach 
der Behebung eines anderen Fehlers etwas Gutes ist. Dem kann man 
nachgehen und wiederrum diesen beheben. Interessant wird es erst, wenn 
sich kein Fehler mehr zeigt. Dann ist die spannende Frage: Wars das 
jetzt oder schlummert noch etwas in den Tiefen und ich habe es bis jetzt 
einfach nur nicht bemerkt.

Oder was in die gleiche Kerbe schlägt:
Wenn ein Programm anscheinend auf Anhieb funktioniert, dann stimmt etwas 
nicht.

Autor: Enteroctopus Dofleini (enteroctopus)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> Wahrscheinlich strotzt das Programm nur so von immer dem gleichen
> Fehler: Du schreibst in Speicherbereiche, in denen du nichts verloren
> hast (sprich: du benutzt uninitialisierte Pointer). Solange der Compiler
> dort keine anderen Variablen angesiedelt hat, sieht das dann so aus, als
> ob alles in Ordnung ist. Aber wehe, wenn sich die Memory-Konfiguration
> deines Programmes verändert ....

Kann ich mir zwar nicht vorstellen, da es ebend nur noch aus den paar 
Zeilen (siehe oben) besteht, aber ich hab es mal als anhang beigefügt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf die Schnelle:

Tu dir selbst einen Gefallen und dimensioniere deine Buffer nicht so 
knapp.

    char buffer[4];

->

    char buffer[10];

Dann hast du einen, wenn auch kleinen, Sicherheitspolster, falls in 
ReadChannel dann doch irgendwann einmal etwas größeres als 999 
rauskommen sollte (zb. bei einem Hardwarefehler an deinen Widerständen)

Die Funktion, um einen unsigned long in seine ASCII Form zu überführen, 
heißt ultoa. Aber daran liegt es momentan nicht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Apropos:

Wie sind eigentlich deine Widerstände genau verschaltet. Wenn keine 
Taste gedrückt ist, ist sichergestellt, dass der ADC Eingang nicht 
einfach in der Luft hängt und jedes dahergelaufene elektromagnetische 
Feld ausmisst?

Autor: Enteroctopus Dofleini (enteroctopus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ich weiß. Der long steht auch nur wegen der vielen anderen 
misserfolge da. Ebenso die entsprechende konvertirungsfunktion...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abgesehen davon, muss dieses Programm dann aber auch die richtigen Werte 
anzeigen.
Wenn nicht, kann es immer noch ein Hardwareproblem sein (die ADC Routine 
hab ich jetzt nicht im Detail angesehen. Sieht aus wie eine 1:1 Kopie 
der Tutorial Routine). Am Programm liegt es dann aber auf jeden Fall 
nicht mehr.

Autor: Enteroctopus Dofleini (enteroctopus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Apropos:
>
> Wie sind eigentlich deine Widerstände genau verschaltet. Wenn keine
> Taste gedrückt ist, ist sichergestellt, dass der ADC Eingang nicht
> einfach in der Luft hängt und jedes dahergelaufene elektromagnetische
> Feld ausmisst?

Na wenigstens mal eine frage bei der ich meine schwäche zeigen muss, 
denn da habe ich keine Bücher (sondern nur ein Buch ;) ) drüber.

Derzeit hängt der ADC in der Luft.

PC0(ADC)-----------------
           |     |      |
           \     \      \
           560  1,2k   2,2k
           |     |      |
          GND   GND    GND

Der fehler selbst muss jedoch woanders liegen, denn das einzige Problem 
ist wie du schon geschrieben hast, da ich zwischendurch eine Ladung habe 
die 'aus der Luft kommt'.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn es wirklich so verschaltet ist, wunder ich mich das das überhaupt 
geht.
Ein Widerstand ohne Stromfluss erzeugt keine Spannung.

Oder ist der PullUp Aktiv?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:

> Oder ist der PullUp Aktiv?

Laut Programm nicht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enteroctopus Dofleini schrieb:

> Der fehler selbst muss jedoch woanders liegen, denn das einzige Problem
> ist wie du schon geschrieben hast, da ich zwischendurch eine Ladung habe
> die 'aus der Luft kommt'.

Das Problem ist, dass du da keinen Spannnungsteiler am ADC hast. Was 
auch immer der ADC misst, hat mit den Widerstandswerten an den Tastern 
herzlich wenig zu tun.

Autor: Enteroctopus Dofleini (enteroctopus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Enteroctopus Dofleini schrieb:
>
>> Der fehler selbst muss jedoch woanders liegen, denn das einzige Problem
>> ist wie du schon geschrieben hast, da ich zwischendurch eine Ladung habe
>> die 'aus der Luft kommt'.
>
> Das Problem ist, dass du da keinen Spannnungsteiler am ADC hast. Was
> auch immer der ADC misst, hat mit den Widerstandswerten an den Tastern
> herzlich wenig zu tun.

Das wundert mich seit beginn des zusammenbauens. Mit Spannungsteiler 10k 
an Masse kam immer schon das gleicher raus wie ohne.

Ohh gott, es wird doch Zeit durchzudrehn...


nachtrag:
Jetzt mal ohne Witz, aber wie kann der ADC dann überhaupt auf die 
gleichen Werte kommen?

Autor: 23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass dich von diesen Fabrikarbeitern nicht verarschen. Pullup beim 
ADC... lol.

Du hast recht - Foren sind geschlossene Gemeinden die nur versuchen 
falsch zu belehren um selbst den job nicht aus Unwissenheit zu 
verlieren. Sei froh, das du nicht Lehrling bei dem deppen bist...

Ist leider so, im bereich der Programmierung meinen die Alten doch 
tatsächlich mithalten zu können obwohl sie wissen das sie nicht (mehr) 
mitkommen.

Und blos immer mal wieder noch dem Code fragen um selbst nicht 
ausprobieren zu müssen...

Sieh nochmal in ruhe das Datenblatt vom uc an - das hilft.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.