PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Infrarot-Schnittstelle ohne Bootloader [Gelöst]



raid_ox
08.02.2007, 14:52
Hi,

Ich habe mein Asuro mit anderem ATmega8 bestuckt. Bisher funktioniert alle funktion prima außer die Dateiübertragung über UART. Ich habe in der Bibliothek entdeckt, dass die UART schon in Bootloader initialisiert ist.

Weiß jemand, wie man UART ohne diese Bootloader initialisieren kann?

Danke für euere Hilfe

EDIT: Dieses Problem ist gelöst

Lösung: Taktproblem, gekaufte ATMega benutzt interne Resonator, FUSE bits muss per ISP geändert werden.

Pascal
08.02.2007, 14:55
Schau mal hier im Roboternetz oder auf www.mikrocontroller.net ins wiki. Da steht was dazu drin.

raid_ox
08.02.2007, 15:03
Gibt es unterschiede zwischen normaler UART und UART für Infrarot???

raid_ox
08.02.2007, 15:26
void Init(void)
{
//-------- serial 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

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

Ist das nicht die initialisierung für UART???

Pascal
08.02.2007, 15:29
Ja, steht doch da: "prepare RS232"

Aber der Zweck deiner Frage wird durch den post nicht ganz klar. Du musst schon genau sagen, was du willst.

raid_ox
08.02.2007, 15:32
Also: Ich habe nen neuen ATMega8, der ich mit einem ISP_Programmer programiere. Ich benutze standard Asuro library. Es klappt alles wunderbar bis auf die Infrarot-schnittstelle: ich kann SerWrite und SerRead nicht benutzen. Ich möchte gerne wissen was ich machen soll damit es geht

p_mork
08.02.2007, 15:33
Hallo raid_ox,
beim Empfangen mit dem UART nicht, dafür aber beim Senden. Um eine 1 zu senden muss man nämlich den TxD-Pin, an den die IR-LED angeschlossen ist, mit 36kHz ein- und ausschalten. Dieses wird durch die Hardware des AVR leider nicht unterstüzt. Das heisst man muss die 36kHz per Sowtware mit einem Timer erzeugen, wofür es in der Lib aber schon eine fertige Funktion gibt. Wie die heisst weiss ich nicht, da ich selber keinen Asuro habe.

MfG Mark

raid_ox
08.02.2007, 16:09
Du meinst SerWrite und SerRead funktion? Das ist ja gerade das problem, diese funktionen gehen nicht.

raid_ox
08.02.2007, 18:18
Kann es vielleicht daran liegen, dass OC2 und MOSI einen gemeinsamen pin hat?

Pascal
08.02.2007, 18:26
Ich kann mir nicht vorstellen, dass es damit zu tun hat, da es doch mit dem anderen ATMega8 funktioniert. Vorausgesetzt, du verwendest jetzt auch einen, kann es wohl nicht daran liegen. Ansonsten würde es bei keinem Asuro gehen. Das wäre schon aufgefallen ;-)

Arexx-Henk
08.02.2007, 19:24
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

raid_ox
09.02.2007, 17:47
Vielen dank Arexx-Henk, ich werde heute es noch probieren.

raid_ox
09.02.2007, 21:29
hmm, es funktioniert immer noch nicht... (-.-).



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" ???

damaltor
09.02.2007, 21:38
also übersetzen würde ich es mit "serielle routine wurde bereits im bootloadre gestartet und läuft bereits" oder so...

raid_ox
09.02.2007, 22:19
hmm, ich will gerne wissen was die "serielle routine" sind ...

damaltor
09.02.2007, 22:44
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

Arexx-Henk
10.02.2007, 08:32
Hallo raid_ox,

vermutlich sollte es so gehen...
(dies ist ein ausschnitt aus dem Yeti Init Funktion, der funktioniert gleich wie Asuro)


//------------------------------------------------------------//
// 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

raid_ox
11.02.2007, 13:44
Ich bisher geht das immer noch nicht, naja egal, ich werde dann diese MCU als slave benutzen

m.a.r.v.i.n
11.02.2007, 15:09
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.

raid_ox
11.02.2007, 15:11
Ach2 Danke marvin. nun aber weiß ich nicht wie man es mit avrdude machen kann

m.a.r.v.i.n
11.02.2007, 15:39
Hi,

erst mal mitdem AVR Fusebits Calculator die richtigen Fuses bestimmen.
Folgende Einstellung klappt eigentlich immer:
http://palmavr.sourceforge.net/cgi-bin/fc.cgi?P_PREV=ATmega8&P=ATmega8&V_LOW=FF&V_HIGH=99&M_LOW_0x3F=0x3F&M_LOW_0x40=&M_LOW_0x80=0x80&M_HIGH_0x01=&M_HIGH_0x06=0x00&M_HIGH_0x08=&M_HIGH_0x10=&M_HIGH_0x20=0x00&M_HIGH_0x40=&M_HIGH_0x80=&B_WTDON=P&B_SPIEN=P&B_BOOTSZ1=P&B_BOOTSZ0=P

Die gefunden Parameter trägt man dann in ddie avrdude Kommandozeile ein:


avrdude -p atmega8 -P lpt1 -c stk200-u -U lfuse:w:0xff:m -U hfuse:w:0xd9:m

Die Parameter -P für den Port und -c für den Programmertyp mußt du an deinen ISP Programmer anpassen.

raid_ox
11.02.2007, 20:21
WOW DANKE m.a.r.v.i.n . Du bist genial, jetzt funktioniert es PRIMA!!!! Du bist das beste!!!!!!