- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Fehler bei Taktausgabe

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2005
    Ort
    Rendsburg
    Alter
    38
    Beiträge
    306

    Fehler bei Taktausgabe

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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.



    Code:
      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

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    *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.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2005
    Ort
    Rendsburg
    Alter
    38
    Beiträge
    306
    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!

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2005
    Ort
    Rendsburg
    Alter
    38
    Beiträge
    306
    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!

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    zahlen von ascii is einfach
    Beispiel:
    Code:
            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
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2005
    Ort
    Rendsburg
    Alter
    38
    Beiträge
    306
    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

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2005
    Ort
    Rendsburg
    Alter
    38
    Beiträge
    306
    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.

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    05.04.2005
    Beiträge
    66
    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.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress