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

[Atmega8] USART - problem z wysyłaniem kolejnych stringów.

vcd_a 22 Paź 2008 01:39 954 1
REKLAMA
  • #1 5656270
    vcd_a
    Poziom 18  
    Witam, właśnie przerabiam kolejne ćwiczenie z książki J. Dolińskiego, ale przechodząc do rzeczy...

    Chcę wysłać kolejno w pętli za pomocą funkcji "WyslijTekstROM" 3 kolejne stringi, jednak przy wysyłaniu pojawia się następujący problem, że tylko ostatni string wypisywany jest na terminalu cały, a 2 początkowe są poucinane. Sądzę, że problem może leżeć w tym, że nie czekam aż zostanie wysłany następny string, ale przyznam, że siedzę już nad tym od dobrych kilku godzin i mi już wszystkie członki opadają... ;/

    Oto kod programu:
    
    //------------------------------------------------------------------
    //
    //							USART_WinAVR
    //
    //------------------------------------------------------------------
    
    #include <avr/io.h>
    #include <avr/pgmspace.h>
    #include <avr/interrupt.h>
    
    #define cbi(add,bit) ((add) &= ~(1 << bit))
    #define sbi(add,bit) ((add) |= (1 << bit))
    char napis[] = "\n\rUSART_WinAVR\n\r";
    
    void usartInit(unsigned int baud);
    void WyslijTekstROM(char *tekst);
    void WyslijTekst(char *tekst);
    
    unsigned char romram;
    
    char *pfifosio;
    volatile unsigned char fodbznak;
    
    char komenda;
    
    ISR(USART_RXC_vect)
    {
    	komenda = UDR;
    	fodbznak = 1;
    }
    
    ISR(USART_TXC_vect)
    {
    	char znak;
    	
    	if(romram)
    		znak = 	pgm_read_byte(pfifosio++);
    	else
    		znak = *pfifosio++;
    		
    	if(znak != 0)
    		UDR = znak;
    	else
    		cbi(UCSRB, TXEN);
    }
    
    int main(void)
    {
    	unsigned char i;
    	
    	char *info[3] = {
    						PSTR("USART_WinAVR TEST\n\r"),
    						PSTR("',' - zapal diodke\n\r"),
    						PSTR("'.' - zgas diodke\n\r")
    					};
    					
    	
    	usartInit(12); // 12 => 38400bps @ 8MHz XTAL
    	sei();
    	
    	for(i = 0; i < 3; i++)
    	{
    		WyslijTekstROM(info[i]);
                    // Właśnie w tym miejscu Doliński pisze, że trzeba czekać, aż cały string zostanie wysłany, próbowałem while(bit_is_clear(UCSRB, TXEN)), ale nie daje żadnego efektu ;/
    	}
    	
    		while(1);
    }
    
    //------------------------------------------------------------------
    void usartInit(unsigned int baud)
    {
    	UBRRH = (unsigned char) (baud >> 8);
    	UBRRL = (unsigned char) baud;				// Set baud rate
    	
    	UCSRB = (1 << RXCIE) | (1 << TXCIE) | (1 << RXEN);
    	
    	UCSRC = (1 << URSEL)|(1 << USBS) | (3 << UCSZ0);	// Set frame format: 8data, 2stop bit
    }
    
    //------------------------------------------------------------------
    void WyslijTekstROM(char *tekst)
    {
    	romram = 1;
    	pfifosio = tekst;
    	sbi(UCSRB, TXEN);
    	UDR = pgm_read_byte(pfifosio++);
    }
    
    //------------------------------------------------------------------
    void WyslijTekst(char *tekst)
    {
    	romram = 0;
    	pfifosio = tekst;
    	sbi(UCSRB, TXEN);
    	UDR = *pfifosio++;
    }
    //------------------------------------------------------------------
    


    A to co mi wyświetla Realterm:
    
    
    U'.' - zgas diodke
    
    


    Dziękuję z góry za pomoc i pozdrawiam Krzysiek ;]
  • REKLAMA
  • #2 5656317
    skynet_2
    Poziom 26  
    strasznie żeś nakombinował

    ja wysyłam tak stringi

    void USART_Transmit_string( char *text )
    {
    while(*text)
      USART_Transmit(*text++);
    }
    
    void USART_Transmit( unsigned char data )
    {
    /* Wait for empty transmit buffer */
    while ( !( UCSRA & (1<<UDRE)) );
    /* Put data into buffer, sends the data */
    UDR = data;
    }
    


    edit: char *info[3] jednak działa[tablica na wskaźnikach], czyli błąd leży gdzie indziej.
    Analiza tego programu jest koszmarem, ale jeszcze spróbuje coś pokombinować.
REKLAMA