Habe das Problem selber entdeckt. Die Initialisierung war nicht ganz richtig.
Es muss UCSRB = (1 << RXEN) | (1 << TXEN);
heißen, weil ich ja keine Interrupts benutzen möchte.
Druckbare Version
Habe das Problem selber entdeckt. Die Initialisierung war nicht ganz richtig.
Es muss UCSRB = (1 << RXEN) | (1 << TXEN);
heißen, weil ich ja keine Interrupts benutzen möchte.
Nach ein bisschen Arbeit ist das Programm fertig und funktioniert.
Wer will kann das Programm testen. Die Links oben habe ich erneuert.
Hier nur noch mal die HEX-Datei, mit der der RP6 gefüttert wird:
Joystick.hex
und die C-Datei, wenn sich jemand für den Code interessiert:
Joystick->C-Datei
Ich würde mich über Rückmeldungen freuen.
Hallo
Sehr gut. Der Inhalt deiner Lib würde mich noch interessieren.
Warum programmierst du den RP6 nicht in Bascom? Sind Kommentare in deinen Programmen für dich kostenpflichtig?
Gruß
mic
Die Lib ist nicht besonders groß, aber die UART und die Motorsteuerung sind drin. Hier die H-Datei
Und noch die C-Datei:Code:#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#ifndef F_CPU
#define F_CPU 8000000
#endif
#define BAUD_LOW 38400 //Low speed - 38.4 kBaud
#define UBRR_BAUD_LOW ((F_CPU/(16*BAUD_LOW))-1)
#define FWD 0
#define BWD 1
void startADC(uint8_t channel);
void setMotorDir(uint8_t left_dir, uint8_t right_dir); //Richtungsangabe
void setMotorPWM(uint8_t power_left, uint8_t power_right); //Gibt an wie schnell der RP6 links und rechts fahren a´soll
void delay(uint8_t d); //Verzögerung
void delta_init(void); //Initialisierung der Hauptfunktionen
void usart_init(void); //Initialisierung der USART
uint8_t usart_byte_avail(void); //Prüft ob ein Byte im Puffer liegt
uint8_t readByte(void); //liest dieses Byte
uint8_t readInteger(void); //liest einen Integerwert
void writeChar(char ch); //liest ein Zeichen
void writeString(char *string); //schreibt eine Zeichenfolge
void writeInteger(int16_t number, uint8_t base); //schreibt einen Integerwert
void usart_test(void); //UART-Test: bestätigt jede Eingabe mit zurücksenden der Zeichen
Code:#include <avr/io.h> // I/O Port definitions
#include <avr/interrupt.h> // Interrupt macros
#include <stdlib.h> // C standard functions (e.g. itoa...)
#ifndef F_CPU
#define F_CPU 8000000
#endif
#define BAUD_LOW 38400 //Low speed - 38.4 kBaud
#define UBRR_BAUD_LOW ((F_CPU/(16*BAUD_LOW))-1)
#define FWD 0
#define BWD 1
// Motor Power
void setMotorPWM(uint8_t power_left, uint8_t power_right)
{
if (power_left>210) power_left=210;
if (power_right>210) power_right=210;
OCR1BL = power_left;
OCR1AL = power_right;
if (power_left || power_right)
TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
else
TCCR1A = 0;
}
// Motor Richtung
void setMotorDir(uint8_t left_dir, uint8_t right_dir)
{
if (left_dir)
{ PORTC |= (1 << PINC2);}
else
{PORTC &= ~(1 << PINC2);}
if (right_dir)
{PORTC |= (1 << PINC3);}
else
{PORTC &= ~(1 << PINC3);}
}
void startADC(uint8_t channel)
{
ADMUX = (1<<REFS0) | (0<<REFS1) | (channel<<MUX0);
ADCSRA = (0<<ADIE) | (1<<ADSC) | (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF);
}
uint16_t readADC(uint8_t channel)
{
if((ADCSRA & (1<<ADSC))) return 0; // check if ADC is buisy...
ADMUX = (1<<REFS0) | (0<<REFS1) | (channel<<MUX0);
ADCSRA = (0<<ADIE) | (1<<ADSC) | (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF);
while ((ADCSRA & (1<<ADSC)));
ADCSRA |= (1<<ADIF);
return ADC;
}
void writeChar(char ch)
{
while (!(UCSRA & (1<<UDRE)));
UDR = (uint8_t)ch;
}
void writeString(char *string)
{
while(*string)
writeChar(*string++);
}
void writeInteger(int16_t number, uint8_t base)
{
char buffer[17];
itoa(number, &buffer[0], base);
writeString(&buffer[0]);
}
void delay(uint8_t d)
{
uint16_t d1, dummy;
for (d1=d*255; d1>0; d1--) dummy^=d1;
}
void delta_init(void)
{
cli();
// Initialize Timer1 - PWM:
// PWM, phase correct with ICR1 as top value.
TCCR1A = (0 << WGM10) | (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
TCCR1B = (1 << WGM13) | (0 << WGM12) | (1 << CS10);
ICR1 = 210;
OCR1AL = 0;
OCR1BL = 0;
sei();
}
void usart_init(void){
// UART:
UBRRH = UBRR_BAUD_LOW >> 8; // Setup UART: Baudrate is Low Speed
UBRRL = (uint8_t) UBRR_BAUD_LOW;
UCSRA = 0x00;
UCSRC = UCSRC|=0x86;
UCSRB = (1 << TXEN) | (1 << RXEN);
}
uint8_t usart_byte_avail(void){
if(UCSRA&(1<<RXC))
return 1;
else return 0;
}
uint8_t readByte()
{
while(!(UCSRA&(1<<RXC)));
return UDR;
}
void usart_test(void)
{
char test;
while(1)
{
test = readByte();
writeString("Byte:");
writeChar(test);
writeString("\n");
delay(200);
}
}
uint8_t readInteger()
{
// Liefer das empfangene Zeichen, falls etwas empfangen wurde; -1 sonst
return (UCSRA & (1 << RXC)) ? (int) UDR : -1;
}
Ich steuere ihn über Purebasic mit dem Joy, klappt wunderbar.
Gruss