Hey Leute,
ich weiß, das dieses Thema schon vor Jahren abgeschlossen wurde, aber ich habe zu meinem Problem keinen anderen Thread gefunden. Da ich momentan Montagemäßig unterwegs bin und dort immer mal Freizeit hab, hab ich gedacht, ich kümmer mich mal wieder um meinen RP6. Ich habe ihm eine Bumperplatine hinten angebaut mit zwei Bumpern, deren Anschluss und Auswertung genau wie die der vorderen Bumper erfolgt. Sie heißen nur Bumper_backleft und Bumper_backright. Ich habe die auch I2C tauglich gemacht und alles funktioniert wunderbar. Jetzt habe ich mir gedacht, ich baue das ACS auch nochmal für hinten nach. Da ich noch nen ATmega 16 übrig hab, hab ich mir gedacht, den nehme ich für das ACS nach hinten. Ich habe dann die Schaltung auf ein Steckboard 1:1 nachgebaut, wie ich sie in der Anleitung des Roboters gefunden hab. Die gleichen Teile, IR-LEDs usw, außer den IR Empfänger. Das ist bei mir ein TSOP31236. Der ist aber gleich wie der von Arexx verwendete (Datenblattvergleich). Den Programmcode nur für ACS, Timer2 steuerung INT2 hab ich alles von der RP6 Library übernommen. Compilieren ging einwandfrei und das laden via ISP in den Controller ging auch. Aber das Programm macht nichts. Es will einfach nicht funktionieren.
Das ist mein ganzes Programm:
Code:
#include "ATmega16.h"
/**************************************************************/
void acsStateChanged(void)
{
if(obstacle_left)
PORTB ^= IOB0;
}
/***************************************************************/
int main(void) //Hier beginnt das Hauptprogramm
{
initATmega();
PORTB |= IOB0 | IOB4 | IOB5; //Hier hängen StatusLEDs dran
delay_ms(200);
PORTB &= IOB0 & IOB5;
ACS_setStateChangedHandler(acsStateChanged);
enableACS();
setACSPwrHigh();
while (1)
{
task_ACS();
}
return 0;
}
Das einzige was passiert Die LEDs gehen an, nach 200ms geht nur LED an IOB5 aus. Mehr macht er nicht. Wie gesagt, der Programmcode ist komplett aus der RP6 Library übernommen.
Hier mal ein Auszug für initATmega():
Code:
void initATmega(void)
{
portInit(); // Setup port directions and initial values.
// THIS IS THE MOST IMPORTANT STEP!
//Initialisierung ADC
ADCSRA = (0<<ADEN) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1)| (1<<ADIF);
ADMUX |= (1<<REFS0); //Interne Referenzspannung nehmen
//SFIOR = 0;
GICR = (1 << INT2);
MCUCSR = (0 << ISC2);
// Initialize Timer 0 - 100µs cycle for Delays/Stopwatches, etc.:
TCCR0 = (0 << WGM00) | (1 << WGM01)
| (0 << COM00) | (0 << COM01)
| (0 << CS02) | (1 << CS01) | (0 << CS00);
OCR0 = 99;
// Initialize Timer2 - ACS:
TCCR2 = (1 << WGM21) | (0 << COM20) | (1 << CS20);
OCR2 = 0x6E; // 0x6E = 72kHz @8MHz
// Initialize Timer Interrupts:
TIMSK = (1 << OCIE0);// | (1 << OCIE2); //Der Timer Interrupt wird initialisiert
// Initialize ACS:
sysStatACS.channel = ACS_CHANNEL_RIGHT;
acs_state = ACS_STATE_IRCOMM_DELAY;
sei(); // Enable Global Interrupts
}
Das ist eigentlich genauso aufgebaut wie initRobotBase();
Ich hoffe ihr könnt mir helfen. Ich habe mir gedacht, wenn ich das 1:1 nachbaue, dann müsste es Fehlerfrei funktionieren. Könnt ihr mir nen Tipp geben, wie ich herausfinden kann, ob die LEDs mit 36KHz blinken. Wo wird denn die 36KHz Frequenz überhaupt eingestellt? Mit OCR2 = 0x6E ?
Wenn ich statt der IR-LEDs eine superhelle LED ranhänge, die leuchtet nicht. Möglicherweise ist das schon der Grund. Ich hoffe ihr könnt mir nen guten Tip geben.
VIelen Dank schonmal für eure Hilfe
MfG
RP6fahrer
PS:
Achja, mit Digitalkamera schauen hab ich auch versucht, aber man sieht weder beim RP6 noch hier die leuchtenden LEDs..
Lesezeichen