Witam.
Mam za zadanie zaprogramować kontroler Atmega128 razem z zestawem EVBnet02. Dokładniej to będzie obsługiwał antenę do kart rfid po porcie rs.
To jest mój kod programu. Na początku czytałem z portu rs za pomocą funkcji, ale nie jest to zbyt wygodne rozwiązanie. Chciałbym obsłużyć przerwanie jak jakieś dane pojawią się w rejestrze UDR0. Zgodnie z tutorialem z AVR Freaks i datashee zainicjowałem UART0 i włączyłem obsługę przerwania:
W funkcji main wywołałem ją, a później makro sei() do inicjacji obsługi przerwań w całej atmedze. No i tu zaczyna się problem. Po otrzymaniu czegokolwiek z terminala cały układ się blokuje. Na starcie ustawiam PORTD - moje diody led - aby były zapalone. Jak próbuje obsłużyć przerwanie to się wyłączaja i układ nie odpowiada :/
Korzystam z AVR Studio 4 i WInAvr. Wrzucam programiki za pomocą Megaload.
Byłbym wdzięczny za jakąkolwiek pomoc, bo miesiąc do deadlineu z projektem to nie za dużo czasu.
Mam za zadanie zaprogramować kontroler Atmega128 razem z zestawem EVBnet02. Dokładniej to będzie obsługiwał antenę do kart rfid po porcie rs.
#define F_CPU 16000000L
#define BAUD 9600
#define MYUBRR F_CPU/BAUD/16-1
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include "eeprom.h"
#include "uart.h"
volatile unsigned char odebrane;
volatile unsigned char ilosc;
int i=0;
static FILE mystdout = FDEV_SETUP_STREAM(USART_Transmit, NULL, _FDEV_SETUP_WRITE);
ISR(USART0_RXC0_vect)
{
unsigned char ReceivedByte;
ReceivedByte = UDR0;
//PORTD = ReceivedByte;
}
int main(void)
{
// konfiguracja portów I/O
DDRD = 0xFF;
PORTD = 0xFF;
DDRB = 0x00;
PORTB = 0xFF;
USART_init(MYUBRR);
stdout = &mystdout;
unsigned char znak=0xFF;
odebrane = 0xFF;
sei();
ilosc=0;
while(1)
{
PORTD = ilosc;
if(!(PINB & 0x02))
{
_delay_ms(80);
if(!(PINB & 0x02))
{
printf("Znaki %u\n", czytajDane(0x40));
}
_delay_ms(80);
}
}
return 0;
} To jest mój kod programu. Na początku czytałem z portu rs za pomocą funkcji, ale nie jest to zbyt wygodne rozwiązanie. Chciałbym obsłużyć przerwanie jak jakieś dane pojawią się w rejestrze UDR0. Zgodnie z tutorialem z AVR Freaks i datashee zainicjowałem UART0 i włączyłem obsługę przerwania:
void USART_init(unsigned int myubrr)
{
UBRR0H = (unsigned char)(myubrr>>8);
UBRR0L = (unsigned char)myubrr;
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
UCSR0C = (1<<USBS0)|(3<<UCSZ0);
UCSR0B |= (1 << RXCIE0);
}
W funkcji main wywołałem ją, a później makro sei() do inicjacji obsługi przerwań w całej atmedze. No i tu zaczyna się problem. Po otrzymaniu czegokolwiek z terminala cały układ się blokuje. Na starcie ustawiam PORTD - moje diody led - aby były zapalone. Jak próbuje obsłużyć przerwanie to się wyłączaja i układ nie odpowiada :/
Korzystam z AVR Studio 4 i WInAvr. Wrzucam programiki za pomocą Megaload.
Byłbym wdzięczny za jakąkolwiek pomoc, bo miesiąc do deadlineu z projektem to nie za dużo czasu.