Page 1 of 1

tiny2313 uart-interrupt mit gcc

Posted: Mon 17 Apr, 2006 7:20 pm
by dominik
Nabend,
hab nen kleines Problem, möchte nämlich mit nen ATtiny2313 RS232-Daten empfangen. Normal läuft das Problemlos. Nur nicht mit dem Interrupt.
villeicht weiss jemand, warum das nicht läuft. hab die Interrupts in Main eingeschaltet(mit sei(); )

hier die Interrupt Routine:

ISR(USART_RX_vect)
{
PORTB = 0x04; //Empfangs-LED ein
_delay_ms(150);
get = UDR;
PORTB = 0x03; //Empfangs-LED aus
UDR = get; //Daten zurücksenden
}

Wär cool, wenn mir jemand helfen kann.

MFG Dominik

Posted: Mon 17 Apr, 2006 9:22 pm
by lightfreak
Ist denn in der Initialisierung der Schnittstelle auch der Interrupt für die UART freigegeben?

Gruß

Simon

Posted: Tue 18 Apr, 2006 9:25 am
by schobi
Kommt er denn wenigstens einmal in die Interruptroutine oder kein einziges mal? Wenn gar nicht, dann stimmt mit der Initialisierung was nicht. Das RXCIE (receive complete interrupt enable) muss natürlich auch noch gesetzt sein.

Soweit ich mich erinnere muss innerhalb der ISR nicht nur das Datenregister UDR, sondern auch das Statusregister ausgelesen werden, damit der Empfangs-FIFO auf das nächste Byte weitergeschaltet wird.

Gruß Tobias

Posted: Tue 18 Apr, 2006 6:37 pm
by random
Hi,

hier mal 2 Codes...

der erste war ein testproggie von mir, auf die schnelle auf dem küchentisch bei einem kumpel, um dessen dmx-master zu testen:

#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <inttypes.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdlib.h>
#include "../../include/lcd.h"


#define CLK 9216000

#define bit_on(BYTE, BIT) BYTE |= 1 << BIT;
#define bit_off(BYTE, BIT) BYTE &= ~(1 << BIT);

#define delay_ms(ms) _delay_loop_2(ms * (CLK/4000))
#define delay_us(us) _delay_loop_2(us * (CLK/4000000))



int main(void)
{
/*
bit_off(UCR, UMSEL); //Asynchronous Transmission
bit_off(UCR, UPM0); //No parity
bit_off(UCR, UPM1);
bit_off(UCR, USBS); // 1 Stop

bit_off(UCR, UCSZ0); //Char-Size 8Bit
bit_off(UCR, UCSZ1);
bit_off(UCR, UCSZ2);
*/

//UBRRH = 0x00;
UBRR = 9;

bit_on(UCR, RXEN); //Receiver enable
bit_on(UCR, TXEN); //Transmitter enable


bit_on(USR, RXC); //RX INT enable


int tmp=0;


while (1)
{

delay_us(10000000);
UDR = 65;




}
}

Den RX-Int musst dir da nur noch reinschrauben, wichtig ist es, vor sei() noch den rx-int zu enablen.

Ist für den 2313. Baudrate sing glaub ich 9600. --> Datenblatt !

Posted: Tue 18 Apr, 2006 6:40 pm
by random
... und hier die Routine für den Mega 8 (19200Baud):

//USART
bit_off(UCSRC, UMSEL); //Asynchronous Transmission
bit_off(UCSRC, UPM0); //No parity
bit_off(UCSRC, UPM1);
bit_off(UCSRC, USBS); // 1 Stop

bit_on(UCSRC, UCSZ0); //Char-Size 8Bit
bit_on(UCSRC, UCSZ1);
bit_off(UCSRC, UCSZ2);
UBRRH = 0x00;
UBRRL = 0x19;

bit_on(UCSRB, RXEN); //Receiver enable
bit_on(UCSRB, TXEN); //Transmitter enable

bit_on(UCSRB, RXCIE); //RX INT enable

//öffnet einen Kanal für printf (STDOUT)
fdevopen (uart_putchar, NULL, 0);

Posted: Wed 19 Apr, 2006 11:06 am
by dominik
So.. hab das jetzt hinbekommen.
Danke für eure Hilfe.
Hab wirklich das (1<<RXCIE) vergessen. Stand aber auch in keiner Anleitung drinn. - Oder ich habs überlesen.

Den Statusregister brauche ich aber nicht abrufen. Der scheint sich beim Auslesen der Uart automatisch zurückzusetzen.

MFG Dominik