Dein Wurm liegt wohl hier
Es sollte wohl heißen:Zitat:
itoa (result, buffer, 16);
lcd_puts(buffer);
itoa (result, buffer, 10);
lcd_puts(buffer);
Denn die Ausgabe soll doch im 10er System sein und nicht im 16er.
Druckbare Version
Dein Wurm liegt wohl hier
Es sollte wohl heißen:Zitat:
itoa (result, buffer, 16);
lcd_puts(buffer);
itoa (result, buffer, 10);
lcd_puts(buffer);
Denn die Ausgabe soll doch im 10er System sein und nicht im 16er.
HI
@Hubert.G
Oh ja habe das geändert, seit dem habe ich auch nur zahlen raus.
Ist das den richtig das ich Zahlen bis zu 10000 habe.
Wenn ich den poti bis zu Anschlag gedreht habe, habe ich auch wieder die zahl 1023 und an dem anderen Anschlag so um die 1300.
Ach habe vergessen es mitzuteilen das ich erstmal ein Poti statt Temp-sensor angeklemmt habe.
Du hast die Referenzspannung 2,56V eingestellt, gehst aber bis 5V.
Die Zeile muss so lauten:
Aber warum du die Ausgabe bis 1300 bekommst ist mir nicht klar. Bist du sicher das du dich nicht verschrieben hast. Es dürfte max. 1023 sein.Code://AVCC als Referenzspannung verwenden
ADMUX |= (1<<REFS0);
Hallo!
@Hubert.G
Du hast recht mit der 1300 ich hatte ja nur geschätzt die richtige zahl lautet
1243.
Ich denke mir das diese Zahl daher zustande kommd, da letzte Zahle (3) nicht automatisch gelöscht werden wenn es z.B. unter Tausend kommt.
Bei der (4) ist es genau so.
Jetzt will ich die Funktion schreiben für den Sensor.
Aus dem Datenblatt habe ich mir Daten rausgeschrieben und daraus in Ecxel eine Funktion erstellt (siehe Anhang).
Muss jetzt irgendwie das ganze kombenieren, 1023 Anteile der 5V Spannung mit der Gleichung (oh ja muss irgendwie die Gleichung erstellen).
ups, hier die Funktion!
Bei deinem "nicht automatisch gelöscht werden" kann ich dir nicht ganz folgen.
Result wird hier gelöscht:Die ADC-Register werden nach dem Abfragen automatisch gelöscht.Code:uint16_t readADC(uint8_t channel) {
uint8_t i;
uint16_t result = 0;
Poste doch mal den gesamten Code wie du ihn geschrieben hast.[/quote]
Hi!
@Hubert.G
Ich meinte mit dem löschen z.B. wird auf dem Display
die Zahl 1023 angezeit. Dreht man an dem Poti
bekommt man z.B. die Zahl 745.
Also ist man unter der Tausender
quasi sollte die 1 gelöscht werden
da nur dreistellig. Beispiel:
1023
745 die tausender stelle bleibt leer
Aber auf Display wird angezeigt 1745
hoffentlich ist das jetzt besser erklärt
Ich habe das löschen dann mit dem Befehl
hin bekommenCode:lcd_gotoxy(16,0);
lcd_putc(254);
Weißt du wie man eine Hyperbel berechnet? Ich habe eine Funktion aber mir fehlt die Gleichung.Code:
int main(void)
{
uint16_t readADC(uint8_t channel)
{
uint8_t i;
uint16_t result = 0;
// Den ADC aktivieren und Teilungsfaktor auf 64 stellen
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
// Kanal des Multiplexers waehlen
ADMUX = channel;
// Interne Referenzspannung verwenden (also 2,56 V)
// ADMUX |= (1<<REFS1) | (1<<REFS0);
//AVCC als Referenzspannung verwenden
ADMUX |= (1<<REFS0);
// Den ADC initialisieren und einen sog. Dummyreadout machen
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));
// Jetzt 3x die analoge Spannung and Kanal channel auslesen
// und dann Durchschnittswert ausrechnen.
for(i=0; i<4; i++) {
// Eine Wandlung
ADCSRA |= (1<<ADSC);
// Auf Ergebnis warten...
while(ADCSRA & (1<<ADSC));
result += ADCW;
}
// ADC wieder deaktivieren
ADCSRA &= ~(1<<ADEN);
result /= 4;
return result;
}
if (result < 1000)
{
lcd_gotoxy(16,0);
cd_putc(254);
lcd_gotoxy(13,0);
itoa (result, buffer, 10);
lcd_puts(buffer);
}
if (result < 100)
{
lcd_gotoxy(15,0);
lcd_putc(254);
lcd_gotoxy(13,0);
itoa (result, buffer, 10);
lcd_puts(buffer);
}
if (result > 1000)
{
lcd_gotoxy(13,0);
itoa (result, buffer, 10);
lcd_puts(buffer);
}
Eine andere Lösung ist die Zeichenanzahl abzufragen mit "len" und dann die entsprechenden Leerzeichen einzufügen.
Nein Hyperbel berechnen kann ich nicht.
Hi!
Hört sich interessant an mit dem "len"
Was mach ich da genau?
Es heisst strlen, max. Zeichenzahl hier 5, Leerzeichen im
VWert1 ist hier die auszugebende Variable.Code:char fuellzeichen[5][6]PROGMEM ={"0"," "," "," "," "};/* Texte für die LCD-Ausgabe im Flash*/
if (strlen(VWert1) ==4){
lcd_puts_p(fuellzeichen[1]);
}
else if(strlen(VWert1) ==3){
lcd_puts_p(fuellzeichen[2]);
}
else if(strlen(VWert1) ==2){
lcd_puts_p(fuellzeichen[3]);
}
else if(strlen(VWert1) ==1){
lcd_puts_p(fuellzeichen[4]);
}
Spart zwar keinen Platz im Flash, dafür aber im RAM.