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

Atmega644P resetuje się podczas odbierania danych z USART-a

henxa 08 Sty 2010 20:32 1948 13
REKLAMA
  • #1 7505810
    henxa
    Poziom 11  
    Witam!!
    Od dosyć długiego czasu mam problem z resetowaniem się Atmegi644P podczas odbierania większej ilości danych a USART-a. Problem się powtarza przy każdej prędkości transmisji. Używając w podobny sposób Atmega16 nie miałem tego typu problemów.
    
    
    void uart_init(int baud)
    {
    	UCSR0B|=_BV(RXCIE0)|_BV(RXEN0)|_BV(TXEN0);
    	UBRR0H=baud>>8;
    	UBRR0L=baud;
    }
    ISR(USART0_RX_vect )
     {
    	
    	PORTB=UDR0;
    }	
    

    Proszę o podpowiedź co jest źle ustawione
  • REKLAMA
  • #2 7506178
    kamyczek
    Poziom 38  
    Czy w obsłudze przerwania wyłączasz globalna obsługę przerwań do czasu zakończenia obsługi przerwania ?
  • #3 7506266
    henxa
    Poziom 11  
    Próbowałem z wyłączonymi przerwaniami ale efekt jest ten sam.
    Resetowanie odbywa się tak jakby w przypadkowych momentach.
  • REKLAMA
  • #4 7506548
    tmf
    VIP Zasłużony dla elektroda
    Pokaz caly program, ktory wywoluje problem. Z tego co widze nie ustawiasz w init formatu ramki. Baud o ile jest bezposrednio wartoscia wpisywana do rejestru powinno byc typu unsigned.
  • #5 7506796
    henxa
    Poziom 11  
    Zrobiłem to co mi poleciłeś jednak brak poprawy. Teraz na sztywno jest ustawiona prędkość transmisji na 9600 bps.
    Problem z resetowaniem występuje tylko podczas odbierania kilkunastu znaków z rzędu. Gdy sa przesyłane pojedyncze znaki to działa to bez problemu.
    
    void uart_init(unsigned int baud)
    {
    	UCSR0B|=_BV(RXCIE0)|_BV(RXEN0)|_BV(TXEN0)|_BV(UCSZ01)|_BV(UCSZ00);
    	UBRR0H=0;
    	UBRR0L=103;
    	
    
    }

    Cały program jest doszyć obszerny gdyż ww nim występuje obsługa klawiatury do PC oraz wyświetlacza 240x128 pikseli.
    Zauważyłem ze po resecie wywołanym prawdopodobnie przerwaniem odebrania znaku w rejestrach pozostają ustawienia w rejestrach. Czyli tylko licznik rozkazów się zeruje wydaje mi się ze to jest problem z stosem ale nie wiem czy w win-AVR można mieć jakiś wpływ na niego.
  • #6 7506832
    tmf
    VIP Zasłużony dla elektroda
    Bez pokazania jakiegos minimalnego programu, w ktorym wystepuje ten blad nic ci nie poradzimy, bo to wrozenie z fusow. Jesli masz JTAG to mozesz ustawic pulapke na stos. Stos w gcc jest ustawiony na koniec pamieci, czyli max tego co mozesz miec. Ten proc ma 4k SRAM wiec nie tak malo, oczywiscie wszystko zalezy od tego co robisz.
  • REKLAMA
  • #7 7507134
    henxa
    Poziom 11  
    Napisałem króciutki program w którym mam tylko konfiguracje usart-a i nie zauważyłem resetowania procka ale podczas wysyłania kilku znaków wystepuja błedy w transmisji ;/
    Kwarc jaki używam to 16MHz
    Tamtego kodu nie daję ponieważ jest tam okuło 900 linii kodu ;/
    W terminalu mam ustawienia 1 bit stopu 8 bitów danych bez bitu parzystości i bez kontroli przepływu.

    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    void uart_init(void)
    {
    
    	UCSR0B|=_BV(RXCIE0)|_BV(RXEN0)|_BV(TXEN0)|_BV(UCSZ01)|_BV(UCSZ00);
    	UBRR0H=0;
    	UBRR0L=103;
    	sei();
    }
    char dana;
    ISR(USART0_RX_vect )
     {
    	
    	cli();
    	dana=UDR0;
    	PORTB=dana;
    	UDR0=dana;
    	sei();
    	
    	}	
    
    main()
    {
    	DDRB=0xff;
    	DDRD=0x80;
    	PORTD=0xff;
    	_delay_ms(3000);
    	uart_init();
    	while(1)
    	{
    		_delay_ms(500);
    		PORTD=0x80;
    		_delay_ms(500);
    		PORTD=0x00;
    	
    	}
    
    }
  • REKLAMA
  • #8 7507666
    asembler
    Poziom 32  
    kamyczek napisał:
    Czy w obsłudze przerwania wyłączasz globalna obsługę przerwań do czasu zakończenia obsługi przerwania ?

    Czy czasem nie jest tak ze przyjecie jakiegokolwiek przerwania blokuje globalne? I dopiero wstawienie SEI odblokuj globalne spowoduje odblokowanie?
  • #9 7508001
    _Robak_
    Poziom 33  
    asembler napisał:
    kamyczek napisał:
    Czy w obsłudze przerwania wyłączasz globalna obsługę przerwań do czasu zakończenia obsługi przerwania ?

    Czy czasem nie jest tak ze przyjecie jakiegokolwiek przerwania blokuje globalne? I dopiero wstawienie SEI odblokuj globalne spowoduje odblokowanie?

    Dokladnie tak jest, dlatego nie wiem po kiego grzyba koledzy wczesniej chcieli je wylaczac :>
  • #10 7508598
    Terminator
    Poziom 23  
    Pokaż jeszcze schemat połączeń, szczególnie zasilania.
  • #11 7508719
    asembler
    Poziom 32  
    Gdzie wysyłasz? gdzie odbierasz? czy są takie same kwarze?
    Oscyloskop w uruchamianu takich ukladów wiele potrafi zdzialac.
  • #12 7512197
    henxa
    Poziom 11  
    Teraz już nie krzaczy źle miałem ustawiona długość ramki:)
    Problem z resetowaniem występuje tylko wtedy gdy jest obsługiwany wyświetlacz:/ Mimo tego że na wyświetlacz znaki były wyświetlana poza przerwaniem.
  • #13 7512229
    asembler
    Poziom 32  
    To sprobuj zablokowac na probe przerwania na czas obslugi wyswietlacza. Jezeli to pomoze bedziesz wiedzial gdzie wystepuje błąd.
  • #14 7513701
    henxa
    Poziom 11  
    Jedyne co pomaga to sprawdzanie czy dane są odbierane z USART-a. Czyli jeżeli USART odbierze dane to przed wejściem do obsługi wyświetlacza odczekuje chwile. Zapobiega to wejściu w przerwanie gdy jest obsługiwany wyświetlacz.
REKLAMA