Gast
#658399
Hallo zusammen,
habe einen Stk500 Board mit einem Atmega16 an einem Servocontroller
SSC-32 über Modem Kabel verbunden um einen Servomotor zu steueren.
danach habe ich ein kleines C Code geschrieben , das den servomotor
steuert und es funktioniert, meine frage ist: wie kann ich diesen
servomotor über die Tastatur steueren sprich wenn ich auf A drücke soll
er 10 grad anfahren..... bis jetzt habe ich den servomotor nur über die
Switcher(Taster) vom STK500 gesteuert.
und hier ist das Code:
#include <avr/io.h>
#include <avr/interrupt.h>
void uart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
{
}
UDR = c; /* sende Zeichen */
}
void servo_cmd (char *s)
{
while (*s)
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
uart_putc(*s);
s++;
}
}
void servo_time(uint8_t ch, uint16_t position, uint16_t time)
{
char string[5];
uart_putc('#');
itoa(ch, string, 10);
servo_cmd(string);
uart_putc('P');
itoa(position, string, 10);
servo_cmd(string);
if(time) {
uart_putc('T');
itoa(time, string, 10);
servo_cmd(string);
}
uart_putc('\r');
}
void servo_speed(uint8_t ch, uint16_t position, uint16_t speed)
{
char string[5];
uart_putc('#');
itoa(ch, string, 10);
servo_cmd(string);
uart_putc('P');
itoa(position, string, 10);
servo_cmd(string);
if(speed) {
uart_putc('S');
itoa(speed, string, 10);
servo_cmd(string);
}
uart_putc('\r');
}
void servo(uint8_t ch, uint16_t position)
{
servo_time(ch, position, 0);
}
void uart_init()
{
// USART initialisieren
#ifndef F_CPU
#define F_CPU 3686400L // Systemtakt in Hz, das L am Ende ist
wichtig, NICHT UL verwenden!
#endif
#define BAUD 9600L // Baudrate, das L am Ende ist wichtig,
NICHT UL verwenden!
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille
#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu
hoch!
#endif
// Senden aktivieren
UCSRB |= (1<<TXEN); // UART TX einschalten
// Setze Frame Format 8 Datenbits + 1 Stopbit
UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1
// Baudrate einstellen
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
}
int main(void) {
uart_init();
DDRA=0x00;
DDRB=0xff;
PORTB=0xff;
// Timer1 initialisieren
TCNT1H=0x00;
TCNT1L=0x00;
// CTC Mode - Prescaler 256
TCCR1A = 0x00;
TCCR1B = 0b00001011;
// 1sec bei 3,6864 MHz
OCR1AH = 0xe0;
OCR1AL = 0xff;
// Timer aktivieren
TIMSK |= 0x10;
// Globale Interrupts aktivieren
sei();
while(1) {
if ( !(PINA & (1 << PA0)) ) {
servo_cmd(" #0p1500#1 p1500#3p1500#4 p1500#6p1500 #7 p1500 #8
p1500 #9p1500 #11 p1500 #12p1500 #14p1500 #15 p1500 t5000\r");
} ;
if ( !(PINA & (1 << PA1)) ) {
servo_cmd("#0P1333\r");
} ;
if ( !(PINA & (1 << PA2)) ) {
servo_cmd("#0P1666\r");
} ;
if ( !(PINA & (1 << PA3)) ) {
servo_cmd("#0P2000\r");
} ;
if ( !(PINA & (1 << PA4)) ) {
servo_time(0, 1520, 5000);
} ;
if ( !(PINA & (1 << PA5)) ) {
servo_speed(0, 1700, 100);
} ;
if ( !(PINA & (1 << PA6)) ) {
servo_time(0, 1700, 5000);
} ;
if ( !(PINA & (1 << PA7)) ) {
servo(0, 1500);
} ;
if ( !(PINA & (1 << PA6)) ) {
servo_time(0, 1700, 5000);
} ;
}
return(0);
}
// Interrupt Routine Timer1 Compare Match
SIGNAL (SIG_OUTPUT_COMPARE1A)
{
// Toggle LED an PortB
PORTB ^= (1 << PB0);
//uart_puts(servo);
}