Witam
Od dwóch dni borykam się z pewnym problemem. Mam 2 mikrokontrolery: ATTiny2313 i AT90S2313. W tematach na elektrodzie znalazłem taki oto banalny program, odbierający znaki przez RS232 na przerwaniach, napisany dla AT90S2313:
Po skompilowaniu i załadowaniu program działa poprawnie, czyli jeśli z terminala do mikrokontrolera wyślę znak 'b', to na wyświetlaczu LED zapalają się zera. Problem jest z ATTiny2313, a więc następujący kod:
już niestety tego nie robi. Nie reaguje na żadne znaki, tak jakby przerwanie nie było obsługiwane. Oczywiście mogę skompilować program dla AT90S2313 i załadować go do ATTiny2313 i będzie działał, ale nie tędy droga. Chcę mieć dostęp do wszystkich danych rejestrów UART i aby przerwanie było obsługiwane.
Gdzie jest błąd?
Od dwóch dni borykam się z pewnym problemem. Mam 2 mikrokontrolery: ATTiny2313 i AT90S2313. W tematach na elektrodzie znalazłem taki oto banalny program, odbierający znaki przez RS232 na przerwaniach, napisany dla AT90S2313:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdlib.h>
#define F_CPU 4000000UL
#define UART_BAUD 19200
#define UART_CONST (F_CPU/(16ul*UART_BAUD)-1)
volatile char znak;
SIGNAL(SIG_UART_RECV)
{
PORTB=32;
znak = UDR;
}
int main(void){
DDRD = 126;
DDRB = 255;
PORTB = 0;
PORTD=2;
UBRR=(unsigned char)UART_CONST;
UCR = 1<<RXCIE | 1<<RXEN;
sei();
for(;;)
{
if(znak=='b')
PORTB=64;
}
}
Po skompilowaniu i załadowaniu program działa poprawnie, czyli jeśli z terminala do mikrokontrolera wyślę znak 'b', to na wyświetlaczu LED zapalają się zera. Problem jest z ATTiny2313, a więc następujący kod:
#include <stdlib.h>
#define F_CPU 4000000UL
#define UART_BAUD 19200
#define UART_CONST (F_CPU/(16ul*UART_BAUD)-1)
volatile char znak;
SIGNAL(SIG_UART_RECV)
{
PORTB=32;
znak = UDR;
}
int main(void)
{
DDRD = 126;
DDRB = 255;
PORTB = 0;
PORTD=2;
UBRRH = (unsigned char)(UART_CONST>>8);
UBRRL = (unsigned char)UART_CONST;
/* Enable receiver and transmitter */
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = 1<<UCSZ1 | 1<<UCSZ0 | 0<<USBS; //ramka 8bit, 1 bit stopu
sei();
for(;;)
{
if(znak=='b')
PORTB=64;
}
}
już niestety tego nie robi. Nie reaguje na żadne znaki, tak jakby przerwanie nie było obsługiwane. Oczywiście mogę skompilować program dla AT90S2313 i załadować go do ATTiny2313 i będzie działał, ale nie tędy droga. Chcę mieć dostęp do wszystkich danych rejestrów UART i aby przerwanie było obsługiwane.
Gdzie jest błąd?
