- 3D-Druck Einstieg und Tipps         
Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 35 von 35

Thema: Servoansteurungsproblem!! Helft mir!!

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

    LiFePo4 Akku selber bauen - Video
    Hi,

    Ok letzter versuch. Servo bewegt sich überhaupt nicht! Vielleicht liegt es ja nicht am Quellcode sondern am löten! Aber ich hab das auch schon 1000 mal gemessen!

    Hier noch mal der veränderte 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); 
       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); 
            } 
       }
    Was macht eigentlich die funktion "set_servo" ? Ich sehe gar nicht wo die auf gerufen wird! Oder übersehe ich was?

    matic

  2. #32
    Hallo
    also ich hab ein mavr board mit nem atmega8 und nem 3,6864 Mhz quarz drauf...
    Ich möcht probieren damit nen Servo anzusteuern so billig dinger vom conrad. hab jetz mal den Code von michaelelb und mein Servo bewegt sich nach auch nach rechts. Bloß ich versteh den Code noch nicht ganz. Ich hab auch nen prscaler von 64 benutzt.

    aber mir sagt des ganze tcnt0 und so zeugs ist und so ist. kann mir das mal einer erklären? wär echt super.
    und was muss ich machen damit ich den servo zum beispiel in seine mittelposition fahr oder bzw nach links??
    wär echt super wenn ihr mir helfen könntet.
    Hier das Programm:
    weiß leider nicht wie man dass in so nem weißen fenster postet...

    #include <avr/io.h>
    #include <avr/signal.h>
    #include <avr/interrupt.h>
    #include <inttypes.h>
    #include <math.h>
    #ifndef F_CPU
    #define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */
    #endif

    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<<PB0);
    PORTB = (1<<PB0);
    //Timer0 Prescaler 64
    //3686400 hz hat der µC
    //0.000000271s zischen den Takten
    //mit Prescaler: 0.00001736 zischen den Takten
    //0.0001s/0.00001736s = 57,6
    //Preloadwert: 198,4 <= 256-57,6
    //Zeit zwischen Interrupt 0.1ms
    //1ms = 10 Takte
    //1.5ms = 15 Takte
    //2ms = 20 Takte
    //20ms = 200Takte
    //da erster Takt = 0
    //nach 9 Takten low
    //nach 199 Takten high!
    TCCR0 = (1<<CS01)|(1<<CS00);
    TCNT0 = 198,4;
    TIMSK |= (1 << TOIE0);
    for(;
    {
    }
    }

    SIGNAL(SIG_OVERFLOW0)
    {
    switch(zaehler)
    {
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
    case 5: //Links
    case 6:
    case 7:
    case 8:
    case 9: //1ms
    case 10:
    case 11: //Mitte
    case 12:
    case 13:
    case 14:
    case 15://1.5ms
    case 16:
    case 17:
    case 18:
    case 19: //2ms //rechts

    PORTB |= (1<<PB0);
    zaehler++;
    break;
    case 199:
    zaehler = 0;
    break;
    default:
    PORTB &= ~(1<<PB0);
    zaehler++;
    break;
    }
    TCNT0 = 198.4;
    }

  3. #33
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    20 Takte = 20ms!


    stimmt nicht..................

  4. #34
    ist mir nicht ganz klar wieso das nicht stimmt,deshalb wärs super wenn mir das einer erklären könnte.
    hab den code nur kopiert und den prescaler geändert und den cpu clock aber ich hab das problem dass mir der rest nichts sagt und in den tutorials find ich auch nichts...
    kann mir jemand helfen.
    will einfach nur meinen servo entweder nach recht bzw nach links drehen...

  5. #35
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Hi Leutz,
    @FartingWeasel:
    //0.0001s/0.00001736s = 57,6
    stimmt nicht!!
    wenn ich das rechne bekomme ich 5,76 raus!!

    TCNT0 = 198,4;
    Ich glaube du kannst das Timercounter Register nicht mit einem nicht ganzen Wert füllen!

    Gruß Michi

Seite 4 von 4 ErsteErste ... 234

Berechtigungen

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

Solar Speicher und Akkus Tests