Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1139 / 1320
(#) DanyyX hozzászólása Okt 9, 2013 /
 
Sziasztok!

Van egy fejlesztésem PIC18F4520-as kontrollerrel és némi gondom támadt az I2C kommunikációval.
Assemblyben fejlesztek, az MSSP modult használom a kommunikáció vezérléséhez, a buszt 100kHz-en hajtom. A buszon a mikrovezérlő a master, rajta kívül két eszköz van, egy 24LC256-os EEPROM és egy MCP7940-es RTCC. A byte write és byte read mindkét eszközzel tökéletesen működik, a page write is ok, viszont a sequential read-del van egy olyan gondom, hogy 20 byte-ot még tudok olvasni egybe, de 21-et már nem. Ott akad el a dolog, hogy elküldöm az EEPROM-nak a control byte-ot, a címet, elkezdem olvasni a byte-okat és a végén amikor STOP-ot küldök a buszra, az MSSP modultól hiába várom a megszakítást, az életben nem érkezik meg... Nem tudom valaki találkozott-e már hasonló hibával, bemásoltam a kódból az ide vonatkozó részletet. Megköszönném, ha valaki vetne rá néhány pillantást és tudna mondani valami okosat!

Az I2C_DEBUG szubrutin csak annyit csinál, hogy az SSPSTAT, SSPCON1, SSPCON2 regiszterek értékét kiírja az LCD-re. Ezek az értékek egyébként még a STOP meghívása előtt normálisak SSPSTAT=0x88, SSPCON1=0x28, SSPCON2=0x20

A kódot fájlként csatoltam, mert érthetetlenné tördelte az oldal beépített szerkesztője

iic2.asm
    
(#) silent15 hozzászólása Okt 9, 2013 /
 
Sziasztok, már a korábban említett SainSmart 3.2" SSD1289 TFT kijelzővel elkezdtem foglalkozni,mégegyszer köszönöm a segítséget, még extra információ után kutakodva a neten, rátaláltam egy IC-re , amit az ilyesmi (nem ehhez volt) kijelzőkhöz lehet kötni, és akkor a mikrokontrollernek már csak ennek az IC-nek kell elküldeni azt, hogy mit akar kijelezni 1 pontba (tehát x,y 1 pontját lehet frissítgetni), ez nekem a mostani projectemhez sokkal ideálisabb lenne, nem tud valaki ilyen IC-t ajánlani, amit viszonylag könnyű beszerezni, és nem egetrengetően drága?
Egyáltalán valamelyikőtök foglalkozott ilyennel?
ÜdV!
(#) DanyyX válasza DanyyX hozzászólására (») Okt 15, 2013 /
 
Időközben megoldódott. A PIC18F4520-nak elég sok probléma van az MSSP moduljával (ld. errata). Ugyanazok a rutinok 18F46K22-vel hibátlanul mennek...
(#) eaglee71 hozzászólása Okt 17, 2013 /
 
Üdv Néktek!

Elnézést, ha nem bogarásztam eleget a fórumtémákban, de megkérdezem:
belefutottam egy problémába - 16F1459 saját flash /program memória/ használat (írás) kb. 80 % ban hibázik. debug, debug, downgrade, debug láss csodát, hibátlan míg alap órajelen ketyeg
amint megpörgetem USB kommunikáció miatt, újra ostobaságok történnek a flash területen. Az adatlap nem kényeztet, a 123-as TIW paraméter értékén kívül semmi...

Látott már valaki hasonlót?
(#) Hp41C válasza eaglee71 hozzászólására (») Okt 17, 2013 / 2
 
Olvasgatni kell az errata -t is.
(#) eaglee71 válasza Hp41C hozzászólására (») Okt 17, 2013 /
 
Kösz Hp41C! Ezt valahogy nem találtam... szopóka... az USB leakad, ha elveszem tőle a fordulatot... még ha időzítéssel +old6ó lenne.
(#) _vl_ válasza eaglee71 hozzászólására (») Okt 17, 2013 /
 
Az errata szerint az újabb revíziójú chipekben elvileg javítva van, ők is érezték, hogy ez azért nem kóser így.
(#) eaglee71 válasza _vl_ hozzászólására (») Okt 17, 2013 /
 
Próbáltam ezt-azt. Sajnos az USB lelki világát nem ismerem túl mélyen. Van 5leted, mit tudok tenni a revíziós csere nélkül? Suspendet próbáltam a flash írás 4 MHz lassítás idejére, nem jött be /vagy rosszul csináltam/.
(#) _vl_ válasza eaglee71 hozzászólására (») Okt 17, 2013 /
 
Biztos, hogy más megoldás nincs, mint hogy az eszköz "eltűnik" arra az időre, amíg flash-t akar írni. A suspend emlékeim szerint a host felől kezdeményezett állapot, amely addig tart, amíg az eszközt meg nem szólítja újból a host. Mivel az eszköz nem tudhatja, hogy mikor szólítják meg, erre nem alapozhatsz.
(#) Attila86 hozzászólása Okt 18, 2013 /
 
UART-al szeretnék egy kis kommunikációt megoldani több PIC közt. Tudtok valami jó, magyar nyelvű leírásról ami az UART-ról szól?
(#) Hp41C válasza Attila86 hozzászólására (») Okt 18, 2013 /
 
Bővebben: Link A Goooooogle találta az "aszinkron adatátvitel" keresésre...
Ha nem szeretnéd a kontrollerek jelentős kapacitását lekötni a hibátlan adatátvitelre, akkor bufferelt megoldást valósíts meg. Többször leírtam már ebbe a topikba is.
(#) Attila86 válasza Hp41C hozzászólására (») Okt 18, 2013 /
 
Köszi, ezt én is megtaláltam. Csak én assembly-ben programozom majd, és konkrétan az érdekelne hogy maga a PIC UART modulja hogyan működik, hogyan kell beállítani, Hova kell a küldendő adatot bemásolni, hol kapom a beérkezett adatot stb. Bár közben eszembe is jutott hogy a Kónya-féle könyvben ha jól emlékszem írnak róla részletesen. Ki is nyomtattam gyorsan az adott részt (mert a könyvem most pont kölcsönbe van adva egy barátomnak) aztán most tanulmányozom.
(#) Attila86 válasza Attila86 hozzászólására (») Okt 18, 2013 /
 
Na, itt egész jól leírták a dolgokat! Egy kérdésem van amire még nem találtam választ sehol. Egyszerre lehet adni és venni is? Azaz mi történik akkor ha épp küld ki a PIC adatot és közben érkezik is egy adat?
(#) Hp41C válasza Attila86 hozzászólására (») Okt 18, 2013 /
 
Lehet adni és venni egyszerre, az adó és a vevő függetlenül működik. Persze a formátum (8 vagy 9 bit) és a sebesség közös.
PIC Uart kezelés
(#) watt válasza Attila86 hozzászólására (») Okt 18, 2013 /
 
Lehet adni és venni, de nem úgy, hogy megvárom, míg beér a vétel összes adata, majd menézem mi jön válaszban, mert akkor lebarad a fele! Bájtonkénti adás-vétel megszakításból mindkettő és pufferelés, indexelés, hibakezelés, CRC kezelés, stb.
A modul működését pedig legjobban számomra az adatlap rajza mutatja meg. Ebből az is kiderül, hogy két egymástól különálló hardver egység dolgozik, azaz tud full duplexet.
A hozzászólás módosítva: Okt 18, 2013
(#) Attila86 hozzászólása Okt 19, 2013 /
 
Köszönöm a válaszokat! Még annyi hogy menni fog az UART belső oszcillátorral? Vagy mindenképpen kvarcot tegyek a PIC-re?

Illetve: Pufferelés, indexelés, hibakezelés, CRC kezelés stb.?
Pufferelés alatt azt értitek hogy mikor bejön egy adat akkor csak gyorsan kimásoljuk valahova mondjuk egy mutatóval, majd a következőt stb és mikor megjött asz összes bájt akkor szabad csak feldolgozni?
Indexelés alatt nem tudom mire gondolsz watt.
Hibakezelés, CRC kezelés... Miért, lesz hiba? Ha ugyan olyan sebességet állítok be az adó és a vevő PIC UART-jában és egy darab vezetékkel összekötöm őket akkor csak nem lesz hiba. Gondolom én.
A hozzászólás módosítva: Okt 19, 2013
(#) kissi válasza Attila86 hozzászólására (») Okt 19, 2013 /
 
Idézet:
„Pufferelés alatt azt értitek hogy...”
--> Igen. Nem muszáj kivárni az összes adatot, ha van közben időd a feldolgozásra, de ez feladattól függ!
Idézet:
„Indexelés”
--> mutatóval történő kezelés !
Idézet:
„Ha ugyan olyan sebességet állítok be az adó és a vevő PIC UART-jában”
--> attól még nem együtt mennek, de nem valószínű, hogy ebből hiba lesz, hanem az összekötő vezetéken fellépő zaj hatására is lehet bittévesztés ( kiszajú környezetben vagy nem kritikus feladatnál nem kötelező, de ha mondjuk "rakétát indítasz" , akkor nem árt vele vigyázni! ) !!
(#) zenetom válasza Attila86 hozzászólására (») Okt 19, 2013 /
 
Szia!
Nem tudom milyen PIC-et akarsz használni (én a 18F családot javaslom), az UART a FOSC-ról megy, tehát amilyen órajelforrást használsz, azzal fog menni az UART is. Ha lehet, külső kvarcról járasd a PIC-et, mert a belső oszci ilyen célokra (tapasztalataim alapján) pontatlan, sok vele a "nyűg" (adó - vevő oldalon nem biztos hogy egyezni fog a frekvencia, és magas baudnál rossz adatokat fogsz kapni, nagy lesz a hibaszázalék). Mivel tökéletes kommunikáció nincs, ezért itt is lehetnek hibák, amit flagbitekkel lehet lekérdezni, pl. az RCSTA regiszterben a FERR (Framing ERRor), és az OERR (Overrun ERRor). Ezek 1-be állnak, ha vételnél hiba keletkezik (pl. overrun: "ráfutás" - ha túl gyorsan jön az adat). Szóval vételnél ezeket mindig figyelni kell (vagy legalábbis illik), és aszerint eljárni (várni, "eldobni" a beérkező adatot.. stb).
A pufferelést jól írtad, végülis az indexelés is ide tartozik, vagyis az adat elhelyezkedése-címzése a memóriában. A CRC az adatfolyamban van kódolva, ami végülis egy kódolás-dekódolás, szerintem egyszerűbb átvitelhez felesleges. Vannak egyéb, egyszerűbb kódolások (pl. manchester).
(#) _vl_ válasza Attila86 hozzászólására (») Okt 19, 2013 /
 
Idézet:
„Még annyi hogy menni fog az UART belső oszcillátorral? Vagy mindenképpen kvarcot tegyek a PIC-re?”

Ha a PIC belső oszcillátora 1-2% pontosságon belül van, akkor az elég lehet. Ha rosszabb, akkor kell a kvarc.
(#) pepe1125 hozzászólása Okt 19, 2013 /
 
Sziasztok!

Tudnátok mondani ötleteket, hogy lehetne megvalósítani a következő motor vezérlését?!
Motorvezérlés PIC-el...

Ezt sok sok delay-el oldottam meg, mert ennyit tudtam. Viszont most már van végállás kapcsoló és le kellene tudni állítani a szerkezetet. Viszont a sok delay miatt ki kell várni a programban mire leellenőrzi a bemenetet és történhetne bármi is.

A léptető motor vezérlésére írtam egy függvényt amit meghívogatok ha mondjuk azt szeretném, hogy felfelé menjen... De szintén ki kell várni míg felmegy, és hiába jön az érzékelőről jel, figyelembe se veszi addig.

  1. void fel() {
  2.             for(i=0; i<65; i++){
  3.                 M2A = 0; M2B = 1;
  4.                 Delay_ms(1);
  5.                 M2A = 0; M2B = 0;
  6.                 Delay_ms(1);
  7.                 M2A = 1; M2B = 0;
  8.                 Delay_ms(1);
  9.                 M2A = 1; M2B = 1;
  10.                 Delay_ms(1);
  11.                 }
  12.              }


Ez a léptető motor pontosan 64 lépéssel leteszi a fejet amit mozgat.

Jó, mondom akkor csináljuk meg interruptal.
  1. void interrupt(){
  2.     if (TMR0IF_bit){
  3.     x++;
  4.     if (x==8) x=0;
  5.     TMR0IF_bit = 0;
  6.     }
  7. }
  8.  
  9. .
  10. .
  11. .
  12.  
  13. switch(x){
  14.    case 0: M1=1; M2=1; break;
  15.    case 2: M1=1; M2=0; break;
  16.    case 4: M1=0; M2=0; break;
  17.    case 6: M1=0; M2=1; break;
  18.    }


Ez eddig oké, mert szépen elindul lefelé a fej... De hogy lehet megállítani, majd várakozni és felvinni a fejet, majd jobbra menni és a végállásal leállítani a szerkezetet? Eddig a delay-el kivártam az időt, meghívtam a le(); fel(); függvényt és 64 lépésben vitte a motort, kész.

De ha interrupt van, hogy lehet időzíteni?

Milyen megoldások léteznek arra, hogy "realtime" figyelje az érzékelőt is és ha végálláshoz ért álljon le?
delay-ek nélkül?

Remélem érthető a problémám.
(#) zenetom válasza pepe1125 hozzászólására (») Okt 19, 2013 /
 
Szia!
Pl. használod a PIC Timer modulját, ami a programtól függetlenül "jár", és tud megszakítást is generálni. Pl. a folyamat előtt törlöd a Timer regisztereket (pl. TMR1H, TMR1L), majd elindítod a timert, aztán a programban figyeled a megszakításjelző bitet.
(#) Attila86 hozzászólása Okt 19, 2013 /
 
Ismét köszönöm a válaszokat! Mint írtam soha nem volt még dolgom semmilyen PIC-ek közti kommunikációval ezért nem igazán tudom hogyan szokás ilyesmit megvalósítani mint amit én szeretnék. De már egy hete töröm rajta a fejemet és mostanra összeállt egy szerintem nagyon jó ötlet, ezt osztanám meg veletek és kérdezném hogy ez szerintetek működhet-e:

A panelmérőmet fejlesztem tovább és arra gondoltam hogy jó lenne ha össze lehetne kapcsolni két panelmérőt és azok optocsatolós leválasztás útján kommunikálhatnának egymással. Elküldözgetnék egymásnak hogy mit mértek és az egyik panelmérőn lenne csak LCD és ott jelezné ki mind a két panelmérő által mért feszültséget és áramot. A cél az, hogy így kettős tápegység esetén egy kijelzőről leolvasható legyen mind a két táp feszültsége és árama. Vagy mivel a panelmérő III már AC-t is fog tudni mérni, akár hálózati kapcstápok hatásfokának mérése is megoldható lenne egyetlen ilyen kis műszerrel. Sőt, arra gondoltam hogy maximum akár négy panelmérőt is össze lehetne így kapcsolni, ha esetleg valaki négyes tápot épít. Az optocsatolós leválasztás miatt mind a négy labortáp galvanikusan független maradna, persze mind a négy panelmérőnek külön tápellátás kell.

Először szoftveres megoldáson gondolkodtam, leginkább azért mert nincs már egyetlen szabad lába sem a PIC-nek, legfeljebb csak az ICSP csatira kivezetett három. Ezek viszont gondoltam magamban biztos nem kommunikációs perifériákhoz tartoznak. Aztán megnéztem az adatlapját a felhasználandó PIC18F25K80-nak és marha nagy szerencsém van mert a programozói lábak egyben az RX-TX lábai is az UART modulnak. Szuper!
Ekkor kezdtem el gondolkodni magán a kommunikáción hogy az hogyan is történjen. Először mindenképp egy mester-szolga rendszerű dologban gondolkodtam ahol van egy mesternek kinevezett panelmérő (PIC) és ő kérdezgeti le a másik panelmérőt (vagy panelmérőket). De gondoltam mi van akkor ha az user véletlen egynél több panelmérőt állít be mesternek? Mondom jó oké, akkor legyen az a mester amelyiken a kijelző van. Na és mi van ha mindegyiken van kijelző? A másik dolog pedig hogy ki fogja 'vezényelni' a kommunikációt? Az, amelyiknek a tápfesze előbb feláll és sikerül elindulnia a PIC-nek? De mi van ha a következő áram alá helyezéskor meg a másik éled fel hamarabb? És honnan tudják a panelmérők hogy a sorban ki hol helyezkedik el, melyik jön melyik után? Oké, akkor nevezzük el, sorszámozzuk fel vagy véletlenszám-generátorral adjunk valamiféle neveket a panelmérőknek de az sem jó mert mi van ha azonos lesz a név? Illetve van még egy probléma hogy a kommunikációnak működnie kell akkor is ha csak két panelmérő van össze kötve, de akkor is ha négy. Vagy esetleg három. (Négynél több nem kell szerintem, az már bőven elég.)

És így jött az ötlet hogy a kommunikáció két panelmérő közt csak egyirányú legyen, de azok egy körbe lennének kötve. Azaz négy panelmérő esetén az "A" küldené az adatot a "B"-nek, a "B" pedig a "C"-nek, a "C" a "D"-nek, majd a "D" az "A"-nak. Noha így a kommunikáció egyirányú, mégis a körbe kötés miatt közvetve eljut minden adat mindenkihez. Ugyanis úgy nézne ki a dolog, hogy amikor az egyik panelmérő, legyen mondjuk a "B" mér egyet (fél másodpercenként egyébként) akkor elküldi azt a "C" panelmérőnek. De nem csak azt amit ő most mért, hanem azokat az adatokat is amit az előző két panelmérőtől ő kapott! Tehát a "C" meg fogja kapni a "B"-től a "B", az "A" és a "D" mérési eredményeit is. És ez így menne szépen körbe-körbe. Persze mindegyik panelmérő tudni fogja hogy mikor adatcsomagot kap akkor az első adat az előtte lévő műszeré, a második adat a kettővel mögötte lévőé, a harmadik adat pedig a hárommal mögötte lévő műszeré. Persze most csak mi neveztük el őket A, B, C és D-nek, ők nem tudnak róla hogy ki kicsoda. Mindegyik önmagát "A"-nak tekinti. És a "B" a mögöttest jelenti számukra, a "C" a kettővel mögötte lévőt, a "D" pedig a hárommal mögötte lévőt. Persze ennek folytán ha mind a négy panelmérőn van LCD kijelző akkor a kijelzések nem lesznek azonosak, de ez nem is fontos.
És itt jön az hogy mi van ha nem négy, hanem csak három vagy kettő panelmérő van? Három panelmérő esetén az "A" az adott panelmérő saját mérési eredménye lesz, a "B" a mögötte lévőé, a "C" pedig a kettővel mögötte lévőé. "D" panelmérő jelenleg nincs, az a jelenleg "A"-nak nevezett saját mérési eredménye lesz! Csak nem a mostani hanem az előző. Két panelmérőnél pedig értelem-szerűen az utolsó két vett adat lesz a sajátjuk. Ezt már szoftveresen, menüből az user simán be tudja állítani hogy az utolsó vagy az utolsó kettő adatot ne jelezze ki az LCD-re.

Na és még annyi ötletem van ezzel kapcsolatban, hogy valójában nem is három adat kell hogy keringjen hanem négy. Miért? Azért, mert akkor betehetek egy UART-USB átalakítót a körbe úgy hogy ráakasztom bármelyik pic TX-ére és máris az egészet rá lehet kötni számítógépre és ott szépen monitorozni lehet az összes panelmérő mérési eredményeit.

Nos ez az ötletem. Próbáltam átgondolni alaposan hogy ez működhet-e, esetleg lehet-e benne valami módon gubanc. Például ha a panelmérők nem szép sorjában küldik az adatokat egymásnak hanem össze-vissza (erre elég nagy esély van, mert a sorrend az lesz ahogy a panelmérők felélednek). Ez elvileg szerintem nem lehet gond. A másik dolog pedig hogy mi van ha valamelyik sűrűbben küld adatot mint a másik. Ezt még nem sikerült teljesen átlátnom hogy ilyenkor mi történne, de amúgy teljesen ugyan az a szoftver fut majd mindegyik PIC-ben és a mintavételek (és egyben az adatküldés) pontosan 500ms-onként történnek majd mindegyik panelmérőben. Ráadásul kvarc oszciról. De elvileg hogyha a kvarcok közti idő különbség összege eléri az 500ms-ot (ami szerintem irtó sok idő lehet amúgy, bár ki kellene számolni) akkor megtörténik az hogy valamelyik (a leggyorsabb) panelmérő kétszer küld adatot míg a többi csak egyszer. Ilyenkor lehet hogy kieshetnek a szinkronból és elcsúsznak az értékek. De ezt a részét még nem gondoltam át teljesen, illetve előfordulhat még más hibalehetőség is a gondolatmenetemben. Nos, pontosan ebben kérném ki a véleményeteket!
(#) zenetom válasza Attila86 hozzászólására (») Okt 19, 2013 /
 
Biztosan működhet a dolog, ha jól ki van találva, de én raknék bele valami szinkronizációt, hogy tudja a kijelző egység, milyen érték kihez tartozik.
Most hirtelen még annyi jut eszembe, hogy az optocsatolónál vigyázz a baudra, nálam 56kbps fölött már nem vitte jól át az adatot a 4N25 és társai (6N137 már jó volt), de mondjuk ide nem is kell nagy sebesség.
(#) Attila86 válasza zenetom hozzászólására (») Okt 19, 2013 /
 
Idézet:
„de én raknék bele valami szinkronizációt, hogy tudja a kijelző egység, milyen érték kihez tartozik.”

Pont ezt mondom hogy nem lehet tudni melyik adat melyikhez tartozik, csak olyan szinten hogy:
- "én adatom, most jött az A/D-mról"
- "mögöttem lévő panelmérő adata, ez érkezett az UART-on legutóbb kapott adatcsomag első adataként"
- "kettővel mögöttem lévő panelmérő adata, ez érkezett az UART-on legutóbb kapott adatcsomag második adataként"
- "hárommal mögöttem lévő panelmérő adata, ez érkezett az UART-on legutóbb kapott adatcsomag harmadik adataként"

Igen, itt nem kell gyors adatátvitel. 500ms-onként kell majd úgy számolom kb 30 bájtot küldözgetni, igazából marhára ráér mennyi idő alatt. Nem is tudom mi a leglassabb sebesség a pic UART moduljánál, majd megnézem.
(#) pepe1125 válasza zenetom hozzászólására (») Okt 19, 2013 /
 
Amint látod, csináltam TIMER0 időzítőhöz megszakítást...

De nem jól működik, mert túl gyors még a legnagyobb prescale osztással is. Ezért indítottam még egy számlálót (t), és szeretném (y) változó értékét egyesével növelni majd a switch case-ben lépésenként kiadni mit csináljon. De össze vissza ugrál. Nem tudom megoldani... Biztos van valami más megoldás, egyszerűbb, jobb. De gőzöm sincs hogyan tovább. Ez a bajom.

  1. void interrupt() {
  2.      if (TMR0IF_bit){
  3.      t++;
  4.      if (t>1024) t=0;
  5.      x++;
  6.      if (x==8) x=0;
  7.      TMR0IF_bit = 0;
  8.      }
  9. }
  10.  
  11. void le() {
  12.                  if (t>512 && t<1024){
  13.                    switch(x){
  14.                    case 0: M2A=1; M2B=1; break;
  15.                    case 2: M2A=1; M2B=0; break;
  16.                    case 4: M2A=0; M2B=0; break;
  17.                    case 6: M2A=0; M2B=1; lee++; break;
  18.                    }
  19.  
  20.                  }
  21.                 lebit=1;
  22. }
  23.  
  24. void fel() {
  25.                 if (t>512 && t<1024){
  26.                    switch(x){
  27.                    case 0: M2A=0; M2B=1; break;
  28.                    case 2: M2A=0; M2B=0; break;
  29.                    case 4: M2A=1; M2B=0; break;
  30.                    case 6: M2A=1; M2B=1; fell++; break;
  31.                    }
  32.                  }
  33.                 felbit=1;
  34. }
  35.  
  36. void inicializalas() {
  37. Delay_ms(1000);
  38. TRISA = 0b00000111;    // 1 = input; 0 = output;
  39. TRISB = 0b00000000;
  40. TRISC = 0b00000000;
  41. PORTA = 0b00000111;
  42. PORTB = 0b00000000;
  43. PORTC = 0b00000110;
  44.  
  45. ADC_init();
  46. ADCON0 = 0xCF;
  47. ADCON1 = 0x0E;
  48.  
  49.  
  50.      // Megszakítás és időzítő beállítása
  51.  
  52.      TMR0ON_bit = 0;      // TMR0 kikapcs
  53.      INTCON = 0xA0;       // megszakítás engedélyezése TMR0-án
  54.      TMR0IE_bit = 1;      // TMR0 Overflow Interrupt Flag bit
  55.      T08BIT_bit = 1;      // TMR0 8bites
  56.      T0CS_bit = 0;        // Timer0 Clock Source Select bit
  57.      PSA_bit = 0;         // prescaler
  58.  
  59.      // prescaler
  60.      // 111 = 1:256 Prescale value
  61.      // 110 = 1:128 Prescale value
  62.      // 101 = 1:64 Prescale value
  63.      // 100 = 1:32 Prescale value
  64.      // 011 = 1:16 Prescale value
  65.      // 010 = 1:8 Prescale value
  66.      // 001 = 1:4 Prescale value
  67.      // 000 = 1:2 Prescale value
  68.      T0PS0_bit = 1;
  69.      T0PS1_bit = 1;
  70.      T0PS2_bit = 0;
  71.  
  72.      TMR0L   = 0;
  73.      TMR0ON_bit = 1;      // időzítő indítása
  74.  
  75. void main() {
  76. inicializalas();
  77.  
  78.                 while(1){              // Végtelen ciklus
  79.  
  80.  
  81.                 if (t==0) k=1;
  82.                 if (t==1) k=0;
  83.  
  84.                 if (k) y++;                   // K (0-1) átmenet miért nem csak egyesével növeli y értékét???
  85.  
  86.                 switch(y){
  87.                 case 0: le(); break;
  88.                 case 1: break;
  89.                 case 2: fel(); break;
  90.                 case 3: y=0; break;
  91.                 }
  92.  
  93.         }
  94. }
(#) zenetom válasza Attila86 hozzászólására (») Okt 19, 2013 /
 
Első olvasásra egyszerűnek tűnik, de ha jobban belegondolunk, elég összetett a feladat (bár lehet csak én bonyolítom túl szokásomhoz hívően ). Végig gondoltam, mi lenne ha teljes kört alkotnának, de csak belegabalyodtam...
Csatoltam egy képet, melyen van egy lehetséges verzió. Itt minden küldés után törölni kell értelemszerűen a beérkező adatok számlálóját.
Van még rá biztos sok jó megoldás, de most hirtelen ez jutott eszembe.
A hozzászólás módosítva: Okt 19, 2013

ABCD komm.JPG
    
(#) Attila86 válasza zenetom hozzászólására (») Okt 19, 2013 /
 
A rajzod jó, így gondolom ahogy a rajzon van.
(#) zenetom válasza Attila86 hozzászólására (») Okt 19, 2013 /
 
Na, akkor egyre gondoltunk, csak bekavart ez a körbe kapcsolós dolog.
Viszont minden elemnek tudnia kell, hány elem van összesen, és ő maga hanyadik. És akkor így elég az első elemnek beállítani 500ms-ot, a többi meg csak vár, ill. küld, ha érkezett adat.
Gondolom egy panel több byte-ot küld, mondjuk 4-et, és akkor a négyesével lesznek szétválasztva a vett adatok. De ez már részletkérdés. Sőt, akkor egyértelműen azonosítható is mindegyik, hisz mondjuk minden 5. byte az adót azonosítja.
De persze ha valami gebasz van, akkor borul az egész, ezért nem árt belerakni valami időalapú "reset"-et, hogy ha mondjuk x ideig nem jön adat, akkor álljon alaphelyzetbe a panel.
(#) zenetom válasza pepe1125 hozzászólására (») Okt 19, 2013 / 1
 
Bocsi, csak kissé zavaros a program, és nem is látni, hol figyelné a végállást.
Szerintem először gondold ki, hogy is fog működni, esetleg papírra (vagy PC-n) rajzold le a folyamatábrát, és csak utána írd meg a programot. Persze lehet programírás közben rájösz, hogy az úgy nem is jó, ezért tervezésnél arra is gondolj, hogy fog ez a valóságban menni. De hát ilyen a fejlesztés...
A motorvezérlésnél, meg mondjuk a végállást úgy is meg lehet oldani, hogy olyan lábra rakod a végálláskapcsolót, ami tud megszakítást generálni. Így a motor mozgató rutinnál, figyeled ezt a flag bitet, vagy a megszakításban nézed a lábhoz tartozó flagbitet, és aszerint jársz el (pl. törlöd a timert, és "jelzel" a motorvezérlő szubrutinnak egy változóval.. stb.
(#) pepe1125 válasza zenetom hozzászólására (») Okt 19, 2013 /
 
Köszi!

Egyelőre még nincs is benne a végállás figyelése. Már ott elakadtam, hogy eddig
  1. for(i=0; i<64; i++){
  2. M2A = 0; M2B = 1;
  3. delay_ms(5);
  4. M2A = 0; M2B = 0;
  5. delay_ms(5);
  6. M2A = 1; M2B = 0;
  7. delay_ms(5);
  8. M2A = 1; M2B = 1;
  9. delay_ms(5);
  10. }
ezzel simán letettem a tárgyat 64*4 lépésben a léptetőmotorral... DE OTT A DELAY ami meghatározza a gyorsaságát a léptetőmotornak.

Ezt hogy lehet másképpen megoldani úgy, hogy benne van az interrupt és a timer?!

A feladat amúgy amit csinálni kell egyszerű lenne elméletileg, mert a végállás kapcsoló csak a kocsit mozgató szerkezet egyik és másik végén van. Bárhol hozzáér le kell állni a jobbra és balra mozgató motornak és letenni majd felvenni egy alkatrészt. A jobb és bal irány egy DC motor. Az sima ügy, mert csak kiküldöm merre menjen. De a léptető motor már gázos, mert azon nincs érzékelő, csak annyit tudok tenni, hogy (64*4) 256 lépéssel lemegy vagy feljön.
Következő: »»   1139 / 1320
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