tiny2313 uart-interrupt mit gcc

Microcontroller, Steuerungen, Protokolle und und und.

Moderators: thomasf, random

Post Reply
dominik
Posts: 117
Joined: Sun 07 Aug, 2005 3:45 pm
Location: Dresden

tiny2313 uart-interrupt mit gcc

Post by dominik » Mon 17 Apr, 2006 7:20 pm

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

User avatar
lightfreak
Posts: 644
Joined: Tue 09 Oct, 2001 12:00 pm
Do you already have Laser-Equipment?: of course...
Location: Nitzahn
Contact:

Post by lightfreak » Mon 17 Apr, 2006 9:22 pm

Ist denn in der Initialisierung der Schnittstelle auch der Interrupt für die UART freigegeben?

Gruß

Simon
----------------------------------------------------------------------------------
http://www.simon-light.de

schobi
Posts: 272
Joined: Mon 26 Sep, 2005 9:28 am
Location: Regensburg
Contact:

Post by schobi » Tue 18 Apr, 2006 9:25 am

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
Ich danke allen, die zur Sache nichts zu sagen hatten und trotzdem geschwiegen haben.

User avatar
random
Posts: 2161
Joined: Fri 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Location: München - 85540 Haar
Contact:

Post by random » Tue 18 Apr, 2006 6:37 pm

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 !

User avatar
random
Posts: 2161
Joined: Fri 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Location: München - 85540 Haar
Contact:

Post by random » Tue 18 Apr, 2006 6:40 pm

... 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);

dominik
Posts: 117
Joined: Sun 07 Aug, 2005 3:45 pm
Location: Dresden

Post by dominik » Wed 19 Apr, 2006 11:06 am

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

Post Reply

Return to “Microcontroller & Steuerungen”

Who is online

Users browsing this forum: No registered users and 1 guest