hallo,
ich verstehe es mal wieder nicht.
an dieser Stelle -
lcd_int4(adc_read()); // <== hier mehrere ADC-Auslesungen angezeigt
- werden mehrere Messungen angezeigt und überschrieben. D.h. die
Funktion 'lcd_int4' wird nur einmal ausgeführt da sonst hintereinander
geschrieben würde - aber der Wert wird mehrfach angezeigt.
Wie kann das sein? Was mache ich falsch?
1
voidmain(void)
2
//
3
{
4
5
clock_prescale_set(clock_div_2);//8mhz
6
7
init_timer_smh();
8
led1_init;
9
10
//usart_init;
11
//USART0_init(9600);
12
//relais_init;
13
i2c_init();
14
lcd_init();
15
adc_init();
16
17
lcd_clear(RED);
18
lcd_int4(adc_read());// <== hier eine ADC-Auslesung
Deine Anfrage ist unklar formuliert. Gebe mal Beispiele der fehlerhaften
Ausgabe und was du srattdessen erreichen willst.
Korrektes Einrücken hilft ungemein, den Quelltext zu verstehen.
Wo sind die Quelltexte von lcd_int4() und adc_read()? Ich will sie
sehen, nicht nur anhand des Namens erraten, was sie tun sollten.
Nemopuk schrieb:> Wo sind die Quelltexte von lcd_int4() und adc_read()? Ich will sie> sehen, nicht nur anhand des Namens erraten, was sie tun sollten.
pardon gehören natürlich dazu:
1
voidadc_init()
2
{
3
// Set the ADC reference to AVcc
4
ADMUX=(1<<REFS0);
5
6
// Enable ADC and set prescaler to 128 (16 MHz / 128 = 125 kHz)
Es ist zwar nicht dein Hauptproblem, ich wollte es aber trotzdem zeigen:
Deine Funktion lcd_int4() gibt positive Zahlen mit bis zu 4 Stellen aus.
Negative Zahlen mit mehr als 3 Stellen führen zu einer fehlerhaften
Ausgabe:
Der Test
if(sec==3&&min%6==0){//alle sechs Minuten auslesen
54
55
if(min==0)//jede Stunde -------
56
{
57
// nichts?
58
}
59
60
//wr_read_reg();
61
//sub_regelung();
62
}
63
64
if(sec%5==1){
65
66
u8i=0;
67
lcd_goto(10+i++,1);
68
69
lcd_int4(i);// <== hier 1mal angezeigt
70
lcd_int4(adc_read());// <== hier mehrere ADC-Auslesungen angezeigt
71
}
72
73
}//while
74
75
}//main
Und auf den problematischen Teil reduziert:
1
voidmain(void){
2
3
while(1){
4
5
if(timer_smh>99){
6
sec=sec++;
7
timer_smh=0;
8
}
9
10
if(sec%5==1){
11
12
u8i=0;
13
lcd_goto(10+i++,1);
14
15
lcd_int4(i);// <== hier 1mal angezeigt
16
lcd_int4(adc_read());// <== hier mehrere ADC-Auslesungen angezeigt
17
}
18
19
}//while
20
21
}//main
Hier fallen mir folgende Dinge auf:
Ist timer_smh als "volatile" und 8 Bit Integer deklariert? Wenn nicht,
können Lesezugriffe im Hauptprogramm durch Schreibzugriffe in der
Timer-ISR gestört werden und zu unerwartetem Verhalten führen.
Allerdings nicht zu dem konkreten Verhalten, dass wir hier sehen. Dafür
muss es noch einen anderen Grund geben.
> lcd_goto(10 + i++
ergibt immer 10, weil i immer 0 ist.
> lcd_int4(i);
gibt immer 1 aus, weil i immer 1 ist.
> lcd_int4(adc_read());
Gibt mit Sicherheit nur eine ADC Messung aus. Denn etwas anderes kann
diese Funtkion nicht tun.
Offenbar kommt die Ausgabe " 1 813" von diesen beiden Aufrufen.
Die unerwarte Ausgabe in der dritten Display-Zeile stimmt nicht mit dem
Quellcode überein. Denn er enthält kein "lcd_goto(3,1)". Sie kann auch
nicht von "lcd_int4()" kommen, weil diese Funktion immer 4 Ziffern
rehtsbündig ausgibt.
Vermutlich ist der Fehler ganz woanders, in einem Stück Code, den du
nicht gezeigt hast. Ich würde mal alle andere Display-Ausgaben
auskommentieren um auszuschließen, dass sie stören.
Nemopuk schrieb:> Die unerwarte Ausgabe in der dritten Display-Zeile stimmt nicht mit dem> Quellcode überein.
stimmt - "lcd_goto(3,1)" hab ich nachträglich eingefügt weil es in der
ersten Zeile sonst blöd aussieht.
lcd_goto(10 + i++
ergibt immer 10, weil i immer 0 ist.
stimmt auch, habe die Deklaration nach oben gezogen. Ergebnis bleibt.
Stelle wird nur einmal aufgerufen.
Nemopuk schrieb:> Negative Zahlen mit mehr als 3 Stellen führen zu einer fehlerhaften> Ausgabe:
Das ist bewusst in kauf genommen. Die Funktion dient zur Positionierung
auf dem Display. Wenn größere negative Werte zu erwarten sind muss man
das anders machen.
Nemopuk schrieb:> Allerdings nicht zu dem konkreten Verhalten, dass wir hier sehen. Dafür> muss es noch einen anderen Grund geben.
Jedenfalls Dank für dein Bemühen. Es hilft schon weiter zu wissen, dass
mein Unverständnis nicht ganz unberechtigt ist.
Karl K. schrieb:> stimmt - "lcd_goto(3,1)" hab ich nachträglich eingefügt> stimmt auch, habe die Deklaration nach oben gezogen
Wenn du hilfreiche Hilfe bekommen willst, solltest du deine Probleme
ordentlich beschreiben. Wenn man sich Mühe gibt, erkennt man die Ursache
beim verfassen der Problembeschreibung sogar oft selbst.
> Ergebnis bleibt. Stelle wird nur einmal aufgerufen.
Damit kann ich nichts anfangen. Ist das jetzt eine gute oder eine
schlechte Nachricht?
Nochmal von vorne: Zeige den kompletten Quelltext (ordentlich
formatiert!), die dazugehörige Ausgabe, und was du stattdessen
erwartest.
Nemopuk schrieb:> Nochmal von vorne: Zeige den kompletten Quelltext (ordentlich> formatiert!), die dazugehörige Ausgabe, und was du stattdessen> erwartest.
ich werde den code noch mal komplett neu aufsetzen und dann hier
einstellen.
Das Merkwürdige ist, dass die Messwerte überschrieben werden obwohl die
Cursorposition bei lcd_write eigentlich mit jedem Wert fortgeschrieben
wird:
Karl K. schrieb:> ich werde den code noch mal komplett neu aufsetzen und dann hier> einstellen.
Aber dann bitte als Dateianhang, nicht im Posting selbst.
Wastl schrieb:> Stefan Frings darf sich auch an die Regeln zum Posten von> Sourcecode halten.
ach Regeln?
er editiert ja nicht mal Beiträge innerhalb von 2 Minuten nur um seinen
Beitragszähler hochzuschrauben.
Joachim B. schrieb:> er editiert ja nicht mal Beiträge innerhalb von 2 Minuten nur um seinen> Beitragszähler hochzuschrauben.
a) Geht das?
b) Ist der Beitragszähler irgendwie wichtig?
Harald K. schrieb:> a) Geht das?
solange keiner geantwortet hat kann jeder editieren, es müssen keine 2
Beiträge innerhalb 2 Minuten im Thread sein.
Harald K. schrieb:> b) Ist der Beitragszähler irgendwie wichtig?
frage Stefan, niemand nutzt so viele Nickname wie er und immer mit
derselben langsam unglaubwürdigen Begründung und oft nur Gesabbel am
Thema vorbei und ohne Sachkenntnis.
Joachim B. schrieb:> und immer mit> derselben langsam unglaubwürdigen Begründung und oft nur Gesabbel am> Thema vorbei und ohne Sachkenntnis.
Projektion!
Arduino F. schrieb:> Projektion!
keine Ahnung was du meinst, habe seit ich hier angemeldet bin nur ein
Name und in gleicher Zeit nur 1/6 Beiträge und verkneife mir im
Gegensatz zu Stefan auch mal Kommentare.
Joachim B. schrieb:> und verkneife mir im> Gegensatz zu Stefan auch mal Kommentare.
Lügner!
In diesem Thread hast Du bislang drei Beiträge, die nichts zur Sache
beitragen. Du plapperst den Schulmeister nach und führst einen
persönlichen Krieg, was der Sache einfach nur schadet.
Stefan hat hier versucht, etwas zur Sache beizutragen - das storpedierst
Du mit vermeidbarer Leermeisterei.