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

ATmega8515 - USART nie działa w C, WinAVR20070525, MAX232, HyperTerminal

elektronika1984 20 Lis 2007 17:48 1419 2
REKLAMA
  • #1 4501893
    elektronika1984
    Poziom 13  
    Posty: 86
    Pomógł: 5
    Ocena: 5
    Witam.
    Mam nadzieję, że się nie narażę tym tematem, ponieważ był już wielokrotnie opisywany - jednak uzmysławia to jak wiele problemów może wyniknąć przy obsłudze jednej rzeczy.

    Sprawa jest prosta, napisany program w WinAVR20070525 nie obsługuje portu USART w mikrokontrolerze ATmega8515. Układ jest podłączony do COM'a poprzez inwerter MAX232. Podczas nadawania na wyjściu MAX'a pojawiają się jakieś dane, jednak w HyperTerminal nic nie widać. Kod wygląda następująco:

    
    #include <avr/io.h>
    #include <inttypes.h>
    #include <util/delay_basic.h>
    
    //definicja RS232
    //UCSRA
    #define RXC 7
    #define TXC 6
    #define UDRE 5
    #define FE 4
    #define DOR 3
    #define PE 2
    #define U2X 1
    #define MPCM 0
    
    //UCSRB
    #define RXCIE 7
    #define TXCIE 6
    #define UDRIE 5
    #define RXEN 4
    #define TXEN 3
    #define UCSZ2 2
    #define RXB8 1
    #define TXB8 0
    
    //UCSRC
    #define URSEL 7
    #define UMSEL 6
    #define UPM1 5
    #define UPM0 4
    #define USBS 3
    #define UCSZ1 2
    #define UCSZ0 1
    #define UCPOL 0
    
    void nadaj_USART(uint8_t dana)
    {
    	while( !( UCSRA & (1<<UDRE) ) ); //czekaj na wyslanie poprzedniej danej
    	UDR = dana;
    }
    
    uint8_t odbierz_USART(void)
    {
    	while( !(UCSRA&(1<<RXC)) ); //czekaj na odebranie danej
    	return UDR;
    }
    
    
    
    int main(void)
    {
    	//volatile uint8_t dana = 0x66;
    	uint8_t tab_char[] = { 0x97, 0x98, 0x99, 0x9A };
    	uint8_t i;
    	
    	//inicjalizacja portów
    	DDRA = 0x00; //1 - wyjscie , 0 - wejscie
    	PORTA = 0xff; //z podciagnietymi wejsciami
    	DDRB = 0x00;
    	PORTB = 0xff;
    	DDRC = 0xff;
    	PORTC = 0xff; 
    	DDRD = 0x72; //RxD - jako wyjscie, PD4 - PD6 - wyjscia  0111 0010
    	PORTD = 0xff;
    	
    	//inicjalizacja RS232
    	UCSRC = (1<<UPM1) | (1<<UCSZ1) | (1<<UCSZ0); //asynch, parzystosc, 1 stop bit, 8bit data,
    	UBRRL = 143; //baudrate => 143 = 4800 dla 11059200
    	UCSRB = (1<<RXEN) | (1<<TXEN);
    	
    	
    	for(;;)
    	{
    		for (i=0; i<4; i++)
    		{
    			PORTC = tab_char[i];
    			nadaj_USART(tab_char[i]);
    		}
    	}
    	
    	
    	return 0;
    }
    


    Co tutaj jest źle ustawione. Połączenie kabel i płytka są sprawne. Napisałem program w Bascom'ie i działa. Teraz próbuję w C i coś nie idzie. Podłączony zewnętrzny kwarc 11.0592MHz.

    Poniżej zamieszczam konfigurację FuseBitów:
    ATmega8515 - USART nie działa w C, WinAVR20070525, MAX232, HyperTerminal
  • REKLAMA
  • Pomocny post
    #2 4502057
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    elektronika1984 napisał:

    [code]
    //inicjalizacja RS232
    UCSRC = (1<<UPM1) | (1<<UCSZ1) | (1<<UCSZ0); //asynch, parzystosc, 1 stop bit, 8bit data,

    Co tutaj jest źle ustawione.

    Nieprawidłowy zapis.Kod który zacytowałem wyżej , powoduje zapis do rejestru UBRRH.Poczytaj o bicie URSEL.

    Piotrek
  • #3 4502189
    elektronika1984
    Poziom 13  
    Posty: 86
    Pomógł: 5
    Ocena: 5
    No jasne!
    Moje niedopatrzenie, wziąłem pod uwagę fakt, że URSEL jest domyślnie jedynką, natomiast nie zwróciłem uwagi, że przypisanie jakie ja stosuje - kasuje tą jedynkę!
    Wielkie dzięki za odpowiedź.

    Pozdrawiam.
REKLAMA