tiny2313 uart-interrupt mit gcc

Microcontroller, Steuerungen, Protokolle und und und.

Moderatoren: thomasf, random

Antworten
dominik
Beiträge: 117
Registriert: So 07 Aug, 2005 3:45 pm
Wohnort: Dresden

tiny2313 uart-interrupt mit gcc

Beitrag von dominik » Mo 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

Benutzeravatar
lightfreak
Beiträge: 644
Registriert: Di 09 Okt, 2001 12:00 pm
Do you already have Laser-Equipment?: of course...
Wohnort: Nitzahn
Kontaktdaten:

Beitrag von lightfreak » Mo 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
Beiträge: 272
Registriert: Mo 26 Sep, 2005 9:28 am
Wohnort: Regensburg
Kontaktdaten:

Beitrag von schobi » Di 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.

Benutzeravatar
random
Beiträge: 2160
Registriert: Fr 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Wohnort: München - 85540 Haar
Kontaktdaten:

Beitrag von random » Di 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 !

Benutzeravatar
random
Beiträge: 2160
Registriert: Fr 03 Aug, 2001 12:00 pm
Do you already have Laser-Equipment?: Dynamics, Easy-/NetLase, NetLaseLC
Some devices that emit light.
Wohnort: München - 85540 Haar
Kontaktdaten:

Beitrag von random » Di 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
Beiträge: 117
Registriert: So 07 Aug, 2005 3:45 pm
Wohnort: Dresden

Beitrag von dominik » Mi 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

Antworten

Zurück zu „Microcontroller & Steuerungen“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast