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

ZL3AVR ATmega32 USART - wysylanie dziala, odbior nie

ailpein 19 Gru 2010 02:46 1698 5
REKLAMA
  • #1 8886364
    ailpein
    Poziom 10  
    Witam,

    Od niedawna jestem szczesliwym posiadaczem zestawu ZL3AVR z Atmega32.
    Podczas proby uruchomienia komunikacji Atmega <=> PC (za posrednictwem adaptera Prolific Technology, Inc. PL2303 Serial Port).

    Udaje mi sie wysylac dane (otrzymuje w terminalu komunikat "Witam!").
    Natomiast wogole nie dziala mi przerwanie USART_RXC_vect.

    Czestotliwosc taktowania to 16MHz.
    Moj kod ma za zadanie, jedynie zapalic leda w momencie otrzymania jakiegokolwiek sygnalu.



    
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include<util/delay.h>
    
    ISR(USART_RXC_vect)     {
            PORTB |= _BV(0);
            }
    
    void USART_Init(void)   {
            UCSRA |= _BV(U2X);
            UBRRH = 0;
            UBRRL = 207;
            UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
            UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
            }
    
    void USART_Transmit(uint8_t dane)       {
            while((UCSRA & (1<<UDRE)) == 0);
            UDR = dane;
            }
    
    void send_string(const char *tekst)
    {
            while(*tekst)
                    USART_Transmit(*tekst++);
    }
    
    int main(void)  {
    
            USART_Init();
            sei();
    
            DDRB |= _BV(0);
    
            send_string("Witaj!");
    
            for(;;)
    
            return 0;
            }
    
    


    Wejscie RxD mam polaczone z RxD uC poprzez zwarcie pinow JP4.

    Jest juz dosc pozno, a ja nie wiem co jest grane. Moze ktos mial podobne doswiadcznia?

    Z gory dziekuje za pomoc.
  • REKLAMA
  • Pomocny post
    #2 8886547
    BoskiDialer
    Poziom 34  
     for(;;) 
    
      return 0;

    Zbytnio poprawna ta pętla nieskończona nie jest: w pierwszej iteracji nastąpi wyjście z funkcji main. Jeśli dobrze pamiętam, to po wyjściu z main następuje automatyczne zablokowanie przerwań oraz wejście do pętli nieskończonej. Żeby nie być gołosłownym, fragment jakiegoś kodu po skompilowaniu:
    000000b2 <.do_clear_bss_start>:
      b2:	a7 34       	cpi	r26, 0x47	; 71
      b4:	b1 07       	cpc	r27, r17
      b6:	e1 f7       	brne	.-8      	; 0xb0 <.do_clear_bss_loop>
    // wejście do main
      b8:	c4 d4       	rcall	.+2440   	; 0xa42 <main>
    // po wyjściu z main następuje skok do _exit
      ba:	2f c7       	rjmp	.+3678   	; 0xf1a <_exit>

    00000f1a <_exit>:
    // po wejściu do _exit następuje zablokowanie przerwań
     f1a:	f8 94       	cli
    
    00000f1c <__stop_program>:
    // pętla nieskończona
     f1c:	ff cf       	rjmp	.-2      	; 0xf1c <__stop_program>
    

    Błąd generalnie w braku średnika przy pętli nieskończonej. Później ujawni się problem, że przerwanie od USARTU będzie się wykonywać w nieskończoność, co będzie efektem nie odczytywania UDR'a po wystąpieniu przerwania.
  • REKLAMA
  • #3 8886632
    herbutt
    Poziom 11  
    Tak przy okazji zestawu ZL3AVR zapytam. Dostałem w prezencie samą płytę zestawu. Naradzie programuje w Bascomie i przesiadam się powoli na C. Czy programator AVTPROG1 PROGRAMATOR AVR ISP/USB STK500V2 z oferty AVT będzie dobry?
  • REKLAMA
  • #4 8886737
    mirekk36
    Poziom 42  
    herbutt napisał:
    Czy programator AVTPROG1 PROGRAMATOR AVR ISP/USB STK500V2 z oferty AVT będzie dobry?


    Pewnie będzie dobry, tylko że na allegro stk500v2 dostaniesz o połowę taniej.
  • REKLAMA
  • #5 8887051
    ailpein
    Poziom 10  
    BoskiDialer bardzo dziekuje za wskazanie bledu. Brak srednika najwidoczniej jest efektem poznej pory ;-).

    BoskiDialer napisał:

    Błąd generalnie w braku średnika przy pętli nieskończonej. Później ujawni się problem, że przerwanie od USARTU będzie się wykonywać w nieskończoność, co będzie efektem nie odczytywania UDR'a po wystąpieniu przerwania.


    Nie bardzo rozumiem to o czym piszesz pod koniec.
    Mozesz mi wyjasnic jaki nowy problem pojawi sie pod koniec i jak temu zaradzic?

    Z gory dziekuje
  • #6 8892512
    ailpein
    Poziom 10  
    Sprawa sie wyjasnila, zle mialem zainicjalizowane przerwanie.
    Zamiast "=" powinno byc "|=". Moje gapiostwo.

    Dziekuje za zainteresowanie i pomoc.
REKLAMA