foghíj

Nya'ri Viktor office at flexelec.hu
Mon Jul 19 08:47:34 CEST 2004


Ennyivel tudok segiteni; anno ezt az UART vétel témát jól körüljártuk, 
és így írtam meg az alábbi két fv.-t; hibátlanul ment. Elég jól van 
kommentezve; csemegézzél. Tudom, sokminden plusz is van benne, de 
hibátlanul működött.

V.
----------------------------------------------------------------------
//******************************************************************************************//
//* UART_RX interrupt kiszolgalo fuggveny 
                    *//
//* MEGHIVAS: interrupt hivja (ha RCIF bit=1) 
                    *//
//* BEMENO PARAMETEREK:     --- 
                    *//
//* KIMENO PARAMETEREK:     --- 
                    *//
//* RETURN:                 VOID 
                    *//
//* GLOBALIS VALTOZOK/LITERAL ERTEKEK: 
                    *//
//*     rx_fifo_max_range   LITERAL  1..egybefuggo_szabad_RAM_terulet 
                    *//
//*         (ez a LITERAL ertek adja meg az rx_fifo[] vektor meretet) 
                    *//
//*     rx_fifo_piece       BYTE     0..rx_fifo_max_range 
                    *//
//*         (rx_fifo-ban hany db. adat /byte/ van) 
                    *//
//*     rx_fifo[]           BYTE VEKTOR 
                    *//
//*         (rx veteli puffer) 
                    *//
//*     rx_fifo_in          BYTE     0..rx_fifo_max_range 
                    *//
//*         (egy uj adat erre a poziciora kerul az rx_fifo-ban) 
                    *//
//*     rx_fifo_out         BYTE     0..rx_fifo_max_range 
                    *//
//*         (az adatot errol a poziciorol vesszuk ki az rx_fifo-bol) 
                    *//
//*     error_int           BYTE     0..255 
                    *//
//*         (interrupt rutinokban fellepo hiba kodja) 
                    *//
//*     rx_fifo_empty       BIT      0..1 
                    *//
//*         (jelzi, ha rx_fifo ures; erteke=1, ha rx_fifo_piece=0) 
                    *//
//*     rx_fifo_data_lose   BIT      0..1 
                    *//
//*         (jelzi, ha rx_fifo tulcsordult; erteke=1, ha adatvesztes 
volt)                 *//
//* LOKALIS VALTOZOK:       --- 
                    *//
//* HASZNALT SAJAT FUGGVENYEK: 
                    *//
//*                         --- 
                    *//
//* HIBAKODOK: 
                    *//
//*     error_int=1         hiba az interrupt kiszolgalas kozben 
                    *//
//* LEIRAS: Ha UART(Rx)-en erkezik egy byte, akkor interrupt 
generalodik.                  *//
//*         RCIF bit beall 1-be, es a vezerles az rx_fifo_push() 
fgv.-nek                  *//
//*         adodik at. Itt ellenorzi, hogy RCIF tenyleg ==1; ha nem, 
                    *//
//*         error_int-ben jelzi, es kilep. Egyebkent RCREG-bol bevesz 
egy                  *//
//*         byte-ot, majd beteszi rx_fifo[]-ba rx_fifo_in poziciora. 
                    *//
//*         Ha rx_fifo[] tele volt, akkor az uj adatot beteszi, de a 
                    *//
//*         legregebbit kitorli (allitja ar rx_fifo_out erteket); jelzi 
                    *//
//*         az rx_fifo_data_lose biten az adatvesztest. 
                    *//
//******************************************************************************************//

#INT_RDA
rx_fifo_push()
{
	if(rx_fifo_piece<rx_fifo_max_range)				//ha a fifoban max-nal kevesebb 
adat van
	{
		if(bit_test(pir1,5))					//ha RCIF==1
		{
			rx_fifo[rx_fifo_in]=getc();			//a fifoin altal mutatott helyre tegye 
be az erkezett karaktert
			if(rx_fifo_in>=rx_fifo_max_range-1) {rx_fifo_in=0;}	//ha a fifo vegen 
van a pointer,akkor ugorjon az elejere
			else {rx_fifo_in++;}				//egyebkent ugorjon egyet
			rx_fifo_piece++;				//novelje a darabszamot
			rx_fifo_empty=0;				//fifo mar nem ures
		}
		else							//ha RCIF==0
		{
			bit_set(error_int,0);				//error-int.0=1
			return(error_int);				//terjen vissza hibaval
		}
	}
	else								//ha fifoban max. vagy annal tobb elem van
	{
		rx_fifo_data_lose=1;					//jelezze az adatvesztest
		if(rx_fifo_out>=rx_fifo_max_range-1) {rx_fifo_out=0;}	//akkor leptesse 
megfeleloen a fifoout pointert
		else {rx_fifo_out++;}					//ezaltal elveszitve a legelso adatot
		rx_fifo[rx_fifo_in]=getc();				//a felszabadult helyre tegye be az 
ujonnan erkezettet
		if(rx_fifo_in>=rx_fifo_max_range-1) {rx_fifo_in=0;}	//ha a fifo vegen 
van a pointer, akkor ugorjon az elejere
		else {rx_fifo_in++;}					//egyebkent ugorjon egyet
		rx_fifo_empty=0;					//fifo mar nem ures
	}
}
//--------------------------------------------------------------------------------------------



//******************************************************************************************//
//* Fifo sorbol adatkiemelo rutin 
                    *//
//* MEGHIVAS: int rx_fifo_pop() 
                    *//
//* BEMENO PARAMETEREK:     --- 
                    *//
//* KIMENO PARAMETEREK:     --- 
                    *//
//* RETURN:   a kiolvasott adattal ter vissza, kiveve ha hiba volt, 
akkor                  *//
//*           0-val 
                    *//
//* GLOBALIS VALTOZOK/LITERAL ERTEKEK: 
                    *//
//*     rx_fifo_max_range   LITERAL  1..egybefuggo_szabad_RAM_terulet 
                    *//
//*         (ez a LITERAL ertek adja meg az rx_fifo[] vektor meretet) 
                    *//
//*     rx_fifo_piece       BYTE     0..rx_fifo_max_range 
                    *//
//*         (rx_fifo-ban hany db. adat /byte/ van) 
                    *//
//*     rx_fifo[]           BYTE VEKTOR 
                    *//
//*         (rx veteli puffer) 
                    *//
//*     rx_fifo_in          BYTE     0..rx_fifo_max_range 
                    *//
//*         (egy uj adat erre a poziciora kerul az rx_fifo-ban) 
                    *//
//*     rx_fifo_out         BYTE     0..rx_fifo_max_range 
                    *//
//*         (az adatot errol a poziciorol vesszuk ki az rx_fifo-bol) 
                    *//
//*     error_general       BYTE     0..255 
                    *//
//*         (a hasznalt fuggvenyekben fellepo hiba kodja) 
                    *//
//*     rx_fifo_empty       BIT      0..1 
                    *//
//*         (jelzi, ha rx_fifo ures; erteke=1, ha rx_fifo_piece=0) 
                    *//
//* LOKALIS VALTOZOK: 
                    *//
//*     adat                BYTE     0..255 
                    *//
//*         (ebben tarolja az rx_fifo[]-bol kiolvasott byteot) 
                    *//
//*     gietemp             BIT      0..1 
                    *//
//*         (a GIE bit elozo ertekenek tarolasara) 
                    *//
//*     peietemp            BIT      0..1 
                    *//
//*         (a PEIE bit elozo ertekenek tarolasara) 
                    *//
//* HASZNALT SAJAT FUGGVENYEK: 
                    *//
//*                         --- 
                    *//
//* HIBAKODOK: 
                    *//
//*     error_general=65   ugy hivtak meg az rx_fifo_pop-t, hogy az 
                    *//
//*                        rx_fifo[] ures volt 
                    *//
//* LEIRAS: A fuggveny rogton elteszi a GIE, es a PEIE bit elozo 
erteket,                  *//
//*         majd letiltja azokat. Ezutan megnezi, hogy tenyleg van adat 
az                 *//
//*         rx_fifo[]-ban, ha nincs, hibat jelez az error_general-ban. 
Ha                  *//
//*         van, kiveszi az adatba, ha eppen most urult ki az rx_fifo[], 
                   *//
//*         a pointereket egymasra mozgatja, az rx_fifo_empty-ben jelzi, 
                   *//
//*         hogy ures lett az rx_fifo[]. A GIE es PEIE bitek erteket 
visz-                 *//
//*         szaallitja, majd visszater a hivas helyere az adattal. 
                    *//
//******************************************************************************************//

int rx_fifo_pop()
{
	int adat;
	short int gietemp,peietemp;

	adat=0;								//adat kinullazasa
	gietemp=gie;peietemp=peie;					//globalis es periferialis interrupt 
engedelyezo bit allapotanak eltetele
	disable_interrupts(GLOBAL);					//globalis es periferialis interrupt 
letiltasa
	if(rx_fifo_piece)						//ha van benne adat
	{
		adat=rx_fifo[rx_fifo_out];				//vegye ki a pointer altal mutatott helyrol
		rx_fifo_piece--;					//darabszam dekremantalasa
		if(rx_fifo_piece==0)					//ha most urult ki
		{
			rx_fifo_in=0;					//mozgassa a ket pointert
			rx_fifo_out=0;					//egymasra
			rx_fifo_empty=1;				//fifo ures
		}
		else							//ha nem urult ki
		{
			if(rx_fifo_out>=rx_fifo_max_range-1) {rx_fifo_out=0;}	//ha a pointer 
a fifo vegere mutatott,akkor mutasson az elejere
			else {rx_fifo_out++;}				//egyebkent ugorjon egyet jobbra
		}
	}
	else								//ha nem volt benne adat
	{
		error_general=65;					//!!!!!!!!!!!! jelezzen valami hibat
	}
	gie=gietemp;							//globalis interrupt elozo allapotanak visszatoltese
	peie=peietemp;							//periferialis interrupt elozo allapotanak 
visszatoltese
	return(adat);							//visszateres adattal
}

----------------------------------------------------------------------


Piszkos Fred wrote:
> Sziaztok Fijjug!
> 
> Jó volna ha valaki tudna segíteni egy olyan problémámban, hogy ccs 
> c-ben írt két programom soros kommunikációjában általam 
> ledönthetetlen falba ütköztem.
> Van két teljesen azonos felépítésű nyák. Az egyikben fut a master 
> program, a másikon a slave egy-egy PIC microvezérlőben.
> Utasítást küld a master, 3 bájtot egymás után. Ezt fogadja a slave, 
> válaszol is 3 bájtos csomaggal.
> Ez az esetek úgy 98%-ban tökéletesen működik. Azonban azt vettem 
> észre, hogy az elküldött 3 bájtból valamikor csak a 2., ill csak a 3. 
> érkezik meg, tehát olyan, mintha 
> időnként egy-két bájt nem érkezne meg a címzett oldalára.
> Az adatokat putc-vel küldöm a főprogramból // putc(p1);putc(p2);
> putc(p3);
> közvetlenül egymás után, adat érkezését pedig megszakítás jelzi 
> int_RDA, itt vett_adat=getc() után
> értelem szerűen az elsőként vett adat p1, a 2. p2, a 3. p3 lesz, majd a 
> számlálót nullázom
> 
> Ezen a megszakításom kívül még egy TMR0 megszakítás fut le időnként, 
> hogy a kártyák bemeneteit beolvassa a PIC
> Mondjuk ezzel már az elején is volt problémám, merthogy a ccs c ugye 
> alapból automatikusan állítgatja a TRIS biteket.
> PORTC:0 lábon van a bemeneteket beolvasó 74HC165 IC-k CLK lába. 
> Azt vettem észre, hogy azért nem olvas be az RX lábon semmit a 
> PIC, mert amikor TMR0-ban meghívja a 165-ös ICket kezelő 
> alprogramot, akkor utána kell egy 
> set_tris_c(128);			//ez csak azért kellett, mert ez után a read 165 
> után nem tudott beolvasni soros adatot
> pedig ezt semmi sem indokolná, már csak azért sem mert ez a program 
> a C port 0. és 7. lábát használja csak.
> 
> formátumnak az alábbit állítottam, és a proci PIC16F877, 20MHz-n
> #use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
> 
> Segítsetek! Én nem látok valamit? Vagy másképpen csinálnátok?
> Köszi: Fred
> 
> 




More information about the Elektro mailing list