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

problem z transmiją przez RS-a 232

desmo999 02 Paź 2009 13:51 1148 4
REKLAMA
  • #1 7082352
    desmo999
    Poziom 12  
    Witam,

    Panowie pomóżcie mi z moim problemem bo już mnie powoli wykańcza:) Otóż zabrałem się za budowę serwonapędu z silnikiem DC. Nie ukrywam miałem trochę przerwy z programowaniem AVR i pewnie stąd mój problem. Oto funkcja wysyłająca dane do kompa
    
    void wyslijtekst(prog_char *str)
    { 
      
      char znak;
      sbi(UCSRB,TXEN);//wlaczenie nadajnika
      while(0!=(znak=pgm_read_byte(str++)))
      {
       	  PORTD|=1<<PD6;
          UDR=znak;  
          
       }
    


    a tutaj wywołanie tej funkcji

    
         if(komenda=='l')
    		{
      	    
          		 wyslijtekst(PSTR("test"));
    	    
    		} 


    dobra i teraz do sedna sprawy.Może mi ktoś wytłumaczyć dlaczego na kompie jak chcę wysłać napis "test" pojawiają mi się tylko 2 literki "te" i tyle. Próbowałem to zrobić również na przerwaniach ale mi program w ogóle nie chciał wejść w przerwanie mimo ustawionego bitu TXCIE i TXEN i wpisaniu pierwszego znaku do UDR.
    Procek to ATtiny 2313

    Proszę o podpowiedź i pomoc.
    Dziękuję
  • REKLAMA
  • #2 7082370
    loocasm
    Poziom 15  
    Proponowałbym sprawdzać bit UDRE w rejestrze UCSRA, tak jak zaleca DataSheet na stronie 122
  • REKLAMA
  • #3 7082375
    markosik20
    Poziom 33  
    Przed wpisaniem następnego bajtu do UDR musisz sprawdzić czy poprzedni został już wysłany.
  • REKLAMA
  • #4 7082407
    desmo999
    Poziom 12  
    Sprawdzałem już to zgodnie z notą katalogową i identycznie mi się to zachowywało. Spróbuję z tym bitem UDRE co kolega loocasm wspomniał.

    Dzięki za szybką reakcję.

    Dodano po 2 [minuty]:

    no tak tylko to UDRE to jest właśnie to sprawdzanie:)
    
    while ( !( UCSRA & (1<<UDRE)) )
    


    niestety po użyciu tej instrukcji identycznie się program zachowuje
  • #5 7102845
    desmo999
    Poziom 12  
    Oki uznaję temat za zamknięty. Wina lezy po stronie AVR studio , po wykasowaniu i wgraniu na nowo wszystko zaczęło działać:] chyba wirusy trochę narozrabiały .

    Podaję dobry kod - może się komuś na coś przyda.
    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
    
    
    #define FCPU 4000000 //czestotl oscylatora
    #define BAUD 2400
    //cunsigned long VUBRR = (FCPU/(16*BAUD))-1;
    
    
    
    #include <avr\io.h>
    #include <stdio.h>
    #include <inttypes.h>
    #include <avr\pgmspace.h>
    
    #include<avr\interrupt.h>
    char volatile komenda;
    char volatile fodbznak;
    char *rejestr;
    ISR(USART_TX_vect)
    {
       komenda=UDR;
     
       }
    
    
    
    
    ISR(USART_RX_vect)
    {
       komenda=UDR;
     
       }
    
    
    void wyslijtekst(char *tekst)
    
    {
      rejestr=tekst;
      sbi(UCSRB,TXEN); // wlacz nadajnik
      char znak;
        while(0!=(znak=pgm_read_byte(rejestr++)))
    	 {
    	  while ( !( UCSRA & (1<<UDRE))){}
    	  
    	  UDR=znak;
    	  komenda='b';
    	  
    	  
    	  
    	  }
      // cbi(UCSRB,TXEN);
        
      }
    
    
    
    void czekaj (unsigned long zt)
    
     {
       #define tau 10.38
       //int zt1;
       for(;zt>0;zt--)
          {
           //for(zt1=0; zt1<255; zt1++);
          //{
           asm("nop");
            //     }
           }
      }
     
     int main(void)
     {     
    
    
    
    
       DDRB=0xff;
       PORTB=0;
    
       sbi(DDRD,6);
     
       sbi(DDRD,2);
       sbi(PORTD,2);
    
       TCCR1A=1<<COM1A1|1<<1<<WGM10;
       TCCR1B=1<<CS11|1<<CS10;//
    
       TCNT1L=0x00;//wstepne ustawienie wartosci
       TCNT1H=0x00;
    
       UBRRH=(25>>8);
       UBRRL=25;
       UCSRB=1<<RXCIE|1<<TXCIE|1<<RXEN;
       UCSRC =1<<UCSZ1 | 1<<UCSZ0;
       sei();
     
    
    
    
    
     while(1)
     {
       
       
          if(komenda=='q')
          {
            sbi(PORTD,6);
    	    }
    
    
           if(komenda=='w')
            {
             cbi(PORTD,6);
                  }
           
    	   
    	   if(komenda=='a')
    	    {
    		  komenda='b';
    	      wyslijtekst(PSTR("czy sie uda?"));
    		
    			  }     
    
    
    
         }
           
    
    
    }


    Pozdrawiam i zamykam temat
REKLAMA