Fórum témák
» Több friss téma |
Az nem, hogy a PK2 saját progiját használod az auto import hex-el? Vagy debuggolni is szeretnél? Ha igen, marad az MPlab.
Idézet: „Tehát a main-ból az abc globális változót (objektumot, pointert?) adjuk át a morse_rom függvénynek.” Igen. A tomb C nyelven (majdnem) kompatibilis a pointerrel. Tehat nem kell annak is a cimet venni ('&abc' volt a valtozatodban, eleg az 'abc', es az a karakter lanc elejet fogja megcimezni). Idézet: „Ott karakter tipusú rom pointerként értelmezzük, ami más modulból nem látszik (static).” Nem, a 'static' kulcsszo mast jelent fuggvenyekre alkalmazva mint valtozokra (egyike a C 'szepsegenek'). Valtozoknal a static annyit csinal, hogy nem a lokalis, azaz 'auto' tarolasi osztalyba kerul, magyaran nem a stack-en lesz elhelyezve. Ez a C18 eseten azert jo, mert a stack eleg kacifantosan van megoldva -- azaz a kod sokkal nagyobb es lassabb ha lokalis valtozot hasznalsz... Cserebe azonban a fuggveny nem 'reentrans', azaz nem hivhatod meg egynel tobbszor. Pl. nem hivhatod meg interruptbol vagy nem hivhatja meg onmagat (nem lehet 'rekurziv'). Idézet: „Az overlay char c pedig azt jeleni, hogy felülíródik a korábbi érték. Az overlay nélkül ez nem így lenne?” Az overlay az nem ANSI C dolog, C18 specifikus. Majdnem ugyanaz, mint a 'static', kiveve, hogy van egy nagy elonye: A fordito kiszamolja, hogy a mely fuggvenyek hivodnak melyekbol, es igy ugyanazt a RAM teruletet ki tudja osztani mas fuggvenyeknek is. Ezzel rengeteg RAM helyet lehet sporoltatni megorizve a 'static' valtozokhoz tartozo kodreszletek gyorsasagat es kicsi kod meretet. De abban igazad van, hogy emiatt a valtozo erteke felul irodhat ha a fuggvenybol vissza tertel -- de amig benne vagy addig nem! Idézet: „Mivel a pointer char tipusú, akkor ez csak max 256 karakterig használható?” A pointer pointer tipusu. Alapertelmezesben 'far' pointer, ha nagyon kell a hely takarekossag, akkor 'near' tipusura lehet cserelni. A pointer azonban char-t cimez meg... de ettol meg pointer marad... Pointert ugy kell elkepzelni, mint egy mutato palcat. A palca mindig palca marad, megis mindig mas es mas dologra kepes mutatni. Ami miatt meg kell neki mondani, hogy char-ra fog mutatni, mert mikor azt mondod 'pointer++', tehat noveled az erteket, akkor ebbol fogja tudni, hogy sizeof(char)-nyival kell novelnie a pointer erteket. Magyaran a 'pointer aritmetikahoz' kell a pointernek tudnia, hogy mire mutat. De letezik 'void' pointer is, ami egy sima fapalca, es az mutathat egyszer almara maskor hordora, azonban az aritmetika nem tudja majd almanyit vagy hordonyit lepkedjen ![]()
Mindenképpen szeretném használni a DEBUG funkciót úgyhogy nekiállok és áttanulmányozok egy doksit az MPLAB-ról. Valamennyi ismeretem már van benne de az még édes kevés. remélem menni fog de akkor sem aggódom ha nem mert itt mindig van segítség.
Nagyon köszönöm a részletes magyarázatot és a helyreigazítást!
A struktúrákról szeretnék többet tudni, mint ami a MC C18 leírásaiban található. Esetleg tudsz ajánlani valamilyen részletes irodalmat, vagy bármilyen forrást lehetőleg magyarul? (Angolban elég lassan haladok.) Idézet: „nekiállok és áttanulmányozok egy doksit az MPLAB-ról” Varga László: Az MPLAB leírása (ha első kattintásra nem jön le, próbáld újra!) Idézet: „Esetleg tudsz ajánlani valamilyen részletes irodalmat, vagy bármilyen forrást lehetőleg magyarul?” BRIAN W. KERNIGHAN – DENNIS M. RITCHIE: A C programozási nyelv
Köszönöm a dokumentációt. Ebből már valami lesz.
Szeretném az usart beállításait ROM-ban, RAM-ban és EEPROM-ban, struktúratömbökben létrehozni és onnan adott feltétel alapján kiválasztani a megfelelő értéket.
A következő programmal több gondom is van: 1. Nem lép ki a ciklusból mikor megtalálja a szükséges értéket. 2. Nem tudom, hogyan lehetne ugyanezt mutatókkal megcsinálni. A ROM struktúra ugyanis helyből pointernek mutatkozik az MPLAB watch ablakában és csődöt mondtak az eddigi próbálkozások. 3. Csak észrevétel, hogy ha a tipusdefiniciónál nem adok meg méretet a baud char-nak, teljesen hamis adatokat kapok. Példákban általában nem látok konkrét értéket.
Köszönettel fogadok bármilyen észrevételt, kritikát.
ad 1, persze hogy nem lép ki, mert tömböket így nem lehet (/ illik) összehasonlítani ...
ad 2, C18 fordítónál a romban lévő struktúrára pedig egyebek közt így hivatkozhatunk:
Utalni kell a ROM-ra és meg kell adni indexet. Így már működik! De örülnék a további kritikának IS.
Hali.
2 napja szenvedek a DS18B20-as szenzor és a PIC összehozásával. Most is csak 0.0-át mutat az LCD kijelzőn. Semmit nem reagáll. Valaki rá tudna nézni a forrásra? CCS-ben van írva.
Hali
Lehet esetleg valami gubanc az adatok konvertalasaval (float, long). Nezd meg ezt a forumot CCS forum. Pont ugyanez a problema merult fel. Udv Vili
Már próbáltam mindenhogy. Az a probléma hogy még a keresésre se kapok egyértelmű választ. Olyan mintha nem is látná a PIC a szenzort. A középső lábra rá van kötve egy 4K7-es Ellenállás 5V-al. És úgy van kötve a A1-re. De se kép se hang. Ha keresni akarom az 1 wire eszközöket akkoris 0-át kapok pedig ott van. +5V és Test van a DS18B20-on. Lövésem sincs mi lehet a baja. :S
Hali
Meg kellene valahogy nezni, hogy a 1W vonalon van e kommunikacio. Nem tudom kiprobalni, mert nincsen 18B20-am. En analog erzekeloket hasznalok (TC1047A). Probald ki a CCS forumon levo DS18B20.c forrast. Hatha. Udv Vili
Bocs de nem kellene a forrasban atallitani a megfelelo portot? Te A1-et irtal es a forrasodban A0 szerepel a 1W labkent.
Udv Vili
Megpróbáltam most keresni a DS szenzort de erre is csak nullát kapok valamiért.
void main() { lcd_init(); lcd_putc("\f"); while(1) { lcd_gotoxy(1,1); printf(lcd_putc,"%d",FindDevices()); } }
Próbáltam más más lábakon is a 1 wire kommunikációt azért maradhatott a forrásban az de egyébként biztos hogy jól próbáltam. De semmin nem megy.. Se A0, B0-on se :S.
![]()
Hali
Probald meg esetleg a confignal a HS beallitast. Talan. Termeszetesen a
vilmosd-nak igaza lehet abban, hogy a konfig az sok bosszúságot okoz az emberenk.
nekem szerencsére csak az elején okozott anno, későbbiekben inkább a régi konfigokhoz nyúlok ám szerintem ha működik a PIC, márpedig azt mondod hogy az LCD 0-t ír ki, az már fél siker. De pl. itt az RA0-t használod, ami alapesetben nem AN0 (analog működés)? mintha azt nem állítottad volna át (nem látom át teljesen a konfigot mert a MikroC-ben egérkattogtatós ez a rész) az eszközkeresének egy másik változata: #include<1wire.c> void main() { ADCON0=0x00; //A/D off -nálam mikroC-nél ADCON1=0xff; //A/D portok digitálissá.. -nálam mikroC-nél lcd_init(); lcd_putc("\f"); while(1) { lcd_gotoxy(1,1); if(ow_reset()) printf(lcd_putc,"N"); //Nincs else printf(lcd_putc,"V"); //Van } }
Sajnos ezek se jöttek össze. Próbáltam a Configot is változtatni, mindent digitális portra alakítani, de egyikse reagáll semmire :S.
Remélhetőleg az eszköz nem adta meg magát. Assembly -vel kellene megszólítani.
én is hasonlókat javaslok mint Bell.
Debuggolni kell. Pl. próbáld ki hogy az RA0/AN0 lábat tudod-e normálisan használni. Kimenet bemenet tesztelés. Még egy nagyon fontos dolog eszembe jutott! Először nekem sem ment a TO-92 tokos DS1821-es. (akkor írtam a lent mellékelt kódot). Aztán észrevettem hogy oxidos a lába. Megsmirgliztem, és tényleg az volt a problémám. Ebből következően, próbáld pl. minél közelebb tenni a mikrovezérlő lábához, hátha a jel összezavarodik. Ha megvan és tökéletes, akkor egy másik 1W -t kéne beletenni hogy az kommunikál-é. Ha nincs akkor... hát foggalmam nics hgoy lehetne tesztelni. Én anno írtam Find_Device() függvény féleséget, nálam működött, mindjárt ide is vésem. (mikroC-ben, DS-re, PIC18F2550-esre, +LCD modulra)
Szia!
Nem néztem a forrást, de ha kiveszed és olvasod a portot, akkor FFH-et kell kapnod! Ez működik? Steve
Azóta kaptam egy másik kódot és tökéletesen működik jelenleg. Már csak azt kell majd kisakkoznom hogy hogyan tudok több szenzort egy kábelen kezelni. Tudom hogy azonosítani kell a szenzorokat a számuk szerint de majd ez később lesz esedékes.
Most már a következő eszközre tértem át. Rotary encoder. Nem találtam eddig 1db használható függvényt se a használatára. Valaki kisérletezgetett már vele?
Rájöttél, hogy korábban mi volt a hiba?
Meglátásom szerint az encoder néhány nem pergésmentes kapcsoló, így azt legegyszerűbb / célszerűbb bit szinten kezelni. Praktikusan megszakítással.
A DS18B20 esetében nem értem még most sem hogy mivolt a hiba. Többek szerint a 48Mhz sok volt neki.
Az igazság az hogy az egész programot amit eddig elkezdtem próbálom a Hitech-ről átírni CCS-re. Valahogy megtetszett a CCS. A Rotary encoder sajnos nem megy a Hitech-es kódommal. Ott a pergés volt a hiba. Azért ugrált helytelenül fel,le. Énis a megszakításos dolgon gondolkodom de ugye az Encodernek 2 lába van. A és B. INT/RB0 meg csak egy van. A sima megszakításokat is használhatom rá? Az egy dolog hogy bekötöm de attól még nem bírom megálmodni a forrást ![]()
Találtam a CCS fórumán egy szimpatikus rutint.
Hogy lehetne úgy átalakítani hogy változtatni tudjam a rotary encoder helyzetét? Ezt arra értem hogy itt a példában a B portra van kötve.. Ha jól sejtem akkor két elsőre. De nekem át kellene pakolni valahova máshova. Mondjuk RC0, RC1. Valami ilyesmire gondoltam hogy szembetűnő legyen: #define ROT_A PIN_C0 #define ROT_B PIN_C1 De nem bírom kigobozni a kódot.. :S Nekem ezek a hexás megadások jócskán bekavarnak hogy most mi hogy van ![]() Idézet: A legegyszerűbb input_b() helyett input_c()-t írni. Bonyolultabb esetben enc_position alsó két bitjébe a bitenként beolvasott adat is bepakolható... „Mondjuk RC0, RC1.” |
Bejelentkezés
Hirdetés |