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

Komunikacja ATmega128 z MAX232 przez RS232 - jak to zrobić w C?

webmortiz 16 Gru 2007 17:55 2444 5
REKLAMA
  • #1 4594467
    webmortiz
    Poziom 20  
    Posty: 467
    Pomógł: 24
    Ocena: 15
    Witam!

    Moze ktos mi powiedziec jak sie dogadac poprzez te wynalazki z komputerem i w druga strone?? Fajnie jakby ktos wrzucil cos w C. A jezeli nie to czy wystarczy na linie TX/RX podac/odebrac uformowany ciag bitow jak w standardzie RS232 czy trzeba cos jeszcze nakombinowac? Dodam ze linia T2in podlaczona jest pod PE1 a R2out pod PE0. Moze ten schemat co wrzucilem przyda sie jeszcze komus, jestem na 99,9% pewny ze jest on poprawnie skonstruowany.
    Załączniki:
    • Komunikacja ATmega128 z MAX232 przez RS232 - jak to zrobić w C? schemat.JPG (85.6 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 4594668
    Elektrooonik
    Poziom 29  
    Posty: 1212
    Pomógł: 127
    Ocena: 83
    Wystarczy skonfigurowac UART i odpowiednie predkosci transmisji w mikrokokontrolerze (rejestr UBBR) i format danych oraz w PC.

    Potem w asm masz:
    out udr, rejestr - wysłanie bajtu w 'rejestr'


    a odbior najlepiej przez przerwanie

    obsluga przerwania:
    in rejestr, udr
    RETI

    warto sprawdzac flagi, przykłady są w nocie katalogowej atmela

    Pozdr
    Paweł
  • REKLAMA
  • #3 4600060
    Ch.M.
    Poziom 27  
    Posty: 1009
    Pomógł: 62
    Ocena: 15
    No jeszcze mój poprzednik zapomniał o kwarcu odpowiedniej częstotliwości (UART friendly). Nie lepiej komunikować się pod USB? Koszt nie wiele wyższy :) a większa mobilność.
  • REKLAMA
  • REKLAMA
  • #5 4602399
    rafcikj
    Poziom 10  
    Posty: 14
    Witam,
    Również mam kłopot z połączeniem ATmega8 z komputerem.
    Kombinowałem na różne sposoby ale jakoś mi nie wychodzi.
    Proszę pomoc.

    Układ mam połączony w/g poniższego schematu. Mikrokontroler zaprogramowałem wg/g poniższego kodu.
    W komputerze ustawiłem Hyper Terminal :
    Liczba bitów: 9600
    Bity danych: 8
    Parzystość: Brak
    Bit stopu: 2
    Sterowanie: Brak

    #include <avr/io.h> 
    
    #define LED_0_ON DDRC |= _BV(PC0); PORTC |= _BV(PC0);
    #define LED_0_OFF DDRC |= _BV(PC0); PORTC &=~ _BV(PC0);
    #define LED_1_ON DDRC |= _BV(PC1); PORTC |= _BV(PC1);
    #define LED_1_OFF DDRC |= _BV(PC1); PORTC &=~ _BV(PC1);
    #define LED_2_ON DDRC |= _BV(PC2); PORTC |= _BV(PC2);
    #define LED_2_OFF DDRC |= _BV(PC2); PORTC &=~ _BV(PC2);
    #define LED_3_ON DDRC |= _BV(PC3); PORTC |= _BV(PC3);
    #define LED_3_OFF DDRC |= _BV(PC3); PORTC &=~ _BV(PC3);
    
    #define KEY_1 PINC |= _BV(PC4); PORTC &=~ _BV(PC4);
    
    #define FOSC 8000000ul
    #define BAUD 9600ul
    #define MYUBRR FOSC/16/BAUD-1
    
    void USART_Init( unsigned int ubrr)
    {
    	UBRRH = (unsigned char)(ubrr>>8);
    	UBRRL = (unsigned char)ubrr;
    	
    	UCSRB = (1<<RXEN)|(1<<TXEN);
    	
    	UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    }
    
    void USART_Transmit( unsigned char data )
    {
    	while ( !( UCSRA & (1<<UDRE)) );
    	
    	UDR = data;
    }
    
    int main( void ) 
    { 
    	while(1)
    	{
    		USART_Init ( MYUBRR );
    		
    		if ( bit_is_clear(PINC,PC4) ) {
    			LED_0_ON;
    			USART_Transmit(4);
    		} else {
    			LED_0_OFF;
    		}
    		
    		if ( bit_is_clear(PINC,PC5) ) {
    			LED_2_ON;
    			USART_Transmit(5);
    		} else {
    			LED_2_OFF;
    		}
    	}
    	return(0); 
    } 
    
    


    Z góry dziękuję

    Pozdrawiam
    Rafał
    Załączniki:
    • Komunikacja ATmega128 z MAX232 przez RS232 - jak to zrobić w C? atmega8_max232.JPG (187.12 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #6 4673786
    webmortiz
    Poziom 20  
    Posty: 467
    Pomógł: 24
    Ocena: 15
    Ok. Walczylem i poradzilem sobie xD Problem lezal w inicjalizacji. Zeby nie bylo ze tak dlugo z tym walczylem ale swieta byly i kilka innych projektow. Ch.M.: No niby lepiej przez USB ale program pisze pod gotowa plytke i mialem rozkaz z gory zeby bylo RS232. Dla zainteresowanych wstawiam kod. Schemat na poczatku postu. Dodam ze kod jest dla ATmega128.

    USART.h

    
    #include <avr/io.h>
    
    void USART_initialize(void);
    void sendbyte(unsigned char data);
    unsigned char readbyte (unsigned char *data);
    


    USART.c

    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include "USART.h"
    
    void USART_initialize(void)
    {
    	UCSR0B = 0x18; // Set RXEN and TXEN
    	UCSR0C = 0x06; // Set to 8 bit, NP, no stop bit
    	UBRR0L = 0x47; // set Buad Rate
    	UBRR0H = 0x00; // set Buad Rate
    
    }
    
    void sendbyte(unsigned char data)
    {
    	while(!(UCSR0A & 0x20));/* Wait until tx data register is empty */
    	UDR0 = data; /* Place our byte into the Tx buffer */
    }
    
    unsigned char readbyte (unsigned char *data)
    {
    // non blocking routine..checks Receive complete bit, returns 0 if nothing available
    // returns 1 if data available
    	if (UCSR0A & 0x80) {
    		*data = UDR0;
    		return 1;
    	} else {
    	return 0;
    	}
    }
    


    No i pozniej mozemy np. w programie glownym testa zrobic:

    
    unsigned char znak;
    USART_initialize();
    while(1){
    	if (readbyte(&znak))
    	{
    		sendbyte(znak);
    	}
    }
    


    Oczywiscie w funkcji inicjalizujacej mamy:

    UBRR0L = 0x47; // set Buad Rate
    UBRR0H = 0x00; // set Buad Rate

    gdzie z wzrou, ktory mozemy znalezc w datasheet od ATmega128 wyliczamy buad rate. Jest to na razie prowizorka odbierajaca i wysylajaca 1 znak z wpisanymi na sztywno parametrami ale mysle ze to na razie starczy.

    Tak wiec temat uwazam za zamkniety.
REKLAMA