PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo ansteuern !? , oder wie man ein smartie schält....



Somebuddy
30.08.2006, 12:47
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

Somebuddy
31.08.2006, 04:51
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 :(




/**********************/
/**********************/
/* 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;
}

Somebuddy
03.09.2006, 16:47
hm.. keiner einen tipp ?

AVRboy
08.09.2006, 22:31
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.

michaelb
09.09.2006, 21:48
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.php?seite=rnkc10_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

Somebuddy
10.09.2006, 14:30
ich habe die suchfunktion auch schon benutzt.. aber nirgends wurde genau ein quelltext produziert wie ich ihn brauche.
Somit habe ich ein "eigenes" problem :)