Hallo

Die Motortreibermodifikation ist beim C-Control Pro128 nicht ganz so einfach, weil die Leitungen hier direkt auf die Kontrollerpins gehen. Neben der Änderung auf der Motorplatine müssen deshalb auch die Enable/PWM-Leitungen getauscht werden. Zusätzlich muss natürlich in der Library des ProBot die Ansteuerung geändert werden.

Zum Tauschen der Leitungen würde sich das Verbindungskabel von CON1 nach CON3 anbieten. Hier könnte man auf einer Seite das Flachkabel in drei Pärchen auftrennen: Vcc+GND, OC1A und Enable(orginal), OC1B und Enable (neu). Vcc und GND bleiben, die anderen beiden Pärchen werden in der Steckerquetschung getauscht. Dann gehen die PWM-Pins des Kontrollers auf die Enable-Leitungen von IC1 und die Richtungsauswahlen gehen auf IC2.

Die Anpassung der Lib und eventuelle Auswirkungen auf die Programme habe ich noch nicht untersucht. Das sollte aber auch eher ein C-Control Pro128-Benutzer tun ;)

Kleine Fortschritte gibt es auch bei meinem Projekt, ich experimentiere mit dem ACS:
Bild hier   Bild hier   Bild hier  
http://www.youtube.com/watch?v=0EVu3qImZ0k
http://www.youtube.com/watch?v=ri9kHphFiPI
http://www.youtube.com/watch?v=5exIBE11L04


Die IR-LEDs sind noch nicht mit Schrumpfschlauch abgedeckt.

Aktuelle Software:
Code:
// ACS-Test                                                           12.9.09 mic

#include "asuro-probot.h"
#include "asuro-probot.c"

unsigned int data[2];

int main(void)
{
	Init();
	FrontLED(ON);
	while(1)
	{

		ACSData(data);
		MotorSpeed(255,245); // linker Motor schwächelt ;)
		if(data[0] > 244) MotorSpeed(255,0);
		if(data[1] > 244) MotorSpeed(0,245);
		if((data[0]>248) && (data[1]>248)) MotorSpeed(0,0);
		Msleep(300);
	}
	return(0);
}
Die Lib dazu:
Code:
// asuro-ProBot-Lib asuro-probot.c                                   12.9.09 mic

volatile unsigned char count36kHz=0;
volatile unsigned char acs=0;
volatile unsigned long timebase=0;

/* uses timer2 (36kHz for IR communication */
SIGNAL (SIG_OVERFLOW2)
{
	TCNT2 += 0x25;
	count36kHz ++;
	if (!count36kHz) timebase ++;
	if(acs) acs--;
}

void Sleep(unsigned char time36kHz)
{   unsigned char ziel=(time36kHz+count36kHz) & 0x00FF;
	while (count36kHz != ziel);
}

void Msleep(int dauer)
{
	while(dauer--) Sleep(36);
}

void SerWrite(unsigned char *data,unsigned char length)
{
	unsigned char i = 0;
	UCSRB = 0x08; // enable transmitter
	while (length > 0) {
		if (UCSRA & 0x20) { // wait for empty transmit buffer
			UDR = data[i++];
			length --;
		}
	}
	while (!(UCSRA & 0x40));
	for (i = 0; i < 0xFE; i++)
		for(length = 0; length < 0xFE; length++);
}

void PrintInt(int wert)
{  char text[6]="      ";
	itoa(wert,text,10);
	SerWrite(text,5);
}
void PrintBin(char wert)
{  char text[8]="        ";
	itoa(wert,text,2);
	SerWrite(text,8);
}

/* Set motor speed */
inline void MotorSpeed(unsigned char left_speed, unsigned char right_speed)
{
	OCR1A = left_speed;
	OCR1B = right_speed;
}

/* Set motor direction */
inline void MotorDir(unsigned char left_dir, unsigned char right_dir)
{
	if(left_dir)  PORTB &= ~(1 << PB5); else PORTB |= (1 << PB5);
	if(right_dir) PORTB &= ~(1 << PB4); else PORTB |= (1 << PB4);
}
void LineData(unsigned int *data)
{
	ADMUX = (1 << REFS0) | IR_LEFT;	// AVCC reference with external capacitor
	Sleep(10);
	ADCSRA |= (1 << ADSC);			// Start conversion
	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
	ADCSRA |= (1 << ADIF);			// clear ADCIF
	data[0] = ADCL + (ADCH << 8);

	ADMUX = (1 << REFS0) | IR_RIGHT;	// AVCC reference with external capacitor
	Sleep(10);
	ADCSRA |= (1 << ADSC);			// Start conversion
	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
	ADCSRA |= (1 << ADIF);			// clear ADCIF
	data[1] = ADCL + (ADCH << 8);
}
void OdometrieData(unsigned int *data)
{
	DDRC &= ~((1 << PC0) | (1 << PC1)); // Input => no break LED
	ODOMETRIE_LED_ON;
	Sleep(5);

	ADMUX = (1 << REFS0) | WHEEL_LEFT; // AVCC reference with external capacitor
	ADCSRA |= (1 << ADSC);			// Start conversion
	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
	ADCSRA |= (1 << ADIF);			// clear ADCIF
	data[0] = ADCL + (ADCH << 8);

	ADMUX = (1 << REFS0) | WHEEL_RIGHT; // AVCC reference with external capacitor
	ADCSRA |= (1 << ADSC);			// Start conversion
	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
	ADCSRA |= (1 << ADIF);			// clear ADCIF
	data[1] = ADCL + (ADCH << 8);
}
void ACSData(unsigned int *data)
{
	UCSRB &= ~(1<<TXEN); // USART TX disable

	OCR2=0xff;
	DDRD |= (1<<PD1);
	PORTD &= ~(1<<PD1); // ACS LED left on
	while(PIND & 1)
	{
  		acs=15;
		while(acs);
		OCR2--;
	}
	PORTD |= (1<<PD1); // ACS LED left  off
	data[0]=OCR2;
	while(!(PIND &1));

	OCR2=0xff;
	PORTB &= ~(1<<PB0); // ACS LED right on
	while(PIND & 1)
	{
  		acs=15;
		while(acs);
		OCR2--;
	}
	PORTB |= (1<<PB0); // ACS LED right  off                            6
	data[1]=OCR2;
	while(!(PIND &1));

	OCR2=0x91; //36kHz
}
inline void StatusLED(unsigned char color)
{
	if (color == OFF)    {GREEN_LED_OFF; RED_LED_OFF;}
	if (color == GREEN)  {GREEN_LED_ON; RED_LED_OFF;}
	if (color == YELLOW) {GREEN_LED_ON; RED_LED_ON;}
	if (color == RED)    {GREEN_LED_OFF; RED_LED_ON;}
}
void SetLEDs(unsigned char status)
{
	status = ~(status<<2);		// LEDs sind PD2-7 gegen Vcc schaltend!
	PORTD &= status;           // nur gesetzte LEDs einschalten
	PORTD |= status & ~3;		// PD0 und PD1 nicht verändern!
}
inline void FrontLED(unsigned char status)
{
	if(status==ON) FRONT_LED_on; else FRONT_LED_off;
}
unsigned char PollSwitch (void)
{
	ODOMETRIE_LED_OFF;
	Sleep(10);
	return(~PINC & 3);
}
void Init (void)
{
	//-------- seriell interface programmed in boot routine and already running -------
	//  prepare 36kHz for IR - Communication
	TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
	OCR2  = 0x91; // duty cycle for 36kHz
	TIMSK |= (1 << TOIE2); // 36kHz counter for sleep and ACS

	// prepare RS232
	UCSRA = 0x00;
	UCSRB = 0x00;
	UCSRC = 0x86; // No Parity | 1 Stop Bit | 8 Data Bit
	UBRRL = 0xCF; // 2400bps @ 8.00MHz

	// I/O Ports
	DDRB = IRTX | RIGHT_DIR | LEFT_DIR | PWM;
	// PD2-5=D12-15, PD6=FrontLED und PD7=OdoLED, alle LEDs ausschalten
   DDRD |= (1<<PD7) | (1<<PD6) | (1<<PD5) | (1<<PD4) | (1<<PD3) | (1<<PD2);
   PORTD|= (0<<PD7) | (1<<PD6) | (1<<PD5) | (1<<PD4) | (1<<PD3) | (1<<PD2);

	// for PWM (8-Bit PWM) on OC1A & OC1B
	TCCR1A = (1 << WGM10) | (1 << COM1A1) | (1 << COM1B1);
	// tmr1 running on MCU clock/8
	TCCR1B = (1 << CS11);

	// A/D Conversion
	ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); // clk/64
	
	//ACS-Init (muss noch gecheckt werden
	DDRB |= (1<<PB3); // OC2 (36kHz an Timer2)
	//DDRD |= (1<<PD1); // ACS_LED_LEFT (TXD)
	DDRB |= (1<<PB0); // ACS_LED_RIGHT
	PORTB |= (1<<PB0); // off
	//PORTB &= ~(1<<PB0); // on

	//ODOMETRIE_LED_OFF;
	StatusLED(GREEN);
	MotorDir(FWD,FWD);
	MotorSpeed(0,0);
	sei();
}
Code:
// asuro-ProBot-Lib asuro-probot.h                                   12.9.09 mic

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>

#define  FALSE	0
#define  TRUE	1

#define  OFF    0
#define  ON     1

#define GREEN	1
#define RED		2
#define YELLOW  3

/* --------------- INTERNAL ------------- */
#define GREEN_LED_OFF  PORTD |=  GREEN_LED
#define GREEN_LED_ON PORTD &= ~GREEN_LED
#define RED_LED_OFF    PORTD |=  RED_LED
#define RED_LED_ON   PORTD &= ~RED_LED

#define FWD 0
#define RWD 1
#define BREAK	0x00
#define FREE	(1 << PB4) | (1 << PB5) /* (1 << PD4) | (1 << PD5)*/

#define GREEN_LED   		(1 << PD2)
#define RED_LED     		(1 << PD3)

#define PWM 	  	(1 << PB1) | (1 << PB2)
#define IRTX      (1 << PB3)
#define RIGHT_DIR (1 << PB4)
#define LEFT_DIR  (1 << PD5)

#define BATTERIE  (1 << MUX0) | (1 << MUX2) 	//ADC5
#define SWITCH    (1 << MUX2)						//ADC4
#define IR_LEFT	(1 << MUX0) | (1 << MUX1)	//ADC3
#define IR_RIGHT  (1 << MUX1)						//ADC2

#define ACS_RIGHT_LED   (1 << PB0)
#define ACS_LEFT_LED    (1 << PD1)
#define ACS_RIGHT_LED_on 	PORTB &= ~ACS_RIGHT_LED
#define ACS_RIGHT_LED_off 	PORTB |=  ACS_RIGHT_LED
#define ACS_LEFT_LED_on 	PORTD &= ~ACS_LEFT_LED
#define ACS_LEFT_LED_off 	PORTD |=  ACS_LEFT_LED

#define Speaker (1 << PD5) // speaker an D14
#define Speaker_on PORTD &= ~(1<<PD5)
#define Speaker_off PORTD |= (1<<PD5)

#define FRONT_LED (1 << PD6)
#define FRONT_LED_on PORTD &= ~(1<<PD6)
#define FRONT_LED_off PORTD |= (1<<PD6)

#define ODOMETRIE_LED 	  (1 << PD7)
#define ODOMETRIE_LED_ON  PORTD |= ODOMETRIE_LED
#define ODOMETRIE_LED_OFF PORTD &= ~ODOMETRIE_LED

#define WHEEL_LEFT   (1 << MUX0)			//ADC1
#define WHEEL_RIGHT  0					//ADC0

#define LED12_on PORTD &= ~(1<<PD2)
#define LED13_on PORTD &= ~(1<<PD3)
#define LED14_on PORTD &= ~(1<<PD5) // Achtung Reihenfolge D14/15 getauscht!
#define LED15_on PORTD &= ~(1<<PD4)

#define LED12_off PORTD |= (1<<PD2)
#define LED13_off PORTD |= (1<<PD3)
#define LED14_off PORTD |= (1<<PD5)
#define LED15_off PORTD |= (1<<PD4)
Gruß

mic