Forum: PC-Programmierung Servo über Tastatur ansteueren


von Freak (Gast)


Lesenswert?

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);
}

von Wolfram (Gast)


Lesenswert?

>meine frage ist: wie kann ich diesen
>servomotor über die Tastatur steueren sprich wenn ich auf A drücke soll
>er 10 grad anfahren

1. Möglichkeit
du nimmst einen Mikrocontroller mit 2 UARTS (z.B. ATMEGA162) und 
kommunizierts mit der 2. UART mit dem PC. auf dem PC schreibst du ein 
Programm,welches die Taste A pollt und einen entsprechenden Befehl an 
den Mikrocontroller gibt.

2. Möglichkeit
Du läßt den Mikrocontroller weg und schreibst auf dem PC ein Programm, 
welches die Taste A pollt und entsprechend direkt befehle an den 
servomotor gibt.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

3. Möglichkeit
Du könntest direkt eine PC-Tastatur (PS2) an den AVR hängen
http://www.avrfreaks.net/index.php?module=Freaks%20Files&func=viewFile&id=2517&showinfo=1
(den Software-UART Teil kannst du weglassen)

4. Möglichkeit
PC - STK500 mit Hardware-UART
STK500 - Servocontroller mit Software-UART
oder umgekehrt

von Freak (Gast)


Lesenswert?

Wolfram,Stefan B :
der mikrocontroller denn ich habe bzw board stk500 hat auch 2 UART,einen 
mit dem Pc verbunden und den zweiten mit dem servocontroller.es 
funktioniert auch nur ich kann die Servos nicht über die Tastatur 
steueren.
bin aber neuling im berich AVR deswegen habe ich nich so viel ahnung wie 
ich den  C Code für Tastatur schreibe:-((((

von Simon K. (simon) Benutzerseite


Lesenswert?

Das stk500 hat zwar zwei UARTs drauf, allerdings geht nur eine zum 
wirklichen Mikrocontroller. Die andere UART ist nur zum programmieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.