- Labornetzteil AliExpress         
Ergebnis 1 bis 6 von 6

Thema: Servo ansteuern !? , oder wie man ein smartie schält....

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2006
    Ort
    Gründau
    Alter
    37
    Beiträge
    19

    Servo ansteuern !? , oder wie man ein smartie schält....

    Anzeige

    Powerstation Test
    Man merkt denke ich ,dass ich stark verwirrt bin

    Ich bin recht neu auf dem Gebiet Atmel. Und habe mir einen Atmega16 zugelegt.

    Hab mich jetzt innerhalb von zwei tagen durch alle möglichen lcd libs etc gewühlt und soweit auch alles geschafft wie ich es wollte
    C habe ich gewählt da ich mit dem C++ Syntax vertraut bin also bitte nicht gleich schimpfen weil ich gleich damit anfange.

    Zum 100% Glück fehlen mir jetzt aber noch 4 steuerbare Servos..
    Ich habe schon viel von Hardware PWM beim 16er etc gelesen. Doch nirgends wirklich verstanden wie es funktioniert.

    An welche Pins müssen die Servos. Bestimmte oder normale i/o's ?
    Auch von der Code seite her blicke ich nicht durch ( trotz suchfunktion )

    Hat vielleich zufällig jemand eine servosteuerung auf den mega16 zugeschnitten zur hand. in c ?
    das wäre prima...

    Vielen Dank im Vorraus,
    Somebuddy

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2006
    Ort
    Gründau
    Alter
    37
    Beiträge
    19
    hab sogar was zusammen bekommen.

    so konnte ich zumindest schon rausfinden was die range für mein servo ist..

    nur wie schaffe ich es 4 Servos anzusteuern..
    komme über den einen nicht hinaus

    Code:
    /**********************/
    /**********************/
    /* INCLUDES */
    /**********************/
    /**********************/
     
    #include <stdint.h>
    #include <stdlib.h>
    #include "lcd.h"
    #include <avr/interrupt.h>
    #include <avr/io.h>
    #include <avr/pgmspace.h>
    #include <avr/eeprom.h>
    
     
    #include <util/delay.h>
     
    /**********************/
    /**********************/
    /* TYPES */
    /**********************/
    /**********************/
     
    typedef uint8_t     	BYTE;
    typedef uint16_t     	WORD;
    typedef uint32_t      DWORD;
    typedef uint64_t	 QWORD;
     
    /**********************/
    /**********************/
    /* DEFINES */
    /**********************/
    /**********************/
     
    #define XTAL		4000000L
    #define ODIV    8
    #define O20ms   (80000/ ODIV)
    #define BORDER_LOW    (2250 / ODIV)
    #define BORDER_HIGH   (8500/ ODIV)
    #define RANGE         (BORDER_HIGH - BORDER_LOW)
    #define MIDDLE        (BORDER_LOW + ((BORDER_HIGH-BORDER_LOW)/2))
     
     
    /**********************/
    /**********************/
    /* VARIABLES */
    /**********************/
    /**********************/
     
    volatile BYTE impuls = 0;
    
    volatile WORD servo_value = MIDDLE; // Servo Mittelstellung
    
    /**********************/
    /**********************/
    /* FUNCTIONS */
    /**********************/
    /**********************/
     
    void init()
    {
    
    
    
    
    	/*-------*/
    	/*-------*/
    	/* PORTS */
    	/*-------*/
    	/*-------*/
     
    	DDRD = ( 1 << PIND6);
    	DDRD = ( 1 << PIND5);
     
    	/*-------*/
    	/*-------*/
    	/* TIMER */
    	/*-------*/
    	/*-------*/
     
      	// compare match mode
    	TCCR1B	= (1 << WGM12) | (1 << CS11);
     
    	// TIMER value
    	TCNT1	= 0x0000;
     
    	// COMPARE value
    	OCR1A	= O20ms;
    
    	// ENABLE compare match interrupt
    	TIMSK	= (1 << OCIE1A);
     
    
     
    }
    
    ISR(TIMER1_COMPA_vect)
    {
      // SERVO -> IMPULS
      if(impuls == 0)
      {
        impuls = 1;
        PORTD |= (1 << PIND6);
        OCR1A = servo_value;
      }
      // SERVO -> KEIN IMPULS
      else
      {
        impuls = 0;
        PORTD &= ~(1 << PIND6);
        OCR1A = O20ms - OCR1A;
      }
    
    
    
    
    
    
    }
    int main(void)
    {
    
    char string[50];
    int wert=0;
    
    
    
    
     /* Initialisiere Display, Cursor aus */
        lcd_init(LCD_DISP_ON);
    
        /* loesche das LCD Display und Cursor auf 1 Zeile, 1 Spalte */
        lcd_clrscr();
    
    
     
     
      for(;;)
      {
    
    
    if ( !(PINB & (1<<PINB0)) ) {
    
    
     init();
     sei();
      
    
    
    wert = wert + 1;
    itoa(wert,string,10);
    lcd_clrscr();
    lcd_puts(string); 
    _delay_ms(200);
    
    servo_value = ( BORDER_HIGH + wert );
    }
    
    if ( !(PINB & (1<<PINB1)) ) {
      
    
     init();
     
      sei();
    
    
    wert = wert - 1;
    itoa(wert,string,10);
    lcd_clrscr();
    lcd_puts(string); 
    _delay_ms(200);
    servo_value = ( BORDER_HIGH + wert );
    
    }
    
     
      };
     
    	return 1;
    }

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2006
    Ort
    Gründau
    Alter
    37
    Beiträge
    19
    hm.. keiner einen tipp ?

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.03.2006
    Beiträge
    138
    hm oh je ich wollte mich auch grade mit c einarbeiten aber scheitere schon bei variabelen deklaration.nun was ich dir sagen kann ist das hier ein impuls für de servo generiert wird mit hilfe von timer1 (interrupt) und der wert der servo psition wird auf einem lcd ausgegeben.

    was ich noch empfehlen kann lade dir die Bascom demo runter da gibts extra servo befehle kuck dir einfach mal die hilfe an und versuche es einmal so. aber achtung gib Bascom deine korekte taktferq. an (fuse bit ansehen ob inter oder externer takt genutzt wird ) sonst kommt nur scheisse raus.

    mfg

    m.r.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Hi,
    @AVRboy:
    Ich glaube du verstehst was falsch...Somebuddy versteht seinen Quelltext selber! Und wie soll Somebuddy den Bascom Servo befehl in C einbauen? =) Du weißt anhand der Hilfe Datei nicht was der Servo Befehl intern mit deinem µC macht damit du dies auf C übertragen kannst!

    @Somebuddy:
    hier ist der Quellcode eines Servoslaves mit einem AVR:
    http://www.kreatives-chaos.com/index...kc10_quelltext
    und sonst hilft es die Suche Funktion des Forum zu verwenden. Ich hab viel gefunden wenn man im Unterforum "C-Programmierung..." nach Servo sucht.

    Gruß Michi

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2006
    Ort
    Gründau
    Alter
    37
    Beiträge
    19
    ich habe die suchfunktion auch schon benutzt.. aber nirgends wurde genau ein quelltext produziert wie ich ihn brauche.
    Somit habe ich ein "eigenes" problem

Berechtigungen

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

12V Akku bauen