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

[Atmega162][WINAVR][C]Prośba o sprawdzenie inicjalizacji RS

elektronik12z 12 Paź 2010 09:38 1514 7
REKLAMA
  • #1 8609997
    elektronik12z
    Poziom 13  
    Witam

    Mam problem z inicjalizacją portu RS232 na Atmedze162, szybkość transmisji 115200. 8, N, 1 oto kod:


    //Zmienne
    volatile unsigned char buffers[55];
    volatile unsigned char counter=0;
    const unsigned char frame1[] PROGMEM={0x1E,0X00,0X0C,0X7F,0X00,0X02,0X17,0X01,0X05,0x7C};//10
    const unsigned char frame11[] PROGMEM={0x1E,0X00,0X0C,0X17,0X00,0X08,0X00,0X01,0X00,0x0A,0x02,0x00,0x01,0x47,0x11,0x53};//16
    ...
    //Ustawienie portu RS232
    void USART_Init( unsigned int ubrr)
    {
     /* Set baud rate */
      UBRR0H = (unsigned char)(ubrr>>8);
     
     UBRR0L = (unsigned char)ubrr;
     
     /* Enable receiver and transmitter */
     UCSR0B =(1<<RXEN0) | (1<<RXCIE0) | (0<<UDRIE0) | (1<<TXEN0);
     
    
     //Atmega162
     //115200. 8, N, 1
      UCSR0C =(1<<URSEL0)|(0<<USBS0)|(3<<UCSZ00);
    
    }
    
    
    ISR(USART0_RXC_vect	)
     {
        if(counter<255) 
    	{
    		counter++;
    	}else
    	{
    		counter=0;
    	}	
    	
    	unsigned char buf;
    	buf=UDR0;
    	
    	
    	buffers[counter]=buf;
    	
    	
    }
    
    void USART_Transmit( unsigned char data )
    {
    	/* Wait for empty transmit buffer */
    	while ( !( UCSR0A & (1<<UDRE0)) )
    	;
    	/* Put data into buffer, sends the data */
    	UDR0 = data;
    }
    
    void main(void)
    {
    ...
     for (i=0;i<=9;i++)
     {
          USART_Transmit(pgm_read_byte(&frame1[i]));
     }
     _delay_ms(1000);	
    
     for (i=0;i<=15;i++)
     {
          USART_Transmit(pgm_read_byte(&frame11[i]));
     }
    }
    


    Problemy są 2:

    1. Program nie wchodzi do obsługi ww. przerwania
    2. Nie wysyła wszystkich znaków poprawnie, z tablicy frame11 nie wysyła 0x11?

    [Atmega162][WINAVR][C]Prośba o sprawdzenie inicjalizacji RS

    Zaprojektowany układ ma współpracować z Nokią 6610 poprzez fbus. tablica wysyłana na RS232 jest we Flashu, gdyż zajętość programu dla Data 99%.
    Podejrzewam, że to wina programu, dlatego proszę Was o pomoc w tej sprawie, połączenia sprawdzałem kilka razy.

    Pozdrawiam
  • REKLAMA
  • REKLAMA
  • #3 8610021
    elektronik12z
    Poziom 13  
    Witam

    Dokładałem tą funkcję do prawie zrobionego układu, i dodałem funkcję obsługi portu RS232 na początku po inicjalizacji portów i LCD i to chyba będzie to, że nie ma sei().

    Wieczorkiem sprawdzę i dam znać.

    Dziękuje i pozdrawiam.
  • REKLAMA
  • #4 8613556
    elektronik12z
    Poziom 13  
    Witam

    Port mikrokontrolera RS232 z komputerem działa w obie strony, czyli uC wysyła mi ramkę, jeżeli w Hyperterminalu wcisnę przycisk to wywoływane jest przerwanie USART0_RXC. Z telefonem niestety komunikacja jest tylko w jedną stronę czyli uC wysyła, ale nie dostaje odpowiedzi.
    Wysyłane ramki są prawidłowe, bo wysyłając je z Visual Studio telefon od razu odpowiada.

    Dziwne jest także to, że ustawiając w UCSRC0
    bit 1<<USBS Hyperternal muszę ustawić na 1 bit stopu i wtedy jest ok.
    bit 0<<USBS Hyperternal muszę ustawić na 2 bity stopu, w manualu do uC jest odwrotnie.

    Może to ważne, w porcie RS mam podłączone piny RX, TX i masę.

    Pozdrawiam
  • REKLAMA
  • #5 8613723
    mieczotronix
    Poziom 16  
    jeśli zajętość data 99% to może stos wjeżdża ci już na zmienne.
    pozatym buffers masz zadeklarowane w rozmiarze 55
    a w ISR masz index od 0 do 255
    jak nic masz konflikt między tymi trzema rzeczami: stos, ten bufor, zmienne

    podebuguj i włącz podgląd pamięci, zobaczysz co gdzie maże
  • #6 8614055
    elektronik12z
    Poziom 13  
    Witam

    To dlaczego to działa z komputerem?
    W jaki sposób zdebugować?

    Pozdrawiam
  • #7 8614174
    mieczotronix
    Poziom 16  
    dlatego, że hyperterminal wysyła poprawne dane, a twój program nie

    zdebugować debugerem w AVRstudio - jeśli masz sam programator, to nie da rady, ale jeśli masz np. AVRDragon, to już coś zobaczysz

    Masz pamięć RAM w atmedze i w niej siedzą dane i od drugiej strony narasta stos. Nie ma żadnego mechanizmu, który by bronił dane (zmienne globalne) przed zamazaniem przez stos (zmienne lokalne, wartości rejestrów odkładane przed wywołaniem procedur).
    Jeśli masz na 99% wypełniony RAM zmiennymi, to na 99% twoje problemy są tym spowodowane.
    Objawem takiego konfliktu jest najczęściej zupełnie przypadkowe działanie programu, magicznie zmieniające się wartości zmiennych i ogólna rozpierducha.

    Zresztą sprawdź, wytnij tą komunikację i wstaw do nowego programu, który nie robi nic więcej. Wtedy pewnie będzie działało.

    No i pamiętaj o tym buforze (raz ma długość 55, a raz 255)
  • #8 8617313
    elektronik12z
    Poziom 13  
    Witam

    Napisałem całkiem nowy program i niestety telefon na fbus nie komunikuję sie z uC. Dla sprawdzenia komunikacji sprawdziłem telefon z mbus na 9600, O, 8, 1 i wszystko jest ok. Czyli soft i podłączenie RX, TX, GND jest ok. Doczytałem na embededtronics "Nokia FBUS Protocol", że przy fbusie potrzebne są także sygnały DTR i RTS, podobno należy DTR pod łączyć po V+(1), a RTS na V-(0), potwierdzacie?

    Pozdrawiam
REKLAMA