www.mikrocontroller.net

Forum: PC-Programmierung Servo über Tastatur ansteueren


Autor: Freak (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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%2...
(den Software-UART Teil kannst du weglassen)

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

Autor: Freak (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:-((((

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.