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

[M16][C] dziwny problem z UART wysyłanie znaków

mototest 02 Lut 2011 15:56 2137 11
REKLAMA
  • #1 9092611
    mototest
    Poziom 19  
    proszę o pomoc w takiej sprawie
    wysyłam liczby , lub stringi z jednego procka do drugiego
    drugi jest podłączony do terminala w komputerze , chcę spowodować żeby to co wysłał pierwszy procek odebrał ten drugi i to samo wysłał do terminala.

    Problem jest w tym, że jak odbieram znak w przerwaniu i zaraz wysyłam go jako echo to jest dobrze, ale jak zrobię UDR=znak w pętli main to wysyła <00> co jest powodem ?

    
    
    #include <avr/io.h> 
    #include <avr/interrupt.h> 
    
    
    
    char znak;
    
    
     int main(void)
    
    {
     UCSRB = 0x00; //disable while setting baud rate
    	 UCSRA = 0x00;
    	 UCSRC = 0x86;	//8 bits data & 2 stop bits
    	//UART SPEED 19200 bs
    	UBRRL = 0x33; //set baud rate lo
    	UBRRH = 0x00; //set baud rate hi
     
     UCSRB |= (1 << RXEN) | (1 << TXEN);
    UCSRB |= (1 << RXCIE);
    sei();
    while(1)
    
    {
    
    UDR=znak;
    
    };
    
    
    
        return(0);
    }
    
    
    //-------------------------------ISR--------------
    ISR(USART_RXC_vect) 
    { 
        
       znak = UDR;
      //UDR = znak; 
    }
    
  • REKLAMA
  • #2 9092691
    tadzik85
    Poziom 38  
    To ze brak oczekiwania na odebranie znaku.
  • #3 9092702
    mototest
    Poziom 19  
    ale w przerwaniu czy w pętli ?
  • REKLAMA
  • #4 9092728
    tadzik85
    Poziom 38  
    w pętli a przerwanie w takim razie nie jest potrzebne
  • REKLAMA
  • #5 9092731
    mototest
    Poziom 19  
    ale ja chcę wysyłać w pętli odebrany znak z przerwania
    do tego jak napiszę UDR=109; to wysyła literę "m" czyli znak ASCII od litery m,
    tak jakby zmienna znak gubiła swoją wartość po wyjściu z przerwania.
  • REKLAMA
  • Pomocny post
    #6 9092787
    tadzik85
    Poziom 38  
    1. znak musi być typu volatile!!
    2. musisz oczekiwać aż znak zostanie odebrany i wysłać go tylko raz
  • #7 9092802
    mototest
    Poziom 19  
    tak volatile pomogło :)

    Dodano po 12 [minuty]:

    powiedz jeszcze dlaczego jak podaję string "test" zamiast pojedynczego znaku, to znowu w przerwaniu UDR=znak wysyła cały string, natomiast w pętli tylko jeden znak "t" ?
  • #8 9095181
    tadzik85
    Poziom 38  
    post wyżej pkt 2. plus zły algorytm wysyłania. samo udr=znak to za malo
  • #9 9095352
    hotdog
    Poziom 26  
    do rejestru UDR wpisujemy tylko pojedyncze znaki. Jak chcesz wysłać string to musisz wpisać pierwszy znak, poczekać aż bufor będzie pusty, wysłać drugi znak, poczekać itd...
  • #10 9096590
    mototest
    Poziom 19  
    OK, dzięki
    mam jeszcze pytanie, czy jest jakiś prosty sposób na przekonwertowanie dowolnej litery np char= "A" na kod ASCII = 65?
  • Pomocny post
    #11 9096662
    tadzik85
    Poziom 38  
    sposób jest i go nie ma 'A' = 65 "A" = {65, 0}
  • #12 9096690
    mototest
    Poziom 19  
    zatrybiłem :), chodzi o apostrof
    dzięki
REKLAMA