PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler bei Taktausgabe



Cybrix
22.06.2005, 08:40
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.




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);
}

Danke schonmal im vorraus

Cybrix

PicNick
22.06.2005, 09:00
*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 ?

Cybrix
22.06.2005, 09:09
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!

PicNick
22.06.2005, 09:16
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 ?

Cybrix
22.06.2005, 09:29
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/zeigebeitrag.php?t=10138&highlight=

das haben sie mir schonmal geholfen!

PicNick
22.06.2005, 11:29
zahlen von ascii is einfach
Beispiel:


case 1 : wertg = (grad - 48) * 100; break;
case 2 : wertg += (grad - 48) * 10; break;
case 3 : wertg += (grad - 48); break;

das hast du aber an mehreren stellen zu machen

Cybrix
22.06.2005, 11:53
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

PicNick
22.06.2005, 12:23
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

Cybrix
22.06.2005, 12:45
Ich hab hier mit nem Taktzähler gearbeitet! Aber der Atmega hat sich jetzt verabschiedet! Der macht garnichts !

lekro
22.06.2005, 13:41
48: der ascii-code der Zahlen ist 0x30 -> 0x39. wenn du also immer 0x30 == d'48' abziehst, kommt eben 0x00 --> 0x09 raus.In C darf man auch einfach '0' schreiben, also:
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.

PicNick
22.06.2005, 15:05
@Lekro: Gut, das nächste Getränk geht halt auf meine Rechnung.
Ich bin halt nicht so begeistert, von einer Zahl einen Zeichen abzuziehen. Aber du hast recht, der C hat da weniger Skrupel