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);
}
>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.
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
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:-((((
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.