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

Atmega644P i RS485 brak komunikacji

jaca_76 30 Mar 2011 10:25 1734 4
  • #1 9340086
    jaca_76
    Poziom 12  
    Witam prosiłbym o pomoc z uruchomieniem transmisji RS485 pomiędzy Atmegą644P a PC z przejściówką
    Link do schematu :
    https://www.elektroda.pl/rtvforum/topic1754125.html#8457769
    Przejściówka:
    https://www.elektroda.pl/rtvforum/topic1731213.html
    Definicje:

    
    #define UART_DE_PORT PORTC
    #define UART_DE_DIR DDRC
    #define UART_DE_BIT (1<<PC5)
    #define UART_DE_ODBIERANIE  UART_DE_PORT |= UART_DE_BIT
    #define UART_DE_NADAWANIE  UART_DE_PORT &= ~UART_DE_BIT
    #define UART_BAUD 9600		// tu definiujemy interesującą nas prędkość
    #define __UBRR F_CPU/16/UART_BAUD-1  // obliczamy UBRR dla U2X=0
    
    


    Kod:
    
    void USART_Init( uint16_t baud ) {
    	/* Ustawienie prędkości */
    	UBRR1H = (uint8_t)(baud>>8);
    	UBRR1L = (uint8_t)baud;
    	/* Załączenie nadajnika I odbiornika */
    	UCSR1B = (1<<RXEN1)|(1<<TXEN1);
    	/* Ustawienie format ramki: 8bitów danych, 1 bit stopu */
    	UCSR1C = (3<<UCSZ10); 
    	// jeśli korzystamy z interefejsu RS485
    	// inicjalizujemy linię sterującą nadajnikiem
    	UART_DE_DIR |= UART_DE_BIT;
    	UART_DE_ODBIERANIE;
    }
    
    unsigned char USART_Receive(void)
    {
    	while(!(UCSR1A&(1<<RXC1)));
    	return UDR1;
    }
    
    void USART_Transmit(unsigned char data)
    {
    while(!(UCSR1A & (1<<UDRE1)))
    ;
    UDR1 = data;
    } 
    
    int main(void) 
    {
     unsigned char	c = 0;
     ks0108Init(0);
     ks0108SelectFont(Corsiva_12, ks0108ReadFontData, BLACK);
     ks0108GotoXY(5,10);
     ks0108Puts_P(PSTR("Temp.:"));
     USART_Init( __UBRR );			// inicjalizacja UART
     ks0108GotoXY(5,10);
     ks0108Puts_P(PSTR("Temp.:"));
    	while(1)
          {
    
          UART_DE_NADAWANIE;
          USART_Transmit("a");
          _delay_ms(500);				// odczekaj 0,5 sekundy
           ks0108Puts_P(PSTR("wyslalem"));
    	}
    
    }
    
    

    Próbowałem już odbierać i wysyłać jak narazie bez sukcesów.
  • #2 9343344
    jaca_76
    Poziom 12  
    Sprawdziłem przejściówkę wydaje się że chodzi dobrze
    gdy wcisnę R przy połączonych A i B pojawia mi się R<0>.
  • #3 9354154
    jaca_76
    Poziom 12  
    Kolejny dzień poszukiwań i w końcu sukces .
    Jako pierwsze uruchomiłem rs232 a teraz udało mi się uruchomić RS485 , w kodzie z książki kolegi z forum pomylone chyba jest odbieranie z nadawaniem
    #define UART_DE_ODBIERANIE UART_DE_PORT |= UART_DE_BIT
    #define UART_DE_NADAWANIE UART_DE_PORT &= ~UART_DE_BIT

    nie mam siły już tego analizować , idę spać .
    Jutro może przerwania.
  • #4 9430961
    jaca_76
    Poziom 12  
    Chciałbym się poradzić Was w pewnej sprawie , w czasie projektowania płytki nie zaplanowałem żadnych urządzeń wejściowych - przycisków.
    Teraz chciałbym zastosować impulsator plus przycisk do obsługi menu .
    Pytanie jest czy lutować na pająka czy też wykorzystać I/O expander na i2c np. MCP23009.
  • #5 9437892
    jaca_76
    Poziom 12  
    Podłączyłem impusator(do każdego pinu kondensator do masy) i zastosowałem kod kolegi tmf .
    Niestety nie odczytuje on stanu przy szybszym kręceniu , za mała częstotliwość próbkowania ?
    Drugie pytanie - jak wyczyścić część ekranu tak bym nie musiał całości ?
    Kod ks0108Puts(" "); niestety nie działa.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [/code]
REKLAMA