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

[Atmega8][C] RS232 Brak komunikacji - cisza

elektronik12z 31 Sie 2009 23:18 2738 12
REKLAMA
  • #1 6966459
    elektronik12z
    Poziom 13  
    Witam

    Dołączyłem do pinu 1 RX i pinu 2 TX układ z MAX232 (piny 11, 12).

    Napięcia w układzie max232:

    pin 2-pin 15 jest +9,82V
    6-15 jest -9,64V
    11-15 jest +3,45V
    12-15 jest +5,05V
    13-15 jest 0V
    14-15 jest -9,64V
    16-15 jest +5,05V

    Ustaliłem prędkość transmisji 2400, 2 bity stopu, 8 bitów danych, odpaliłem HyperTerminala i cisza nic się nie dzieje nawet nie ma krzaczków.

    Atmega8 działa na wewn. oscylatorze 8MHz, nie zależy mi ani na jakości ani stopa błędów transmisji, chciałem wysłać kila znaków i jakieś odebrać.

    NIe ma ustawionych żadnych fusebitów.

    Połączenia sprawdzałem z 10x.

    Kod programu:

    [i]#include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <avr/wdt.h>
    #include <stdio.h>
    
    
    #define F_PROC 8000000ul
    #define UART_BAUD 2400
    #define UART_CONST (F_PROC/16ul*UART_BAUD)-1)
    
    unsigned char x=0;
    
    
    
    void Putchar(unsigned char data)
    {
    	while( !(UCSRA & (1<<UDRE)) );
    	
    	UDR=data;
    }
    
    
    unsigned char Getchar(void)
    {
    	while( !(UCSRA & (1<<RXC)) );
    	
    	return UDR;
    }
    
    void Flush( void )
    {
    unsigned char dummy;
    while ( UCSRA & (1<<RXC) ) dummy = UDR;
    }
    
    void InitRS(void)
    {
    	//unsigned 
    	//unsigned int baud=9600;
    	unsigned int ubrr;
    	//float ubr=(PROC/16ul*UART_BAUD)-1;
    	ubrr=((F_PROC/16ul*UART_BAUD)-1);
    	
    	UBRRH=(unsigned char)(ubrr>>8); //Ustaw Baud Rate
    	UBRRL=(unsigned char)ubrr;
    	UCSRB=(1<<RXEN)|(1<<TXEN); //Włącz Odbiór i Nadawanie
    	
    	UCSRC=(1<<URSEL)|(1<<USBS)|(3<<UCSZ0); //Ustaw 8 data, 2 stop bit
    
    }
    
    void USART_Init( unsigned int ubrr)
    {
    /* Set baud rate */
    UBRRH = (unsigned char)(ubrr>>8);
    UBRRL = (unsigned char)ubrr;
    /* Enable receiver and transmitter */
    UCSRB = (1<<RXEN)|(1<<TXEN);
    /* Set frame format: 8data, 2stop bit */
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    }
    
    int main(void)
    {
    
    	DDRD=0x02;
    	PORTD=0x00;
    
    	//Dodatkowa dioda
    	DDRB |=_BV(0)|_BV(1);
    	
    	InitRS();
    	
    	while (1)
    	{
    		'Zapal diodę
    	    PORTB =_BV(1);
    
    		Putchar('a');
    		_delay_ms(500);
    
    		'Zgaś diodę
    		PORTB =_BV(0);
    		x=Getchar();
    		
    		_delay_ms(500);
    
    		'Zapal diodę
    		PORTB =_BV(1);
    			while(x=='7')
    			{
    				Putchar('4');
    				_delay_ms(500);
    				x=Getchar();				
    			}
    			while(x=='1')
    			{
    				Putchar('3');
    				_delay_ms(500);
    				x=Getchar();
    			}
    		
    	}
    }
    [/i]


    Proszę o pomoc, od czego zacząć? Co może być przyczyną?

    Pozdrawiam

    EDIT
    Witam

    Dodam, iż do komunikacji używam przejściówkę USB-RS232 na PL2303. Jak dotychczas działała poprawnie.

    Próbowałem zewrzeć piny 11,12 na maxie ale to nic nie dało.

    Poza tym na wyjściu układu z max232 mam złącze RS232 żeńskie i skrosowane 4-6 i 7-8.

    Próbowałem także w Visual Studio. Wykorzystując komponent SerialPort i wysyłając na port jakieś znaki, generowane jest zdarzenie DataReceived, ale funkcja SerialPort1.ReadExisting() zwraca znak pusty.

    Pozdrawiam


    Macie jakieś pomysły?

    Pozdrawiam





    Listingi umieszczamy w znacznikach [code] - poprawiłem.
    Proszę używać przycisku "Zmień" - posty scaliłem.
    [zumek]
  • REKLAMA
  • REKLAMA
  • #3 6967874
    pmmisiek
    Poziom 15  
    Cytat:
    Atmega8 działa na wewn. oscylatorze 8MHz, nie zależy mi ani na jakości ani stopa błędów transmisji, chciałem wysłać kila znaków i jakieś odebrać.

    NIe ma ustawionych żadnych fusebitów.


    Jeśli nie ustawiałeś fusebitów to prawdopodobnie Atmega8 działa domyślnie na wewn. oscylatorze 1MHz, zmień w programie i sprawdź.

    Pozdrawiam
  • #4 6968995
    elektronik12z
    Poziom 13  
    Witam

    Zwarłem 2-3 na DB9 i znaki powracają.

    Zwarłem RX i TX na max232 i nic się nie dzieje.

    Układ wydaje się ok.

    Ustawiłem nawet prędkość transmisji nawet na 300 bitów/s i nic.

    Już brakuje mi pomysłów.

    Pozdrawiam
  • REKLAMA
  • #5 6969068
    markosik20
    Poziom 33  
    elektronik12z napisał:
    Witam

    Zwarłem 2-3 na DB9 i znaki powracają.
    Zwarłem RX i TX na max232 i nic się nie dzieje.


    Problem sprzętowy, wykasuj pamięć z uC (albo odłącz go od max'a). Po zwarciu Rx i Tx za max'em znaki również muszą powracać.
  • REKLAMA
  • #6 6969215
    elektronik12z
    Poziom 13  
    Witam

    Co dziwne, kiedy mam podłączone złącze ISP do programowania procka i zewrę RX TX to znaki powracają, kiedy odłączę to nie.

    Programator jest pod LPT i już zaprogramowałem kilka układów.

    Pozdrawiam
  • #7 6969244
    markosik20
    Poziom 33  
    elektronik12z napisał:

    Co dziwne, kiedy mam podłączone złącze ISP do programowania procka i zewrę RX TX to znaki powracają, kiedy odłączę to nie.


    GND oczywiście sprawdzone? Zasilanie układu jest z programatora czy z zewnątrz?
  • #8 6969249
    _Robak_
    Poziom 33  
    Zimny lut, jakis problem z masa, cokolwiek. Wez miernik i obmierz plytke, czy vcc=5V, czy napiecia po stronie PC sa 9V bodajze. Czy masa jest wszedzie gdzie ma byc itp.
  • #9 6969335
    elektronik12z
    Poziom 13  
    Gniazdo jest z AVR, mam jedno zasilanie do procka i max232.
  • #10 6969426
    dkow
    Poziom 14  
    Spodkałem się już raz z takim problemem. Wykonałem prototyp układu na pająka i wszystko było ok., a gdy wykonałem to samo na druku to układ przestał gadać po RS232.
    Okazało się że, w drugiej wersji MAX232 był innego producenta który wymagał kondensatora blokującego zakłucenia przylutowanego tuż przy pinach na zasilaniu. Oglądałem to pod oscyloskopem. Wewnętrzna przetwornica MAXa okropnie siała. Nie wystarczył kondensator na zasilaniu koło LM7805. Po przylutowaniu C zgodnie z pdfem tego producenta zakłucenia ustały.
    Drugi problem to było dokładne dostrojenie oscylatora wewn. bo na niektórych egzemplażach transmisja nie chciała iść nawet na 2400bps
  • #11 6969535
    elektronik12z
    Poziom 13  
    Wydzieliłem całkowicie układ z max232 i jeśli nie zasilę go +5V to zwarcie pinów 2-3 gniazda DB9 żeńskiego powoduje powrót znaków w Hyperterminalu, po podłączeniu zasilania max232 znaki nie powracają.
    Próbowałem zamienić rx tx czyli 2 z 3 na DB9 ale dostaję śmieci po zwarciu tych pinów.

    Dzięki za cierpliwość.
  • #12 6970624
    elektronik12z
    Poziom 13  
    Witam

    Udało się:

    1) Przy kompilacji był komunikat że zegar procka to 8000000, wystarczyło to zmienić w makefile na 1000000
    2) Ustawiłem prędkość transmisji na 2400, ubrr ręcznie na 51
    3) Zaremowałem linię ustawiającą

    //UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); 


    4) Na komputerze ustawiłem 1200 bit/s, 1 bit stopu, 8 danych ? Nie wiem dlaczego, poszło na 1200???????????

    5) Zmieniłem kod na samo wysłane znaku, nowy kod

     while (1)
       {
          'Zapal diodę
           PORTB =_BV(1);
    
          Putchar('a');
          _delay_ms(500);
    
          'Zgaś diodę
          PORTB =_BV(0);
          x=Getchar();
          
          _delay_ms(500);
    
          'Zapal diodę
          PORTB =_BV(1);
             while(x=='7')
             {
                Putchar('4');
                _delay_ms(500);
                x=Getchar();            
             }
             while(x=='1')
             {
                Putchar('3');
                _delay_ms(500);
                x=Getchar();
             }
          
       }
    } 


    na

    
       while (1)
        {
          'Zapal diodę
          PORTB =_BV(1);
    
           Putchar('a');
          _delay_ms(1000);
    
          'Zgaś diodę
           PORTB =_BV(0);
         }   
    
    


    I wszystko zaczęło działać, ale dziwi mnie fakt iż w atmedze jest ustawione 2400 a na komputerze 1200 bit/s, przy ustawieniu 2400 na 2400 zamiast znaku a jest znak ascii 63.

    Pozdrawiam i dziękuję za pomoc.
  • #13 6970653
    dkow
    Poziom 14  
    Fuse - bity. Procek realnie idzie na 4Mhz. Bez zmian Fuse - bitów tak właśnie jest. Sprawdź Pony-Prog'iem
REKLAMA