Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
4 és pascal és fél év C. Az előzőt kényszerből ezért azzal nem is kérkedek. Az a fél év C ami érdekelt is.
Az a baj, hogy nem ismered a mikrovezérlő műkösését. Kezd ezzel! Készülj fel, hogy ez egy logikai áramkör, nem egy "PC".
A "PIC mikrovezérlők alkalmazástechnikája, Kónya László - Kopják József" könyv ajánlott olvasmány? Úgy értem, hogy ismerős és kezdőnek szól?
4 év nagy idő.
Azért kérdeztem rá erre, mert ez a több-LED-villogtatós feladat olyan egyszerű, hogy aki már korábban programozott bármit is, az pikk-pakk megoldja. A korábbi példámból is látszik hogy csupán egy végtelen ciklusban kell két vagy több számlálót csökkenteni, majd azok nullázódásakor újratölteni az adottat és invertálni a hozzátartozó LED állapotát. Ha ez nem érthető számodra...
Nem feltétlenül. A PC esetében nem kell ismerni a hardvert és nem is LED-eket villogtatsz. (Eltekintve az LPT protos játékoktól...)
Egy mikrovezérlő pont úgy működik mint egy számítógép. Aki tud számítógépet programozni, az mikrovezérlőt is tud. (Azért persze ajánlatos ismerni hogy hogyan is épül fel hardware szinten egy ilyen rendszer.)
Jó, de előtte elektronikai ismereteket kell szerezz a digitális logikai áramkörökről, majd a memóriákról, egyéb perifériákról stb. Ha ez megvan, akkor meg kell érteni, hogyan is működik egy mikrovezérlő, amit az adatlapok rajzaiból is meg lehet érteni, ha elektronikából és digitlogikából már jó vagy. Annak semmi értelme, hogy neki állj úgy programozni PIC-et, hogy ezeket nem ismered. Persze ha csak játszani akarsz, annak jó a LED villogtatás példákból öszeollózva, de ha komolyan foglalkozni akarsz ezzel, akkor arra időt kell szánni és sokat tanulni. (sajnos ismét offba hajlottunk ebben a topicban. Látod ide értünk az RTOS-tól...)
Ezen most ne vesszünk össze!
Egy számítógépnél is ismerni kell valamennyire a hardware-t. És miért lenne bonyolultabb egy kimenet invertálása egy szöveg kiírásánál? Persze lehet hogy számomra azért olyan egyformák mert számítógépet is hardware-közeli módon és assemblyben programoztam. Na jó, lehet hogy igazad van. A témától való eltérést akkor itt befejezem.
Nem értünk egyet, pont a kitételed miatt. (Ja és nem ugyanúgy működik, és más logikával is kell programozni!)
Idézet: A "hagyományos" PIC16 esetén nem valósítható meg a preemptív RTOS, mert a veremtár nem olvasható ki, tehát nem is menthető el. Ezért a várakozó ciklus sem szakítható meg, tehát más megközelítés kell.„az időzítés abbamaradna és újra kezdődne amikor váltok.” Az egyik leggyakrabban alkalmazott megközelítés arról szól, hogy (hardveres) időzítéssel, vagy timer megszakításokkal időszeleteket képezünk, s minden időzítés ezen időszeletek egész számú többszöröse lesz. Ahány feladat fut, annyi (vissza)számláló kell, s amelyik éppen lejárt, az ahhoz tartozó feladatot hajtjuk végre. Ha "feladatok" egyszerűek, akkor interrupt szinten is végrehajthatók. Ha nem, akkor egy-egy jelzőt állítunk csak be, s a főprogram ezeket figyelve ágazik el. Egyszerű, mint a faék, s nem kell hozzá semmi hókusz-pókusz.
Ugyan így indultam el most ahogy írtad. Remélem sikerül. Ettől eltekintve megfogadom watt tanácsát. Köszönöm.
Konyvespolc. Ha meg nem ismerned. Van sok irodalom a PIC vilagarol. Mintapeldakat is talasz.
Köszi szépen. Jól elleszek velük. Mellesleg nem tudtam több könyvespolc is van mert egyben járkáltam amit a könyves topikba kaptam és oda nem volt ennyi minden feltöltve pic-ekről.
Sziasztok!
RS232 problémáim akadtak. A beépített rutin nem hajlandó működni, bármit csinálok vele. A ccs fórumán is olvasgattam, kipróbáltam sok leírt dolgot, sajnos eredménye nem lett. A picből tudok adatot küldeni, ez hibátlanul ki is megy. Fogadni viszont nem tudok. Addig se jut el a dolog, hogy a vételi megszakítás rutinba ugorjon a program. A portok illesztettek egy max232 icvel. Mi lehet a gond? Mellékeltem a forrásfilet.
Lehet hogy a rcv buffer tulcsordul, es utana uj karakter vetelenel nem ad IT-t. Figyelni kell a RCSTA regiszterben az OERR bitet, es ha 1 a CREN=0, CREN=1 utasitasokkal ki majd be kell kapcsolni a vevot. es utana ki kell olvasni a veteli buffert.
Ha simán pollingolsz, akkor tudsz fogadni? Ha az megy, hardveresen jó az illesztésed befelé is. Ha jól értem, el sem sül a megszakítás, akkor első körben azt kell életre kelteni. Ehhez a pichez mikor egy sima B port megszakítást kellett csinálnom, a regisztereket kellett közvetlenül írogatnom, mert a fordító saját függvényei nem voltak képesek beállítani... Lehet, hogy itt is az adatlap alapján kicsit mélyebbre kell ásnod, ha kifogtál valami bugot.
>Itt< pedig a reciever kódban a vilmosd féle módszer van.
Köszönöm a válaszokat! Sajnos így sem működik, az OERR bit állandóan 0ban van. Áttettem a portokat a hardveres uartta (c6,c7), itt minden hibátlanul működik, van vétel és megszakítás is. Ezek szerint rosszul tudtam, és csak a megadott tx/rx port használható az rs232re?
Most nemazért, de hogy várhatsz megszakítást a nem hardveres RS232-nél?
Üdv!
Először is szeretném bejelenteni, hogy sikerült megoldanom a problémám viszont most itt lenne egy másik. Készítettem egy "időzítőt". Egyszerű "delay" utasítással. A probléma az, hogy a várakozás idejét változóval adom meg amit kívülről viszek be. Nyomogatok egy gombot és a váltózó értékét növelem ezzel. A gond az, hogy egy adott nyomogatássorozat után reset-ál az egész ahelyett, hogy tovább tudnám növelni az értéket. Nem adtam meg semmilyen függvényt ami ezt kéne végezze. Kb olyan mintha lenne egy "ha nyomogatások/változó száma/értéke elérte X-et ugorjon vissza a kezdő értékre" függvény. Gondolom ez megint valami egyszerű hiba az én részemről amit figylemen kívül hagytam.
nem lehetséges hogy egyszerűen túlcsordúl?
Szia!
például rossz változó típust választottál és "túlcsordul" ( azaz lenulláz !) és ezért úgy tűnik, mintha elölről kezdené ( de ilyenkor jó lenne látni a programot is ! ) ! Steve
Szia!
Mivel kezdő vagyok ezért bármi elképzelhető és új amit mondotok :yes: Mi lenne ilyenkor a teendő ha ez a baj? Mármint az orvoslásra. Tömören a kód:
Nagyjából lecsupaszítva a program. Még elől a be include-olások hiányoznak. Szükségesek? Csak egy pin-re szerettem volna kiküldeni. Ennyi amit még kivettem mivel nem lényeges.
Nem ismerem a CCS-t, de a delay_ms( ) paramétere 'int' típusú változó lehet ? Mert, ha csak byte-os, akkor pont azt fogja csinálni, amit írtam !
Steve
Mivel kezdő vagyok ezért én nem igazán tudom megválaszolni a kérdésed. Az integer elméletbe egy 5 jegyű szám és nálam még 1000 előtt bekövetkezik.
Most nézem a ccs könyvet a delay-re: Idézet: „... the variable 0-65535(int16) or a constant 0-65535...”
A leírásod alapján lehet int a változó típusa.
Idézet: <-- ezt honnan tudod ? kb. ezerszer ( vagy százszor ? ) nyomtad meg ?! Nem látom a programodban a nyomógomb "prellmentesítést", ami szintén ilyen problémát okozhat!„nálam még 1000 előtt bekövetkezik” Steve Bocs, ezt maga a késleltetésed csinálja!
Ezek alapján jó lehet a programod... Nem látom még a konfigurációs biteket, nézd meg, hogy a WatchDog nem maradt-e bekapcsolva, mert az is újraindít egy idő után !
Steve
Azt hittem, hogy elég ha a gomb megnyomása után írok egy függvényt arra, hogy csak akkor lépjen tovább ha elengedtem. Onnan tudom, hogy 17 és 30 közötti értékekig el tudok számolni. 17 előtt soha nem reset-ál de leggyakrabban itt.
Proteus szimulátorban is jelentkezik a hiba.
Azt várni, hogy elengedted, nem biztos, hogy elég általában, mert a gomb lenyomásakor az érintkező záródik, de a rugalmassága miatt újra bonthat ( ez a prell! ), akár többször is, és így már át is lépte a várakozó részt!
Nem tudom mi lehet a problémád, de a szimulátor sokat segíthet ( elvileg a WatchDog ki van kapcsolva! )! Steve
Mint írtam szimulátorban is jelentkezik a bibi. Pedig ott nem hiszem lenne prellegés a gomb nyomásakor. Olyan kidolgozott szimulátor lenne, hogy a nyomógomb prellegését is beleszámították volna?
Azt szerintem nem, de nem lehetetlen...
Állítsd meg lépésenként vagy bizonyos időnként a program futását és nézd meg a változók állapotát, így meg kell találnod a hibát! Steve |
Bejelentkezés
Hirdetés |