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