Soros port (rs232)

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

HozzászólásSzerző: zb83 » 2012. augusztus 2. csütörtök, 15:02

Sziasztok,
Egy elméleti kérdésem lenne csak. A következő a feladat:

HW Uart-on keresztül adatot fogadni úgy, hogy az adatcsomag hossza nem ismert, az adatcsomag bináris, mindig ugyanazzal a start bájttal kezdődik, de ezt a startbájtot mint adat is tartalmazhatja a csomag, szóval egy csomagon belül többször is előfordulhat.

Én elsőre úgy csinálnám, hogy megszakításra indítanám az adatfogadást.
Az int rutinban lenne egy loop, ami addig futna, amíg az IsCharwaiting=1. A loop-on belül inkey kiolvasna egy byte-ot, majd waitus-el az adott sebességnek megfelelően, egy bájtnyi időt várakoznék. Így a csomag utolsó bájtja után a loop megszakad, mert az IsCharwaiting 0 lesz.
Szerintetek ez jó?

Ti hogy csinálnátok?

Üdv,
Zoli

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9964
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. augusztus 2. csütörtök, 15:48

Nem jo:
gyorsabban olvasod ki, minthogy jon adat... (annyit varok ami 1 adat ideje: pont lekesed. Legyen 3 byte ideje:)


Nalam:

Kód: Egész kijelölése

config serialin=buffered, size = 20 byte
    'HWes soros buffer 20-l novelve
dim eztdolgozdfel as string*254
    'ennel igaz nem hosszabb? Ha igen, akkor TOMBkent kell kezelni
dim var as byte
  'vartam mar?
do
if ischatwaitting()=0 then
   var =1  'nincs a bufferben adat
   waitms 2 '2 byte-nyi varakozas itt 9600 bps eseten
   else
   var=0 'van adat, lehet vinni:)
   a = inkey()
   eztdolgozdfel=eztdolgozdfel + a
endif
loop

A kapott binaris adat nem lehet: 0.
Ha ilyen elofordulhat, akkor csak byte alapu tombbe kezelheted!

Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

HozzászólásSzerző: zb83 » 2012. augusztus 2. csütörtök, 15:57

Az adatot egy byte tömbbe akarom fogadni, így jóval egyszerűbb feldolgozni is.

Na de az időzítés. Azért gondoltam egy bájtnyi időre, mert az igazából egy bájtnyi idő+ amit előtte a vizsgálgatással, kiolvasással mókolok. Azt gondoltam, ez elég. A 2 bájtnyi idő még logikusnak tűnik, de miért vársz 3 bájtnyi időt? Ennyire ráérsz? :D

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9964
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. augusztus 2. csütörtök, 16:53

2-3 byte-nyi idő:
- modbus?
- DMX512?
- adatok közt 2.5 bitidő a modbus valamelyik valtozataban a "szunetjel"

Raerek :)

Illetve tombbe tenyleg jobb. csak vigyazz, hogy atomb legyen az utoljara definialt valtozod! Igy ha "tulirod" akkor is csak ures teruletet irsz felul...

Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

HozzászólásSzerző: zb83 » 2012. augusztus 2. csütörtök, 17:06

Digi féle Xbee modullal van dolgom egyébként.

A tömböket általában úgy állítom be, hogy mindenképpen beleférjen az, aminek bele kell férnie. :) Huh ez egy kicsit furcsán hangzott.. :D
Emellett a tömböket mindig úgy kezelem, hogy van melléjük egy számláló is, ami azt mutatja, hogy mennyire van tele az adott tömb. Ha valamiért még sem tudom biztosítani azt, hogy tömb mérete megfelelő legyen, akkor a tömbbe való írás előtt mindig ellenőrzöm, hogy megtelt-e. Ha megtelt és írni akarok bele, akkor gubanc van. Ilyenkor csak hibát kell kezelni. Ha viszont ez a mechanizmus hiányzik, akkor kezdődhet az éjszakába nyúló debug.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9964
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. augusztus 2. csütörtök, 17:14

OK szívatás:
- 17 byte max az 1 blokk.
- utána 5-8 karakter szünet
- utána jön a köv max 17 byte adat

-> adatlapban valamerre benne van.
Ez persze csak a Pont-Pont kapcsolatosan igaz. A szórt üzenetes rosszabb:(

Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

HozzászólásSzerző: zb83 » 2012. augusztus 2. csütörtök, 17:27

Neee. Ez komoly?
Átnyálaztam már az adatlapot, bár inkább az API-ra koncentráltam. Rémlik ez a 17byte, de olyasmire emlékszem, hogy modul felé történő küldés esetén ha már csak 17byte szabad a modul bufferében, akkor a CTS-en jelzi, hogy meg kéne állni a küldéssel. Nem emlékszem olyanra, hogy darabolná az üzeneteket. Annak nagyon nem örülnék...

Estére megint átolvasom a vonatkozó részeket.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9964
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. augusztus 2. csütörtök, 17:46

Kipróbálva. 17. byte után küld, de a 18..24 eldob!

CTS-t nem figyelem...
Belső puffere nincs igazán, SW sorosportra van kihozva a Tx/Rx :(

Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

HozzászólásSzerző: zb83 » 2012. augusztus 2. csütörtök, 18:45

Jól értem ugye, hogy nem API módban próbáltad, hanem "drót" módban. API módban magának a modulnak is teljes üzenetre van szüksége ahhoz, hogy tudjon egyáltalán kezdeni vele valamit.
API móddal tapasztalat esetleg?

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9964
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. augusztus 2. csütörtök, 18:58

igen, eddig drót módban használtam....

Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

HozzászólásSzerző: zb83 » 2012. szeptember 23. vasárnap, 22:53

Sziasztok,

Kicsit tesztelgettem ezt a dolgot, hogy mennyit is kell várni az egyes bájtok kiolvasása előtt.
Én 57600-on próbálkoztam és azt tapasztaltam, hogy ha 2 bájtnyi időt, vagy annál többet várakozok, akkor annak adatvesztés a vége.

urxc triggereli az olvasást az UART ról, majd egy ciklusban ischarwaiting-el ellenőrzöm, hogy van-e kiolvasható adat. ha van, akkor inkey, majd waitus. ha nincs, akkor beérkezett az adott csomag összes bájtja.
Ahogy én tapasztaltam, az ideális várakozás valamivel kevesebb, mint egy karakternyi idő. A "valamivel kevesebb" meg pont annyi, amennyit kiolvasás előtt/után egyéb feladatokkal tölt a rutin. Ezek alapján én csodálkozom, hogy te nem vesztesz adatot.

Egyébként először úgy képzeltem el, hogy majd jól beállítom puffereltre a a portot, de sajnos ha használom a "Config Serialin = Buffered , Size = 20" megoldást, az lefoglalja magának az adott port megszakítását, én nem fogom tudni, ha új adat érkezett, ha csak nem nézegetem egyfolytában.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9964
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. szeptember 23. vasárnap, 23:12

Config serialin=... esetén van a bytematch=all
és a serialreceived0: cimke.

Ez azt teszi amit szeretnél....

Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

HozzászólásSzerző: zb83 » 2012. szeptember 23. vasárnap, 23:13

..és tényleg! :)
Köszi!

Avatar
TonyC
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2008. szeptember 5. péntek, 6:00

Re: Soros port (rs232)

HozzászólásSzerző: TonyC » 2013. február 26. kedd, 9:39

Sziasztok!

Építek egy áramkört, Atmega16-tal.
Soros portján kellene kommunikálnia PC-vel.
Nem akar működni,már írtam egy egysorost bascomban,hogy küldje ki a "TEST" szót,de erre sem hajlandó.
Programozni lehet,tehát megy a chip.

Sem usb-soros átalakítóal, sem PC soros port-max232 kombóval nem működik.

Amire a kérdésem pontosan irányul,az az,hogy ha összekötöm a PC-vel (rx-tx-gnd),akkor az 5 volt meglétét jelző led világít halványan.
Anélkül,hogy tápot adnék neki.
A PC felől érkező TX lábon levő feszültség visszapofázik az atmega tápfesz lábaira.
Szerintetek meghalt? Ilyet még nem láttam.

Ugyan ez mega8-al tökéletesen működik,mert mérgemben már egy másik áramkörön kipróbáltam a kommunikációt és azon ment.

Üdv.:TonyC!!!

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9964
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Soros port (rs232)

HozzászólásSzerző: Robert » 2013. február 26. kedd, 10:24

Tesztelés:

MAX232 sorosport:
- a kondenzátorok 1 uF-osak? 100 nF-t nem mindíg szereti.
- a 15/16 láb közt 100 nF kidagítőkondi van?
- MAX232 igaz nem MAX3232 ? ( :) )
- a PC oldalon a Tx/Rx jól van bekötve?
- MAX kimeneti 5V-s oldalán a Tx/Rx összeköt. Hiperterminálban látod a kiírt adatot?

FT232 USB-soros:
- 3V3 láb és a GND közt 33...100 nf hidagítőkondi ott van?
- VCCUSB és a VCCIO is be van kötve?
- Összes GND e van kötve?
- PC felismeri sorosportként ?:) (néha a USB illesztőjében a VCP-t ki kell pipálni, különben nincs sorosport!)
- Tx/Rx láb összeköt (1 és 5): hiperterminálba visszajön a jel?


AVR oldal:
- Tx a PC oldal RX-ével van összekötve és vica-versa?
- Az órajel jól van a chipen beállítva? Nem a belső 1 MHz-ről jár (teszt: 1 sec villogós prograot letöltest, és a LED a lábon tényleg 0,5 Hz-vel villog)
- Hiperterminal helyett használj Br@y terminált. És igaz nincs a HW-es illetve szoftveres kézfogás bekapcsolva a terminálon?
- Néha, ha megy a soros kommunikációs és ahhoz nyitsz portot -> hibás az első csomag és elrontja a többit!


Olyn kérdés, hogy tápok, szürőkondik, VCC/VCCA; GND/GNDA bekötve - fel sem merül...
Meg hogy a MAX232 fordítva van bekötve (nálam simán :P)


Vissza: “Bascom-AVR nyelvű programozás (AVR programozásának lehetőségei)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég