-         

Ergebnis 1 bis 4 von 4

Thema: Servo geht nur kurz

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    24.11.2005
    Ort
    Hannover
    Beiträge
    45

    Servo geht nur kurz

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo Leute,

    ich habs jetzt geschaft ein gutes Board zubasteln (noch nicht ganz fertig!) Aber immerhin ist auch ein Servo schon dran, bloß jetzt hab ich Probleme beim programmieren:
    Mein Servo bewegt sich nur ein kleines Stück und dann gar nicht mehr! ich möchte aber das er von Anfang bis Ende fährt! Bestimmt hab ich nur was Kleines vergessen, aber ich finde es einfach nicht!

    also hier ist mal der Code:

    Code:
    #include <avr/io.h> 
    #include <avr/signal.h> 
    #include <avr/interrupt.h> 
    #include <inttypes.h> 
    #include <math.h> 
    
    volatile unsigned char servowert; 
    volatile unsigned char puls; 
    volatile unsigned char zaehler; 
    
    int set_servo(volatile uint8_t pos) 
       { 
       servowert = (pos/180) + 1; 
       } 
        
    int main(void) 
       { 
       zaehler = 0; 
       sei(); 
       DDRD |= (1<<PD7); 
       PORTD |= (1<<PD7); 
       //Timer0 übernimmt die Highphase 
       //muss 1ms sein also 25 Takte bei einem Prescaler von 64 
       puls = 25; 
       TCCR2 = (1<<CS22) | (1<<WGM21) |(1<<COM21) |(1<<COM20); 
       TCNT2 = (255-puls); 
       TIMSK = (1<<TOIE2);  
       for(;;) 
       { 
       } 
       } 
        
    SIGNAL(SIG_OVERFLOW2) 
       { 
       if(zaehler == 0) 
           { 
          PORTD &= ~(0<<PD7); 
          TCNT2 = (255-puls); 
          zaehler++;
    	  //PORTB = (0<<PB0);  
          } 
       else if ( (zaehler > 0 ) && (zaehler < 20 ) ) 
    
          { 
          TCNT2 = (255-puls); 
          zaehler++; 
          } 
        else 
            { 
          TCNT2 = (255-puls); 
            zaehler = 0; 
          PORTD |= (1<<PD7); 
            } 
       }
    Danke für eure hilfe!

    matic

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    die for-schleife wird wegoptimiert wenn sie leer ist.
    setzt mal eine delay rein oder ein nop.

    castle

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    24.11.2005
    Ort
    Hannover
    Beiträge
    45
    Hi,

    Danke für deine Antwort! Aber auch wenn ich was in die For-Schleife schreibe passiert nix anderes! Hab den Code mal bisschen umgeschrieben! Vielleicht hast du ja noch ein paar Ideen!

    Code:
    #include <avr/io.h> 
    #include <avr/signal.h> 
    #include <avr/interrupt.h> 
    #include <inttypes.h> 
    #include <math.h> 
    #include <avr/delay.h>
    
    volatile unsigned char servowert; 
    volatile unsigned char puls; 
    volatile unsigned char zaehler; 
    
    int set_servo(volatile uint8_t pos) 
       { 
       servowert = (pos/180) + 1; 
    
       } 
    
    
        
    int main(void) 
       { 
       zaehler = 0; 
       sei(); 
    	DDRB = (1<<PB1) | (0<<PB0); 
       DDRD |= (1<<PD7); 
       PORTD |= (1<<PD7); 
       //Timer0 übernimmt die Highphase 
       //muss 1ms sein also 25 Takte bei einem Prescaler von 64 
       puls = 25; 
       TCCR2 = (1<<CS22) | (1<<WGM21) |(1<<COM21) |(1<<COM20); 
       TCNT2 = 6; 
       TIMSK = (1<<TOIE2);  
     while(1) { 
    PORTB = 0xFD;
    _delay_ms(100000);
    PORTB = 0xFE;
    _delay_ms(100000);
       } 
       } 
        
    SIGNAL(SIG_OVERFLOW2) 
       { 
    
       switch(zaehler) {
            case 0:          
        //     case 1:         das da aktivieren für 2 mS Servo 
          PORTD |= (1<<PD7);
          zaehler++;
    	  break;  
    	     case 2: 
          //PORTD &= ~(0<<PD7);
    	  PORTD &= ~(1<<PD7);       
          zaehler++;
          break; 
             case 20:        
          zaehler = 0;
    	  PORTD |= (1<<PD7);
    	  break;
    	     case 21:        
          zaehler = 0;
    	  PORTD &= ~(1<<PD7);            
          break; 
              
    TCNT2 = 6;
    
       }
       
       }
    gruß matic

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    24.11.2005
    Ort
    Hannover
    Beiträge
    45
    Hi,

    Es geht! Hatte den falsche Timer-Modus! Aber jetzt geht es immer volle Kanne nach links und will nicht mehr aufhören... Naja ich Suche weider!

    matic

Berechtigungen

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