[AVRGCC] USART - obsługa odbioru

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
MichalZ
-
Posty: 40
Rejestracja: 10 gru 2008, 15:16
Lokalizacja: Kraków
Kontakt:

[AVRGCC] USART - obsługa odbioru

Post autor: MichalZ » 23 paź 2009, 19:14

Witam, chcę napisać program, który po wysłaniu mu przez terminal nazwy pliku odczyta ten plik i wyśle na RS232.
(Używam wersji WinAVR 20040404 - gdyż pod nią poprawnie działa biblioteka do obsługi dysku)
Urządzenie działa poprawnie, czyli czyta pliki, zapisuje itp. ale z kodem męczę się od jakiegoś czasu i nic ciekawego dotychczas nie uzyskałem.
Fragment kodu: (na prośbę zamieszczę co trzeba)

Kod: Zaznacz cały

void UARTReceiveString(void)
{
unsigned char i=0;

do
{

if ((bufor[i] = uart_getc()) == '\n') ReadHDD(); printf_P(PSTR("WORK")); break; //dodaje odebrane znaki do tablicy, jesli odbierze '\n' to przerywa petle, wychodzi z funkcji i uruchamia odczyt pliku.

i++;

}while (i < 32); // zeby nie przepelnic bufora

}

		void ReadHDD(void)
		{
			if (farq = fatFopen(bufor)) {  //Otwiera plik
			printf_P(PSTR("\r\nReading file...\r\n"));
			while(!fatFeof(farq)) {  //Petla odczytuje znaki
			printf_P(PSTR("%c"), fatFgetc(farq)); //Wyswietla je
			}
			fatFclose(farq); //Zamkniecie
			} else { printf_P(PSTR("Nie mozna otworzyc")); }
		}

int main(void)
{

	

	


	mcuInit();							// start ATMega32
	fdevopen(uart_putc, uart_getc, 0);	// configure printf to send data to serial port

	printf_P(PSTR("ODCZYT PLIKOW\r\n"));
	
	ataInit();	// Start ATA
	fatInit();	// Start FAT
	
	fatCddir("pliki");  //Wchodzi do folderu pliki
	printf_P(PSTR("PLIKI\r\n")); 
	dir_serial(fatGetCurDirCluster()); //Wyswietla listing plikow (funkcja biblioteki)
	printf_P(PSTR("Podaj nazwe pliku (np. plik.txt) do odczytania\r\n"));
	

        /*Tu jest cos nie tak - proba zrobienia aby program czekal na przeslanie danych i uruchamial funkcje "USARTReceiveString()" ktora do tablicy bufor laduje kolejne znaki.
*/
	while(1) {
	if (uart_getc()) {
	UARTReceiveString();
	printf_P(PSTR("cos odebrano"));
        //opcjonalnie break;
	}
	}
}
Na terminalu wyświetla się w kółko "cos odebrano".
(Skąd to się niby bierze?)
Może ma ktoś jakiś prosty przykład działającego odbierania? Szukałem, ale to co znalazłem próbowałem zaimplementować, lecz z marnym skutkiem...
Dziekuje za pomoc.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 23 paź 2009, 20:18

Zrób odbiór w przerwaniu:

Kod: Zaznacz cały

ISR(SIG_UART_RECV)
{ 
   unsigned char c;
   
   c = UDR;
}
oczywiście musisz w rejestrze ustawić żeby reagował na przerwania od RX'a. To odbiera pojedynczy znak więc musisz dorobić składanie w łańcuch jeśli chcesz odbierać całe ciągi znaków.

MichalZ
-
Posty: 40
Rejestracja: 10 gru 2008, 15:16
Lokalizacja: Kraków
Kontakt:

Post autor: MichalZ » 23 paź 2009, 21:57

Próbowałem... ale nic z tego, nawet nie chce wywoływać przerwania.
Tutaj kompletny kod -> http://serwer123.ddl2.pl/files/main.c
Może będzie ktoś wiedział co jest nie tak?

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 24 paź 2009, 8:20

Jeszcze podaj na jaki to procesor.

Jeśli chciałbyś spróbować skompilować to pod najnowszym WinAVR to spróbuj też dodać <compat\deprecated.h>. Zawiera on funkcje które zostały wyparte przez nowsze.

MichalZ
-
Posty: 40
Rejestracja: 10 gru 2008, 15:16
Lokalizacja: Kraków
Kontakt:

Post autor: MichalZ » 24 paź 2009, 10:37

snow pisze:Jeszcze podaj na jaki to procesor.
ATmega32
Jeśli chciałbyś spróbować skompilować to pod najnowszym WinAVR to spróbuj też dodać <compat\deprecated.h>. Zawiera on funkcje które zostały wyparte przez nowsze.
Kompiluje się nawet bez tego :mrgreen:
Ale nadal nic się nie zmienia :neutral:
//EDIT
Zaktualizowany kod:
http://serwer123.ddl2.pl/files/main.c
Lecz nadal nie działa :mad:

[ Dodano: 2009-10-25, 23:47 ]
A więc kolejne obserwacje:
dopisałem wzór:

Kod: Zaznacz cały

#define F_CPU		8000000 	//częstotliwość zegara w Hz
#define VUART	57600	   	//prędkość transmisji
#define UART_CONST	((F_CPU/(VUART*16))-1)
a wszystko co dotyczy UART'a:

Kod: Zaznacz cały

	UCSRA=0x02;
	UCSRB= (1 << RXCIE)|(1<< RXEN)|(1<<TXEN);
	UCSRC=0x06;
	UBRRH=0x00;
	UBRRL=UART_CONST;
Odbieram jakieś śmieci... co jest nie tak?
Rezonator wew. 8MHz.

ODPOWIEDZ