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

[mega8][avr-gcc]Brak przerwania odbioru UART

bartekb3 08 Gru 2008 20:16 1728 5
REKLAMA
  • #1 5834666
    bartekb3
    Poziom 10  
    Witam dość długo szukałem przed napisaniem ale nie mam pomysłu co tu jest nie tak...
    oto kod:

    
    void UART_init(void)  // inicjalizacja UART
    
    {
    
    
      _UBRR_ = (u08)UART_CONST;     // ustaw prędkoœć transmisji
    
    _UCR_ = _BV(RXEN)|_BV(TXEN)|_BV(RXCIE);// włšcz odbiór i nadawanie
    sei();
    }
    
    ISR(USART_RXC_vect) {
     RESET(PORTC,3); //zapal diode
      for(i=100;i>0;i--)  _delay_ms(30);
    SET(PORTC,3); //zgas diode
    RESET(_USR_,RXC);
    }
    
    int main(void)
    
    {       
    SET(DDR(PORTC),1);
    UART_init();
    while(1) {
    
    }
    }


    oczywiscie kodu jest wiecej (projekt po kompilacji zajmuje 5kb) wkleilem tylko ta czesc ktora nie dzial... program sie ladnie kompiluje i dziala wszystko oprocz przerwania i nie mam pojecia dlaczego . sprzetowo wszystko jest dobrze poniewaz po zapisaniu innego programu korzystajacego z rs232 ale bez przerwan wszystko ladnie smiga...

    Poprawiłem tytuł - regulamin p.11.1
    [zumek]
  • REKLAMA
  • #2 5835085
    antrykot
    Poziom 20  
    	UCSRB = ( 1 << RXEN ) | ( 1 << TXEN ) | ( 1 << RXC );
    

    Prawdopodobnie bit RXCIE jest źle zdefiniowany. Też sie ostatnio na to złapałem :)
  • REKLAMA
  • #3 5835211
    bartekb3
    Poziom 10  
    wobec tego co proponujesz?
  • REKLAMA
  • #4 5835278
    antrykot
    Poziom 20  
    Jak napisałem wyżej - RXC, albo zobaczyć w dokumentacji który to bit i wpisać ręcznie zamiast makra.
  • REKLAMA
  • #5 5835586
    dawid512
    Poziom 32  
    Spróbuj z taka inicjalizacją:
    
    
    #define F_CPU		8000000 	//częstotliwość zegara w Hz
    #define UART_BAUD	9600	   	//prędkość transmisji
    #define UART_CONST	(F_CPU/(16ul*UART_BAUD)-1)
    
    
    void UART_init(void)
    {
      // ustaw prędkość transmisji
      UBRRH = (unsigned char)(UART_CONST >> 8);
      UBRRL = (unsigned char)(UART_CONST & 0xFF);
      // załącz odbiornik i nadajnik
      UCSRB = _BV(RXEN)|_BV(TXEN)|_BV(RXCIE);
      // ustalenie formatu ramki: 8bit, 2 bity stopu
      UCSRC = _BV(URSEL)|_BV(USBS)|_BV(UCSZ1)|_BV(UCSZ0);
     
    }


    Oraz takim przerwaniem:
    SIGNAL(SIG_USART_RECV)
    {
      UDR=UDR;
    }


    To co odbierze powinno wysłać z powrotem do PC.
  • #6 5835639
    bartekb3
    Poziom 10  
    ok - nie zauważyłem:) poprawilem ale dalej nie chodziilo.. wiec wrocilem do stanu poprzedniego... i odziwo działa... nie wiem czego to była wina ale temat uwazam za zamknięty:) wszystkim chcąym pomóc dziekuje
REKLAMA