Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Tudnátok segíteni? Azt szeretném hogy ha NEM nyomok meg egy bizonyos gombot (GP2) akkor menjen aludni a kontroller. De az alábbi programrésszel nem megy, vajon miért nem? A DELAY2 egy 2 mp es várakozás, ez idő alatt kéne lenyomva tartani a gombot. A TRISIO ban a GPIO2 bemenet, az OPTION_REG ben a felhúzás engedélyezve van. (12F675) A nyomógomb földre húzza a GP2 lábat.
CALL DELAY2 ;Hogy legyen idő lenyomni a gombot BTFSC GPIO,2 ;Ha GP2 "0" a sleepet átugorja SLEEP . . . stb Elvileg ha lenyomom a gombot akkor át kéne ugornia a sleepet, ha nem akkor a DELAY2 után aludnia kéne. De nem teszi, lefut az utána következő program rész. Ennek működnie kéne, mit szúrok el megint?
Interrupt vagy a watchdog nem ébreszti fel?
A WDT le van tiltva a configban, a globális megszakítás engedélyezése meg a sleep után futhat csak le.
A PIC et már kicseréltem de az új is ugyanazt csinálja. Kutya legyek ha értem...
Megvan a probléma forrása. A globális interruptot nem volt elég letíltani, a perifériák megszakítását is tiltani kellett. Esetemben a komparátor okozott megszakítást. A globális interrupt ha tiltva van akkor az nem azt jelenti hogy minden megszakítást teljes egészében letiltottam?
A megszakítás globális engedélyezése mindegy a sleep szempontjából. Ha elolvasod a 9.7 fejezetet a power-down mode-ról, akkor ott írja, hogy ha alvás közben beesik egy interrupt, ami engedélyezve van (a megfelelő IE és IF bit is 1), akkor ugyan nem fog megszakítás történni, de a proci felébred.
Idézet: „A globális interrupt ha tiltva van akkor az nem azt jelenti hogy minden megszakítást teljes egészében letiltottam?” De, csakhogy itt nem megszakításról, hanem felébredésről van szó. Ott kicsit máshogy működik, mint ahogy írtam is. Ezt a tulajdonságát direkt ki lehet használni amúgy a felébresztésre anélkül, hogy megszakítási rutint kellene írni.
Értem. Egyébként nem a komparátorra ébredt fel, a komparátor inerruptot a PIE1 regiszterben kell állítani azt meg nem tiltottam le. Érdekelne mi a csuda ébreszthette fel. Most hogy a globális és a periféria megszakítás tiltva van már működik. És ezzel készen is van az első "komolyabb" önállóan (kis segítséggel) megírt programom. Ez a progi egy MP3 rögzítőhöz készült, a diktafon funkciót egésziti ki VOX (hangra induló ) felvételi lehetőséggel.
Köszönöm mindenkinek a segítséget.
Elég, ha úgy maradtak a bitek, nem lettek törölve. Én az összes PIR és PIE bitet törölni szoktam induláskor, ha az interruptokkal valamit szeretnék kezdeni.
Szerintem nem láttad az összes hozzászólásom A "nem megy" annyit jelent hogy lefagy futás közben a program, hiába nézegettem többféle táppal is. Megépítettem két példányban is az áramkört és a két áramkörben különbözik az LCD és a kristály kivitele, tipusa is. Ennek ellenére pontosan ugyanilyen hibák jelentkeznek mind a két panelen. A kristály körüli kondikat még csak az egyik áramkörben próbáltam ki. Ma kipróbálom a másik áramkörön is. A PIC amúgy más programokkal szépen működik.
Kicsit kezdem elveszteni a fonalat.
Arról volt szó korábban, hogy van egy PIC (nem tudom, milyen típus), és van egy Ricoh óraIC. A PIC-nek is van kristálya, vagy az belső oszciról megy és kristálya csak az óraIC-nek van? Nincs valami hevenyészett rajzod, ha az egészet nem akarod feltenni (vagy hol van, ha már feltetted)? Egyébiránt egyetértek potyoval, szerintem is programhiba. Mellesleg tegnap merült fel bennem az a kérdés (és ezt már régebben meg akartam kérdezni, csak nem volt annyira fontos nekem), hogy egy külső óraIC-nél milyen sűrűn illik lekérdezni az időt az órától? Nem az lenne a cél, hogy minél ritkábban tegyük, akkor szinkornizáljunk, és amúgy a PIC számoljon időt?
Holnap hevenyészek egy képet arról, amit próbálok éleszteni. A PIC-en nincs kristály, a belső oszcillátort használja. Kristály csak az óraic-n van. Maga az áramkör elég egyszerű. Egy 16F887 PORTC 3 és 4-re kötve az óraic lábai (SDA, SCL), az óraic-n pedig egy kristály (32768Hz 10ppf). SDA és SCL 5K-val felhúzva Vdd-re. PORTE és PORT B az LCD vezérlés és adat 8 bites módban. Az óra lekérdező rutint beszúrtam korábban (ora.txt), valahol abban akad el mindig a szoftver. WDT OFFon van. Értem az elgondolásod a szinkronizálással, de pont azért szeretnék óraic-t használni, hogy ne a pic dolgozzon az idő előállításával és mérésével, ráadásul ez az IC elvileg elég pontos időt számol+naptár is van benne. Ha 0,5 másodpercenként olvasom ki belőle az adatokat, akkor is megáll a program futás közben. Van hogy 2 órát is elmegy gond nélkül a lekérdezések sűrűségétől függetlenül. Mivel nem régen kezdtem bele a PIC témába, ezért még egyelőre próbálok modul szinten tervezni. Milyen infókat szedjek még ide össze, ami segíthet? Én is szoftverre és a pic hibázására gyanakszom.
Es mit csinal a Kesl100 meg a Wait rutin? Azokat is jo lenne ha latnank, mert igy elso ranezesre olyan hibat nem latok, hogy ez igy ne mukodne... felteve ha Clock_Read -et call-al hivogatod, mert return-t nem latok? Szerintem jobban tudnank segiteni ha az egeszet latnank, mert lehet mashol van a hiba - ill azt irod ebbe hal bele, de pontosan hol?
Amugy meg lehet WDT epp jol jonne - bar meg nem oldja a problemat de akkor folyton resetalni fog a PIC-ed mikor gondja tamad es ujra inicializalsz mindent es latszolagosan jol mukodik... De nyilvan egeszsegesebb lenne eloszor a problema forrasat kigombolyitani.
így van, ahogy trudnai is írta, jó lenne látni mindent, ami ehhez a rutinhoz kapcsolódik (konstansok, hívott szubrutinok).
Én látatlanban olyasmire tudok gondolni, hogy pl. a wait rutin vár arra, hogy az ssp modul készre jelentsen, de mondjuk egy órajel elvesztése miatt ez sosem következik be - ha ez az eset áll elő, akkor be kellene vezetni egy timeout-ot, aminél tovább nem vár a wait, hanem kezdi elölről a lekérdezést. De ez csak egy tipp.
A Kesl100 100us késleltetés, csak tesztből volt benne. Most nincs benne. A Wait pedig vár az óraic jelzésre.
Mindjárt összekaparom a részleteket.
Ez a timeout jó ötlet, bár lehet nem segít, mert egy időre simán lecseréltem a wait ciklust egy 100us késleltetésre (ha jól emlékszem min 52us-ot kér az óraic) és a hiba megmaradt
Ha viszont a WDT-t engedélyezem, akkor mindig le is nullázná az óraic-t. (Write Clock)
Számomra az még mindig nem derült ki, hogy amikor "lefagy", akkor merrefelé jár a programvégrehajtás. Ez fontos lenne, ilyenkor azt szoktam csinálni, hogy egy portra LED-eket teszek, és a program fontos részeiben más és más értékeket írok ki a LED-ekre, ha valahol beragad, akkor a LED-ek állapotából lehet kikövetkeztetni, hogy mi történt.
Nekem itthon DS1307-em van, ami I2C-s, lehet, összedobok egy próbapanelt azzal és egy 16F886-tal (a 887 28 lábú tertvére) meg egy LCD modullal. Ricoh órám csak 3wire SPI-s van, de a jövő héten tervezem, hogy megyek a Chipcadhez, majd veszek egy 372-est is, hogy ki lehessen próbálni. Amúgy az óraIC doksijában a 34. oldalon, az 1.2-6 pontban van leírva az, hogy hogyan lehet rákényszeríteni a kommunikáció alaphelyzetbe hozására (a start kondíció után fél-egy másodperc kivárása). Ha sikerül elkapni, hogy a kommunikáció állt le, akkor meg lehetne próbálni ezzel visszaállítani.
Sziasztok
Letöltöttem az MPLAB v8.0-át a Microchip oldaláról. Hogyan kell vele fordítani? Hova kell írni a programot? Esetleg egy külön TXT-file ba? Néztem a neten is találtam leírást régebbi verziókról, amit meg találtam a 8.0-hoz az nem működik. Mit kell tennem? Hogyan tudok lefordítani egy kész programot?
Azt, hogy a reset WDT miatt következett be, lehet ellenőrizni a RESET rutinban. Ilyenkor nem kell az órát nullázni, csak a perifériákat beállítgatni a normál működéshez.
Keress a microchip oldalán komplett példákat. Nyisd meg, és vizsgáld meg mit hogyan állít be, majd bökj rá a fordítás gombra és ennyi. Ha sikerült, akkor ennek mintájára készíts új projectet...
A teljes működési leírást is megtalálod az oldalukon, angolul. Arra ne számíts, hogy itt bárki nekiáll elmagyarázni egy ilyen bonyolult program működését egy olyan kezdőnek akinek a kérdéseiből látszik, hogy talán még a számítástechnikához se nagyon ért! Ezt kérlek ne vedd sértésnek, főleg akkor ne, ha tévedek! Sok sikert!
LCD-re irattam időnként vele karaktereket, úgy láttam hogy a második start bit után áll le valahol, a kiolvasási folyamatba nem tettem ilyen rutint, mert nem akartam megzavarni a kommunikációt. Tehát az a gyanúm, hogy az olvasási folyamat során áll le. Nagyon köszönöm, hogy ennyire segítőkész vagy! A WDT- Reset nem jutott eszembe, ezzel tényleg működővé lehetne tenni és még az is kiderülne 100%-ra hogy a PIC áll-e le. Ezt lehet, hogy közben kipróbálom. De ha sikerül anélkül megoldani, mégiscsak egyszerűbb lenne a dolog.
Mármint az olvasás megkezdésekor a második start környékén áll meg valahol. A következő ellenőrzési pont az adatbeolvasás után volt, ide már nem jutott el a PIC.
Találtam egy ilyet:
clrf TRISD ; PORTB kimenet Valószínűleg csak a kommentben van rosszul, de a PORTB sehol sincs a kódban kimenetté állítva, vagyis a lábai levegőben lógnak, aminek hatására összeszednek zavarokat. A másik, hogy az equ használatát mellőzni kellene, inkább #define-al adj meg a lábakra szimbólumokat, pl.
Így a kódban csak pl. ennyit kell írnod: BSF LCD_EN Valamint az óra modul címét is #define-al add meg, ne equ-val. A változók elhelyezésére szerintem jobb a CBLOCK ENDC "zárójelek" közé sorolni fel a változókat így:
Ez így kevesebb hibalehetőséget rejt magában, mert biztosan nem kerülnek azonos címre a változók. A te kódodban ilyen szempontból nem találtam hibát, de a fentiek használatával olvashatóbb kódot kapunk.
Szia SzaboZE,
Szilva nem veletlen mondta a LED-et, ott nincsenek idozitesi problemak, ott az vagy vilagit vagy nem... Resetre is be lehetne tenni LED-eket, hogy kulonbozo reset esemenyekre mas-mas LED ebredjen fel - hatha valami van. Amire azonban most gondolok (tul azon, hogy a timeout az kell, bar annak is megvan az eselye, hogy nem ez a hiba), szoval arra gondolnek, hogy mi van ha az LCD-d zavarodik meg, azaz az a 100us kesleltetes a Write rutinban keves?
A portb a kommentben elírás, de most néztem, a program elején már szerepel egyszer a portok beállítása. Ez azért maradhatott benne, mert az egyik áramkörön a B-re van téve az LCD adat, a másikon a D-re és átírásnál a komment így maradt. A többi tanácsot megfogadom, mindjárt át is írom, köszönöm!
|
Bejelentkezés
Hirdetés |