Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
C18-ban a ROM területre tett cuccokat a rom kulcsszóval kell megadni, nem a const kulcsszóval.
Köszönöm, így működik, viszont a meghívás helyén még figyelmeztet:
Warning [2066] type qualifier mismatch in assignment Mi az oka?
Nem mondtad meg, hogy melyik sorra kaptad ezt a figyelmeztetést.
Ebben a hozzászólásban muttattam egy C18-hoz való LCD-re író programot, azt is megnézheted.
Hello
PIC16F628A CCP moduljával (Capture) szeretnék ultrahangos távolságmérőt csinálni. Az adatlapból nem derült ki nekem, hogy a Timer1 előosztóját, bekapcsolását nekem kell külön beállítanom? Illetve ha jön a megszakítás, és kimentődik a Timer1 értéke, akkor utána nekem kell kinulláznom a Timert, vagy kinullázódik magától? Üdv.
Szerintem az adatlapból egyértelműen kiderül, hogy a CCP modul csak kiolvassa a Timer1 számlálóját, de annak már futnia kell (tehát neked kell beállítanod az üzemmódját és az előosztóját).
Idézet: Nem kell nullázni, hanem fut tovább, s amikor majd kiolvasod a következő értéket, akkor kivonod belőle az elsőt (közben, persze figyelni kell az esetleges körülfordulásra, vagy túlcsordulásokra). „ Illetve ha jön a megszakítás, és kimentődik a Timer1 értéke, akkor utána nekem kell kinulláznom a Timert”
Sziasztok!
Egy 18F14k50-es pic-hez építettem próbapanelt. Ledeket hajtok meg vele 430 Ohm-os ellenállásokon keresztül. Tesztelésnek készült hozzá asembliben egy program, amely 4-4 db ledet villogtatta felváltva a panelen. Érdekesen indult a dolog, a rc4-es lábon lévő led nem akart villogni, átléptem debug-ba, majd vissza programozó módba és utána ment. (MPLAB) Jött a következő ötlet, egy LCD beüzemelése. Ahogy átírtam a programot ismét nem világított, a beállításokon csak annyit változtattam, hogy a B portot is kimenetnek állítottam. A debugba átlépés nem segített most. Így az LCD-se megy. Van valami ötletetek, hogy ez miért van? Annyit még, hogy az mplab-nak nem teccik, hogy 5V-ot kap a PIC tápnak. Pedig én adatlapból azt értelmeztem, hogy 5V is lehet (7805-el). Most akkor hány voltos? Előre is köszi!
Véletlenül nem az LF-et válaszottad ki az MPLAB-ban?
Az F-es 5V-os, ezt jól látttad, az LF nem. A programot csatold, úgy többet is lehetne mondani.
Az ilyen kérdésekre akkor lehet érdemi választ adni, ha a részleteket (amelyekben az ördög megbújik) is ismerjük!
Pl. Konfigurációs bitek beállítása, kapcsolási rajz, programkód, stb. Pl. MPLAB-ban ügyeltél-e arra, hogy a fordítás/linkelés RELEASE opcióval történjen? Konfigurációs bitek vonatkozásában hagyatkozhatsz az általam is használt beállításokra! Idézet: Nem az MPLAB-nak, hanem a programozó készülékeknek nem tetszik, mivel azok nem tudnak a VDD-től eltérő jelszinttel programozni, a PGC/PGD lábakra viszont nem szabad 3,6 V-nál magasabb feszültséget kapcsolni. Azért nem, mert ezek az USB jelvezetékek is egyben, s azoknál ez a max. megengedett feszültség.„Annyit még, hogy az mplab-nak nem teccik, hogy 5V-ot kap a PIC tápnak.” 1. Vagy hagyd, hogy a programozó adjon az áramkörödnek 3,3 V-os VDD-t, 2. vagy pedig ne kösd be a külső 5 V-ot a programozóba (a VDD ne legyen összekötve az ICSP csatlakozóval), s mondd azt a programozónak, hogy tegyen úgy, mintha ő adna 3,3 V-ot ...
Ma jutott eszembe, hogy mindig a következő sablont használom a programjaim kezdésére ( PIC16F sorozat ), ami valahogy így néz ki:
Namármost, ha felhagynék ezzel és a következőt használnám, vajon vétek-e valami nagyot?
Mivel az 0x0001-es címre nem akarok visszatérni, ezért szerintem továbbra is használhatom a 8 szintű stack-et, legfejjebb túlfordul és kipottyan belőle az 0x0001-es visszatérési érték. Valaki használja ezt a módot? Van róla tapasztalat? Idézet: „a PGC/PGD lábakra viszont nem szabad 3,6 V-nál magasabb feszültséget kapcsolni.” Ez mindig kimegy a fejemből. De hogy ekkora sületlenséget a gyár részéről miért kell csinálni, azt nem értem, na mindegy...
Bocsi kollégák, hogy ezzel zavarok:
Error[149] C:\APA\PICKIT2\PROJEKT\MERORENDSZER\PIC_LCD4.INC 6 : Directive only allowed when generating an object file ...INC file-t akartam létrehozni amiben udata majd .. RES-ek vannak. Az UDATA-s sorra írja a hibát. Mit tegyek?
Szia!
A call elé ugyanúgy kell a pagesel, mint a goto elé a 16F -eken... A 18F -en a goto és a call 4 byte-os, és az egész memória tartományon belül lehet velük hivatkozni. A nagyobb kontrollerekben van stack túl- ill. alulcsordulás figyelés. Szerintem, ha nem akarsz visszatérni, nem jó ötlet...
Ne abszolút módban írd/fordítsd a programot! Hanem így:
Linker script is kell, abból derül ki az RST és PGM szekció címe (ha beleírod...).
Megpróbáltam az ajánlott módon,de nem jött be. A linkert (16f886.lkr) ha megadom neki az .inc-es file-ban levő összes sort hibának veszi az UDATA és RES.. sorok kivételével.
Bar elmeletileg minden resetkor elolrol kezdi a stack-et, megis nem egy javallott megoldas. Elveszitesz egy stack helyet es cserebe semmivel sem kapsz tobbet, mint egy GOTO-val kapnal -- a PAGESEL tovabbra is kell, hacsak nem garantalod, hogy ahova ugrasz az ugyanugy a 0-as lapon fog tartozkodni...
Szoval nyerni nem nyersz semmit sem ellenben csunya a megoldas, elveszitesz egy stack helyet, raadasul ha ne adj isten stack alulcsordulasod lenne, akkor nem egybol veszed eszre, mivel a CALL utani memoria szeletre fog racsorogni a PC...
A Microchip/MPASM Suite/Template/Object mappában nézd meg a 16F886TMPO.ASM mintapéldát! Mondtam, hogy az én példámhoz a linker fájlt is át kell szabni. Ha a fenti mintapéldát követed, akkor nem...
PIC16F esetében természetesen Access Bank sincs (nincs udata_acs), hanem UDATA_SHR és UDATA van. Egyébként ez az object fájl-osdi a MPASM Helpjében részletesen le van írva, érdemes elolvasni!
Mégiscsak érdemes volt feltenni a kérdést. Nem tudom, miért hittem, hogy a call a teljes memóriatartalmat elérheti. Ez a lapolás és bankolás a halálom.
Amúgy rájöttem. Most épp 16F628-ast programozok, és annak a legnagyobb memóriacíme 0x07FF, ami belefér még egy utasításba, anélkül, hogy lapozni kellene. A 16F887-nél viszont már bajosan. Oda már tényleg nagyon keményen meg kell gyúrni a kódod, hogy moduláris maradhasson. Na de a fordító is nagyon értelmes, mert nem tette bele a végeredménybe a pagesel utasításait. Most esett le, hogy miért...
Idézet: El is hiszem. De mi a búbánatért nem használsz akkor PIC18-at? Abban is van kicsi, olcsó, kis lábszámú... „Ez a lapolás és bankolás a halálom.”
Idézet: „Amúgy rájöttem. Most épp 16F628-ast programozok, és annak a legnagyobb memóriacíme 0x07FF, ami belefér még egy utasításba, anélkül, hogy lapozni kellene. A 16F887-nél viszont már bajosan.” Es azt nezted-e mar, hogy a PAGESEL mire fordul a 628-as eseten? Ha olyan kodot szeretnel irni, amit esetleg masik MCU-ra is le szeretnel forditani, akkor nem art az a PAGESEL
Szia!
Ha a programtár mérete magyobb, mint 2K, más dolgok is előjönnek. Megszakítási rutin mentés, visszaállítás megváltozik, PCLATH -t is menteni kell. A mentés után a 0. lapot kell beállítani... Lapozás: Szervezd úgy az életet, hogy ameddig csak lehet, a program maradjon egy lapon (a 0. on), a nagymennyiségű táblázat kerüljön más lapokra. Ha mégsem fér el a program egy lapon, tegyél át komplett rutinokat (amik összetartoznak és nem hívnak más lapon levő eljárást - inicializálás...) az 1. vagy a 2. lapra. Nem olyan ördöngösség, mint amike látszik... Bankolás: -- Ha elég sok az adat a 18F -en is lehet bankolni... Idézet: „Bankolás: -- Ha elég sok az adat a 18F -en is lehet bankolni...” Mar varom ki fogja eloszor felbodni, hogy tessek AVR-t hasznalni
Na persze egyszerű programoknál ki lehet használni például a megosztott regiszterterületet. Igaz, max 16 reg, de ha az éppen elég valamilyen feladathoz, akkor minimális bankolással meg lehet úszni. De azért most már én is inkább abba az irányba kacsingatok, hogy amit megcsinálok kicsiben, az legyen jó nagyban is. Tehát minél általánosabb legyen a kód és minél inkább átvihetőbb más feladatokba is és más vezérlőkre is.
( Van már itthon atmega88 )
Általában az SFR regiszterek miatt kell a bankolgatás, nem a változók miatt. Változókat általában a nullás bankon használjuk, a többi bankot pl. pufferterületként használjuk és indirekt módon érjük el. Persze ez nem kötelező érvényű, csak amennyiben lehetséges, akkor így szokás.
Ez a hordozhatóság elméletben szép dolog, gyakorlatban valahogy nem tűnik annyira működőnek, amikor hardverrel közvetlenül végzünk valamit. C-ben megírva egy CRC számítás az pl. hordozható, de egy LCD vagy soros port kezelésen szinte mindig kell valamit faragni.
Érdekes, hogy csak kevesen tudnak ilyen egyszerűen gondolkodni (mindig a legegyszerűbb megoldás a "legszebb" hosszú távon), legtöbbször csak saját életüket bonyolítják az emberek.
Még annyit fűznék hozzá, hogy 18F-eknél ha kiválasztjuk az 1-es bankot, akkor 256(bank1)+128(bank0 access) bájt folyamatosan elérhető bankváltás nélkül. Ez a legtöbb esetben elég szokott lenni, és indirekt címzés nélkül sem kell bankot váltani. Persze vannak kivételek, de ez a ritkább eset, mert mindent meg lehet oldani többféleképpen is és érdemes mindig az egyszerűbbet választani. A MOVFF -al is meg lehet kerülni a bankváltást. Én is azt mondom, hogy 18F, ha több memó kell, mint 1 bank, vagy több flash, mint 1lap...
Szia!
- 16F: elég kevés az 1 lapon levő memória, 96 változó általában nem elég egy összetettebb feladathoz. - 18F: Az SFR -ek az Access bankon keresztül elérhetők bankolás nélkül, ha több változó kell, mint 256+128, direkt kezeléssel, akkor jön a bankváltás.... - A bankolás nem feltétlenül hátrány, jól ki is lehet használni: változók mentése helyett, egy rutin többféle adatot is tud kezelni..., de ehhez gondos tervezés kell...
Most ez komoly? Már ptogramoztam minden gond nélkül 18f2550-et (asszem). Ott is össze volt kötve. (Az más kérdés, hogy valami gond ott is volt)De a programozás ment.
Most azt csinálom, hogy lehúzom a tápot mikor programozok, mikor meg próbálom az áramkört a pk2-t húzom le, egyszerűen reset-ben tartja... Na és a részleteket is csatolom, hátha tudtok segíteni eredeti problémámra amit előre is köszönök.
A 18F14K50-ről volt szó, annak nem szereti a PGD/PGC lába a 3.6V-nál nagyobb szintet. A 18F2550 nem ilyen, az teljesen 5V-os PIC.
A PK2-nél be tudod állítani, hogy tartsa-e resetben vagy nem. Valahogy meg kellene oldani, hogy ne kelljen lehúzogatni állandóan.
Tegnap már ajánlottam, hogy a konfigurációs biteket be kellene állítani tisztességesen. Ha pl. az LVP nincs letiltva, az RC3 láb a normál és a programozói üzemmód közötti váltásra van fenntartva. Ráadásul ha nem húzod le földre, akkor nem is fut a program....
A panel szép és hasznos, bár én a 7805 helyett egy USB csatlakozót tettem volna rá.
Szia!
Sokkal kevesebb gondod lesz az áramkörökkel, ha a táp és főleg a föld vezetékeket megvastagítod. Ezen a kártyán is vígan elfért volna 1 mm vastag föld is.
Hello!
Az lenne a kérdésem hogy a mellékelt rajzon az A és B áramkörnek mi a szerepe és hogy működnek. Azt tudom hogy mclr láb reset láb, de hogy mi az a reset és mit csinál azt nem . Illetve azt tudom hogy OSC1 OSC2 lábon kapja az impulzusokat a chip, hogy dolgozni kéne. Pl.: ha 10Mhz akkor 1 sec alatt 10 millió impulzus. Azt nem értem még, hogy mit csinál az a 2 kondenzátor ott és minek kell 2 láb ehhez. Előre is köszi a segítséget! |
Bejelentkezés
Hirdetés |