Robosapien V1 mit RP6 steuern!
Hallo zusammen,
möchte gerne mit dem RP6 meinen Robosapien V1 steuern.
Leider funktioniert es nicht unten mein Anweisungen. Den TimerInterupt habe ich in der RP6RobotBaselib auskommentiert. Vielleicht hat einer nen Tip!
Code:
#include "RP6RobotBaseLib.h"
uint16_t z;
uint8_t i;
uint8_t ir_command;
uint16_t Zeit;
void Delay_us(uint16_t Verzoegerung)
{
Zeit=0;
while(Zeit<=Verzoegerung);
}
void ir_code_833(void)
{
for(z=0; z<= 33;z++)
{
PORTD = (1<<PIND7);
Delay_us(13);
PORTD &= ~(1<<PIND7);
Delay_us(12);
}
}
void ir_code_6666(void)
{
for(z=0; z<= 266;z++)
{
PORTD = (1<<PIND7);
Delay_us(13);
PORTD &= ~(1<<PIND7);
Delay_us(12);
}
}
ISR (TIMER2_OVF_vect)
{
Zeit++;
}
int main(void)
{
initRobotBase();
TCCR2 = (1 << WGM21) | (0 << COM20) | (1 << CS20);
OCR2 = 0x08; // 0x66 = 78,4kHz @8MHz
// Initialize Timer Interrupts:
TIMSK = (1 << OCIE0); //| (1 << OCIE2); // Fixed: Timer2 Interrupt is turned
// off by default now! It is only active
// when ACS/IRCOMM are transmitting.
TIMSK |= (1 << OCIE2);
while(true)
{
ir_command=137; //Left Arm Up
ir_code_6666(); //ir-signal 6666us
for( i=1; i<= 8;i++)
{
if ((ir_command & 0x80)==0)
{
Delay_us(833);
ir_code_833();
}
else
{
Delay_us(3333);
ir_code_833();}
ir_command=ir_command << 1;
}
}
return(0);
}
Protokoll Robosapien und noch ein Versuch!
Vielen Dank Radbruch!
Du könntest natürlich Recht haben.
Unten habe ich das Protokoll des Robosapiens aufgeführt.
Trägerfrequenz ist 39,2kHz.
Habe inzwischen noch einen erneuten Versuch unternommen und mein Programm ähnlich aufgebaut wie in der lib des RP6 zum senden von RC5-Signalen.
Timing based on 1/1200 second clock (~.833ms)
Signal is normally high (idle, no IR).
Start: signal goes low for 8/1200 sec.
Data bits: for each of 8 data bits, space encoded signal depending on bit value
Sends the most significant data bit first
If the data bit is 0: signal goes high for 1/1200 sec, and low for 1/1200 sec.
If the data bit is 1: signal goes high for 4/1200 sec, and low for 1/1200 sec.
BTW: The first bit (msb) is always 1 (valid codes are from $80 to $FF)
Carrier is 39,2 kHz
Code:
#include "RP6RobotBaseLib.h"
uint16_t Zaehler=0;
uint8_t i;
uint8_t ir_command=137;
uint8_t Aufgabe=0;
uint8_t Zeichen=0;
ISR (TIMER2_COMP_vect)
{
if(Aufgabe==0){
if(Zeichen==0){
Aufgabe=1;
Zaehler=0;}
if(Zeichen>0 && Zeichen<9){
Zaehler=0;
if ((ir_command & 0x80)==0){
Aufgabe=2;}
else{Aufgabe=3;}
ir_command=ir_command << 1;
Zeichen++;
}
if(Zeichen==9){
PORTD &= ~(1<<PIND7);
Zeichen=0;
ir_command=137;
Aufgabe=0;}
}
if(Aufgabe==1){
if(Zaehler<520){
PORTD ^= (1<<PIND7); //PORTD ^= (1<<PIND7);
Zaehler++;}
else{
Aufgabe=0;
Zeichen=1;}
}
if(Aufgabe==2){
if(Zaehler<65){
PORTD &= ~(1<<PIND7);} //PORTD &= ~(1<<PIND7);
else{
if(Zaehler<130){
PORTD ^= (1<<PIND7);} //PORTD ^= (1<<PIND7);
else{ Aufgabe=0;}
}
Zaehler++;
}
if(Aufgabe==3){
if(Zaehler<260){
PORTD &= ~(1<<PIND7);} //PORTD &= ~(1<<PIND7);
else{
if(Zaehler<325){
PORTD ^= (1<<PIND7);} //PORTD ^= (1<<PIND7);
else{ Aufgabe=0;}
}
Zaehler++;
}
}
int main(void)
{
initRobotBase();
TCCR2 = (1 << WGM21) | (0 << COM20) | (1 << CS20);
OCR2 = 0x66; // 0x66 = 78,4kHz @8MHz
// Initialize Timer Interrupts:
TIMSK = (1 << OCIE0); //| (1 << OCIE2); // Fixed: Timer2 Interrupt is turned
// off by default now! It is only active
// when ACS/IRCOMM are transmitting.
TIMSK |= (1 << OCIE2);
while(true)
{
}
return 0;
}