logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega128 + EVBnet02 - problem z przerwaniem dla RS232

kumien 18 Maj 2010 17:49 816 0
REKLAMA
  • #1 8091008
    kumien
    Poziom 11  
    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.
    
    #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.
  • REKLAMA
REKLAMA