-
hallo raid_ox,
Um die seriellen Schnitstelle zu benutzen sollte sowie gesagt einmalig die USART initialisiert werden mit die hier genannten 'void Init(void)' Funktion damit konnen die RS232 signalen erzeugt werden. Mit die Funktion wird auch ein 36KHz Signal generiert (Timer2) um als tragefrekenz zu arbeiten so wie beim Asuro der fall ist. Ohne tragefrekwenz geht die Signal ubertragung mit Infrarotes Licht nicht.
Die Port PB3/MOSI/OC2 sollte noch als Ausgang geschaltet werden (DDRB) damit die Tragefrekwenz nach aussen komt.
Die USART pin PD1/TXD wird bein senden von Daten (einschalten der Transmitter) automatisch als Ausgang geschaltet.
Gruss
Henk
-
Vielen dank Arexx-Henk, ich werde heute es noch probieren.
-
hmm, es funktioniert immer noch nicht... (-.-).
Code:
void Init(void)
{
//-------- serial interface programmed in boot routine and already running -------
DDRB |= (1 << PB3);
// 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
// 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 | LEFT_DIR | PWM | GREEN_LED;
DDRD = RIGHT_DIR | FRONT_LED | ODOMETRY_LED | RED_LED;
// 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
ODOMETRY_LED_OFF;
FrontLED(OFF);
BackLED(ON,ON);
BackLED(OFF,OFF);
StatusLED(GREEN);
MotorState(FWD,FWD);
MotorSpeed(0, 0);
sei();
}
ich habe DDRB |= (1 << PB3); hinzugefügt
was heißt eigentlich "serial interface programmed in boot routine and already running" ???
-
also übersetzen würde ich es mit "serielle routine wurde bereits im bootloadre gestartet und läuft bereits" oder so...
-
hmm, ich will gerne wissen was die "serielle routine" sind ...
-
naja im bootloader wird die infrarotverbindung ja schon benutzt, um zu erkennen ob der computer daten sendet und um diese dann evtl zu empfangen. vielleicht läuft sie dann einfach weiter, und wird nur noch ein wenig angepasst für serwrite und serread
-
Hallo raid_ox,
vermutlich sollte es so gehen...
(dies ist ein ausschnitt aus dem Yeti Init Funktion, der funktioniert gleich wie Asuro)
Code:
//------------------------------------------------------------//
// Init USART for RS232 communication //
//------------------------------------------------------------//
// Init Atmega USART for RS232 communication (connected to Yeti InfraRed transmitter/receiver)
// default init
UCSRA=0x00;
// default init
UCSRB=0x00;
// select UCSRC, no parity, 1 stop bit, 8 databits per character
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
// select baudrate 2400bps when using 8.0000MHz oscillator (see table 62 in pdf)
UBRRL=0xCF;
//------------------------------------------------------------//
// Init Timer2, used for generating RS232 IR carrier signal //
//------------------------------------------------------------//
// prepare 36kHz for IR - Communication
// WGM21: waveform generation mode 2 => CTC mode => TOP = OCR2
// (Only counting up until value OCR2 (TOP) reached)
// COM20: Toggle OC2 on Compare Match
// CS20: No prescaling (so Timer2 clock frequency = 8MHz = 125ns)
TCCR2=(1<<WGM21)|(1<<COM20)|(1<<CS20);
// 0x6E = 110, so frequency is 110 * 125ns = 13.75us = 72.727KHz
// as output is toggled, the real frequency is 72.727KHz / 2 = appr. 36KHz
OCR2=0x6E;
//------------------------------------------------------------//
// Set 36KHz carrier pin as output
//------------------------------------------------------------//
// set carrier signal pin PB3/(MOSI/OC2) as output
DDRB|=(1<<PB3);
Gruss,
Henk
-
Ich bisher geht das immer noch nicht, naja egal, ich werde dann diese MCU als slave benutzen
-
Hi,
hast du die Fusebits bei dem neuen ATmega8 korrekt gesetzt?
Auf externer Takt gestellt. Ein fabrikneuer ATmega8 läuft erst mal mit 1Mhz internem Takt. Dann stimmt natürlich die UART Baudrate nicht. Der Prozessor funktioniert ansonsten, nur halt langsamer.
-
Ach2 Danke marvin. nun aber weiß ich nicht wie man es mit avrdude machen kann