*studier*
Was ich noch nicht kapiert hab':
wenn man Grad eingibt (wertg) , ist das irgendwas dreistelliges.
In motor_auto steht aber g=(wertg-5329), dann ist das ja irgendwas negatives. Wie ist das gedacht ?
Moin
Ich hab ein programm geschrieben wo man eine Grad zahl eingibt das auf ein Display angezeigt wird und dannach ein Schrittmotor fahren soll!
Jetzt gibt mir mein Programm aber immer eine unterschielichen Takt raus und ich weiß nicht wo der fehler steckt, ist mein ertses größeres Programm! Es wird ein ATmega16 und ein 4x16 Zeilen display verwendet.
Danke schonmal im vorrausCode:void men_auto (void){ // Menü für denn Autobetrieb int n=0; char grad; char min; char sec; wertg=0; wertm=0; werts=0; lcd_clrscr(); lcd_puts(" Autobetrieb "); lcd_gotoxy(0,2); lcd_puts("Grad: Min: Sec:"); lcd_gotoxy(1,3); _delay_ms(50); while (n<3) // Eingabe der Grad zahl { grad=kp_taste(); _delay_ms(50); if ((grad >='0') && (grad <='9')) { n++; switch (n) { case 1 : wertg = grad * 100; break; case 2 : wertg += grad * 10; break; case 3 : wertg += grad; break; } lcd_putc(grad); } else { switch (grad) { case 'c': n=0; lcd_gotoxy(1,3); lcd_puts(" ");lcd_gotoxy(1,3); break; case 'z': men_haupt(); default: men_fehler(); men_auto(); break; } } } lcd_gotoxy(7,3); while (n<5) //Eingabe der min zahl { min=kp_taste(); _delay_ms(50); if ((min >='0') && (min <='9')) { n++; switch (n) { case 4 : wertm = min * 10; break; case 5 : wertm += min ; break; } lcd_putc(min); } else { switch (min) { case 'c': n=3; lcd_gotoxy(7,3); lcd_puts(" ");lcd_gotoxy(7,3); break; case 'z': men_haupt(); default: men_fehler(); men_auto(); break; } } } lcd_gotoxy(12,3); while (n<7) //Eingabe der sec zahl { sec=kp_taste(); _delay_ms(50); if ((sec >='0') && (sec <='9')) { n++; switch (n) { case 4 : werts = sec * 10; break; case 5 : werts += sec ; break; } lcd_putc(sec); } else { switch (sec) { case 'c': n=5; lcd_gotoxy(12,3); lcd_puts(" ");lcd_gotoxy(12,3); break; case 'z': men_haupt(); default: men_fehler(); men_auto(); break; } } } _delay_ms(256); _delay_ms(256); _delay_ms(256); motor_auto(); men_wieder(); } void motor_init (void){ DDRC = 0xff; //PortC als Ausgang PORTC = 0x00; //PortC auf low } void motor_auto (void){ //Immoment nur zum test verwendet int g=0; int m=0; int s=0; int n=0; lcd_clrscr(); lcd_puts(" Autobetrieb "); lcd_gotoxy(0,2); lcd_puts(" Motor faehrt "); g=wertg; m=wertm/1.8; s=werts/1.8; while (n<=g){ motor_takt(); n++; } } void motor_takt (void){ PORTC=0x01; _delay_ms(1); PORTC=0x00; _delay_ms(1); }
Cybrix
*studier*
Was ich noch nicht kapiert hab':
wenn man Grad eingibt (wertg) , ist das irgendwas dreistelliges.
In motor_auto steht aber g=(wertg-5329), dann ist das ja irgendwas negatives. Wie ist das gedacht ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Am Freitag hat alles noch gefunz bis auf das er mir ne zu große zahl ausgegeben hat nämlich immer 5329 takte zuviel! deswegen -5329 dann hat das geklappt! Blos als ich das heute nur eeingeschaltet habe hat er mir den falsche takt rausgegeben!
wertg ist eine dreistellige zahl
switch (n)
{
case 1 : wertg = grad * 100; break; //Eingabe der 100 Stelle
case 2 : wertg += grad * 10; break; //Eingabe der 10 Stelle
case 3 : wertg += grad; break; //Eingabe der 1 Stelle
}
Das war so gedacht das man erst die 100 stellen eingibt und danach 10 und danach die einer!
I see.
Da mußt du aber erstmal klären, was es mit den überschüssigen Takten auf sich hat, d.h. aus deiner Grad-Input-routine muß ja 0-999 rauskommen und sonst nix.
Wie ist denn wertg definiert ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
als int ich denke aber das problem ist das ich die eingabe der tasten als char zurückgebe und dann multipliziere aber ich weiß nicht wie ich char in int umwandel
https://www.roboternetz.de/phpBB2/ze...138&highlight=
das haben sie mir schonmal geholfen!
zahlen von ascii is einfach
Beispiel:
das hast du aber an mehreren stellen zu machenCode:case 1 : wertg = (grad - 48) * 100; break; case 2 : wertg += (grad - 48) * 10; break; case 3 : wertg += (grad - 48); break;
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
damit haut das immer noch nicht hin! wenn ich jetzt 100 eingeben solltetn auch 100 takte rauskommen aber es sind 2200 +-100 Takte
Wieso eigentlich -48?
Danke dir trotzdem schonmal für die hilfe
48: der ascii-code der Zahlen ist 0x30 -> 0x39. wenn du also immer 0x30 == d'48' abziehst, kommt eben 0x00 --> 0x09 raus.
Da ich keine Ausgabe von wertg sehe: Woher weißt du das mit 2200 ?
Noch was: im default: ruft sich die routine "men_auto()" u.U selber auf. wenn er da dann zurück kommt, machter ja im ersten "men_auto()" wieder weiter
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Ich hab hier mit nem Taktzähler gearbeitet! Aber der Atmega hat sich jetzt verabschiedet! Der macht garnichts !
Wenn etwas klemmt, wende Gewalt an.
Wenn es kaputt geht,
hätte es sowieso erneuert werden müssen.
In C darf man auch einfach '0' schreiben, also:48: der ascii-code der Zahlen ist 0x30 -> 0x39. wenn du also immer 0x30 == d'48' abziehst, kommt eben 0x00 --> 0x09 raus.
case 1: wertg = (grad - '0') * 100; break;
Und so weiter; der kompilierte Code ist exakt der gleiche, aber es ist leichter zu verstehen, welche Zahl da subtrahiert wird.
Lesezeichen