Fórum témák

» Több friss téma
Fórum » Soros port programozás
 
Témaindító: pakibec, idő: Márc 23, 2006
Témakörök:
Lapozás: OK   14 / 14
(#) scooby_ hozzászólása Okt 13, 2022 /
 
Sziasztok!

Nem gondoltam volna, hogy a sorosport programozás egy külön téma lehet, hátha itt többen tudnak választ adni.

Mikrovezérlőt szeretnék utasítani sorosporton keresztül. (Egyenlőre csak P16F877A-val próbálkozom)
RX oldalon megszakításban fogadok adatokat. Az adatfogadás akkor fejeződik be, ha megérkezik a $ karakter az adatsor végén (Pl.: abcd$). Minden egyes karaktert tömb változóban tárolok el, és mikor megérkezik a "$" karakter (if rxchar == 36) akkor törlöm a megszakítás bitjét, a számlálót, és 1-re billentek egy flag-et.
A problémám a beérkezett adat feldolgozásával van. Egyszerűen nem tudok rá kitalálni egy megfelelő logikát, hogy hogyan tudnék pl. "abcd$" karaktersornak megfelelően egy parancsot elvégeztetni - pl bekapcsolni egy kimenetet- a mikrovezérlővel?

Próbálkoztam azzal, hogy a beérkezett karaktesor minden karakterének decimális értékét összeadtam, és ha az összeg egyenlő volt, akkor kapcsoltattam a kimenetet, de ez nem működött, nem történt semmi.

MikroC Pro For Pic a fejlesztő környezetem, a kódjaim C-ben íródnak.
(#) kissi válasza scooby_ hozzászólására (») Okt 13, 2022 /
 
Szia!

C-ben egy vett tömb elemeit egyesével összehasonlítva egy for ciklus segítségével egyezőségnél indíthatod az adott feladatot...
Vagy a vett karaktereket switch-case szerkezettel feldolgozod ( if-else if szerkezettel)...
A MikroC általad említett fejlesztőkörnyezetét és C-jét nem ismerem, de valószínű, hogy string-ként használva van arra függvény, hogy összehasonlítsd az általad kívánttal...
Hirtelenjében ezek jutottak eszembe.
(#) scooby_ válasza kissi hozzászólására (») Okt 13, 2022 /
 
Szia!
Köszönöm szépen! Vannak emlékfoszlányaim, hogy valami hasonlót csináltam már a közelmúltban. Per pillanat azon is elgondolkodtam, hogy az egyesével való összehasonlítgatást mivel tudnám egyszerűsíteni. De akkor valószínűleg semmivel, és maradni kell ennél a módszernél.
Próbáltam rákeresni google segítségével "uart command processing"-re, de senki nem csinált ilyesmit, vagy legalább is nem találtam hasonló projektet. Mindenki csak 1-2 sorban visszaküldte az adott karaktert amit beküldött, vagy konkrét portot közvetített pic-kel egy másik picnek.
(#) kzozo válasza scooby_ hozzászólására (») Okt 13, 2022 /
 
Idézet:
„Minden egyes karaktert tömb változóban tárolok el, és mikor megérkezik a "$" karakter (if rxchar == 36) akkor törlöm a megszakítás bitjét”

Tehát a megszakítás bitjét nem törlöd minden beérkezett byte után?
(#) Bakman válasza scooby_ hozzászólására (») Okt 13, 2022 /
 
Fogsz öt változót, legyenek: a, b, c, d, e. Az 'a' az MSB, az 'e' az LSB.

Bekapcsolod az RX megszakítást. Megszakításban a változók értékeit eltolod balra és az utolsóba beleírod az aktuálisan vett bájtot.

a=b;
b=c;
c=d;
d=e
e=RCREG;

Ha az 'e' értéke 36, akkor az a, b, c, és d változók tartalmazzák az adatot.

Minden kapott byte után töröld a megszakítás jelzőbitjét, különben nem fog újra lefutni a megszakítási makró.

Fenti módszer, a kontroller órajelétő függően, sok bájt vételére nem alkalmas, a tologatás is időt vesz igénybe. 8 bájt eltolása (más időt nem számolva bele), 8 MHz-es órajel esetén 8-10 µs.
(#) scooby_ válasza kzozo hozzászólására (») Okt 13, 2022 /
 
Nem, csak a vétel legvégén. Illetve van egy "timeout" is beállítva.
  1. void interrupt () {            // Megszakítási ciklus.
  2.  unsigned timeOut = 0;
  3.  while (timeOut < 20000){
  4.   if (RCIF_bit) {              // Ha a megszíktás az RCIF-től jön...
  5.     rxchar = Uart1_Read();     // Az UART-ból érkező adatot betöltjük "rxchar" változóba...
  6.     rxarray[i] = rxchar;      // Az "rxchar" változó értékét letároljuk rxarray[i] tömbváltozóban a további feldolgozásig...
  7.     i++;
  8.     timeOut = 0;                       // "i" értéke minden beérkező karakter után 1-gyel nő.
  9.  
  10.  
  11.     if (rxchar == 36) {
  12.       flag = 1;                       // Flag bit átbillentése a további feldolgozáshoz, ha a "$" karakter megérkezett.
  13.       RCIF_bit = 0;            // RCIF_bit törlése...
  14.       }                        // if (rxchar == "$") ciklus vége...
  15.   }                            // if (PIR1.RCIF_bit) ciklus vége...
  16.   timeOut++;
  17.  }
  18.   if(timeout >= 20000 && flag == 0){
  19.    for (i = i; i = 0; i--){
  20.    rxarray[i] = 0;
  21.    }
  22.    i        = 0;
  23.    RCIF_bit = 0;
  24.    flag     = 2;
  25.  
  26.   }
  27. }                               // interrupt() ciklus vége...
(#) kzozo válasza scooby_ hozzászólására (») Okt 13, 2022 /
 
Ez így nem jó. Ha a megszakításrutinban marad a szoftver, nem derül ki hogy érkezik új adat.
(#) scooby_ válasza kzozo hozzászólására (») Okt 13, 2022 /
 
Így, ahogy átnézem a kódot, igazad van. RCIF_BIT-et While ciklusba tettem aminek a feltétele, hogy timeout < 20000. Viszont így nem minden Uart adatra, hanem minden újabb while utasításciklusra törlődik a timeout. A megszakítás pedig bennmarad végig. Lényegében a Timeout-nak így nem sok értelme van. Javítom.
(#) scooby_ válasza Bakman hozzászólására (») Okt 13, 2022 /
 
Köszönöm szépen!
Hasonló a megoldásom. Kicsit más. De már működik! Még finomítok rajta, hogy a megszakítás is lefusson mindig.
(#) scooby_ válasza scooby_ hozzászólására (») Okt 13, 2022 /
 
Végül javítottam a kódot, remélhetőleg.
Így már tudom az adatot is feldolgozni.
Írtam feltételt arra, ha nem érkezik meg a $ karakter, iletve írtam feltételt arra is, ha megérkezik, de a parancs nem értelmezhető. Lehet, hogy kicsit túl lett bonyolítva, viszont működik eddig.
(#) pipi válasza scooby_ hozzászólására (») Okt 13, 2022 / 1
 
Hali!
Lehet hogy működget, de ennek egy szépséghibája van, de az nagy. Megszakításban nem illik várakozni, hosszú időt eltölteni, mert ha több megszakításod van(lenne pl timer stb), akkor azok nem tudnak "időben" lefutni és akkor a főprogram mikor is fut???
Amíg a megszakításban várakozol a lassan csorgó soros karakterekre, addig a főprogram kismillió egyéb dolgot tud végrehajtani...

Kapsz egy soros megszakítást, elteszed a karaktert( vagy eldobod, akármi... esetleg jelzed hogy vég karakter jött, ) és azonnal visszadod a vezérlést a főprogramnak, a főprogram csinálja az egyéb dolgát, ha jelezted a vég karaktert, akkor a főprogram megcsinálja a hozzá tartozó kiértékelést.
(#) scooby_ válasza pipi hozzászólására (») Okt 14, 2022 1 /
 
Szia!
Ebben igazad van! Megakasztja a megszakítást. Viszont talán ebben az esetben eltekinthetünk ettől a ténytől, mert lesz még benne ugyan interrupt-on-change, viszont amíg az eszközre meg nem érkezik minden konfiguráció a soros porton, végén egy start paranccsal, addig az interrupt-on-change-et letiltom. Csak a start parancs után engedélyezem. Ameddig csak a sorosport megszakítása él, addig csak konfiguráció történik. Ami az eszköz és igazából a számomra illetve a főciklus számára is lényegtelen, hogy csak a végkarakter megérkezésével, vagy aközben is lefuttat-e pár főciklust. Mert végül is ha a parancs hibás, vagy nem értelmezhető, azt már úgy is a főciklusban elemezem ki, és küldök vissza információt. Itt most igazából nincsen olyan egyéb dolog amit a mikrovezérlőnek a konfigurálás alatt el kéne végeznie. A konfigurálás után lesz majd neki dolga, hogy encodertől fogadjon gray kódot, abból számoljon, és megfelelő step inpulzust küldjön a léptető motornak. Viszont amikor már a léptetőmotor és az encoder dolgozik, ott már nincs soros kommunikáció direkt azért, hogy minél pontosabb legyen a rendszer. Így mindig csak 1 feladatsort kell a mikrovezérlőnek elvégeznie.
Következő: »»   14 / 14
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem