tiny2313 uart-interrupt mit gcc
tiny2313 uart-interrupt mit gcc
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
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
- lightfreak
- Posts: 644
- Joined: Tue 09 Oct, 2001 12:00 pm
- Do you already have Laser-Equipment?: of course...
- Location: Nitzahn
- Contact:
Ist denn in der Initialisierung der Schnittstelle auch der Interrupt für die UART freigegeben?
Gruß
Simon
Gruß
Simon
----------------------------------------------------------------------------------
http://www.simon-light.de
http://www.simon-light.de
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
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.
- 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:
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 !
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 !
- 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:
... 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);
//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);
Who is online
Users browsing this forum: No registered users and 1 guest