- Végtelen ciklus:
- LED állapotváltás
- 0,5 s várakozás
Fórum témák
» Több friss téma |
Hali
Folytatja azzal az utasitassal ami van (16F-> 0x3FFF, 18F-> 0xFFFF). Ha vegiger kezdi 0 cimtol ujra. Nem nagyon jo gyakorlat. Jobb egy goto $ utasitas a vegere. Udv Vili
Köszönöm! Most egy fura problémával küzdök. Mégpedig, hogy egy megszakítást követően a programom a 0x05 címen folytatódik, nem pedig ott ahol a meszakítás létrejött. Mi lehet ennek az oka?
![]()
Milyen utasitassal lepsz ki az INT-bol? RETFIE kellene.
Én inkább arra tippelek, hogy nem törli a megszakításjelző flag-et. Vagy azt konkrétan próbálja törölni, de hogy törlődjön, valami más kell hozzá. Szimulátorból meg lehetne nézni, illetve a kódot is felrakhatná...
A RETFIE-t használom, ezért furcsálom a dolgot.
Megnéztem szimulátorral és törli a jelző bitet. Mellékeltem a kódot...
Gondold végig, hardverből van egy call a 0x04 címre, majd innen egy call az INT_SR pontra. Az INT_SR végén ott van egy RETFIE, amivel visszatér az utánra, ahol a CALL INT_SR volt. De a hardveres call-nak nincs párja, vagyis az még vár arra, hogy kapjon még egy return vagy retfie utasítást (ezek csak abban különböznek, hogy a retfie 1-be billenti a GIE bitet). Vagyis pontosan az történik, amit te is látsz. Vagy cseréld le a CALL INT_SR-t GOTO INT_SR-re, vagy pedig az INT_SR végére tegyél egy return-t, és a CALL INT_SR után tedd a RETFIE-t. Harmadik lehetőség, hogy az egész INT_SR blokkot beteszed a 0x04 címre, és akkor nem kell a CALL meg a GOTO sem.
Az ISR rutin elhelyezését ne NOP utasítások beszúrásával csináld, hanem ORG 0x0004-el pozícionáld.
Helló Hp41C
Köszönöm, ezt át fogom tanulmányozni. De már most látom, hogy pl. az 'if' 'else' 'goto' utasításokat én csak a Basic-ben tanultam, az assembly-ben nem láttam. És mi van a másik oldalon, a számítógépnél? LCD kijelzőre már írtam pic-kel. Hogy tudok egy "Helló"-t küldeni a számítógépről az LCD-re? Vagy ez már túl bonyolult? Vagy csak egy adott memória címtől kezdve feltölteni adatokkal a számítógépről. Valami ilyesmivel szeretnék kezdeni. Addig is köszönettel tanulmányozom ezt. Köszönettel
Teljesen igazad van, így már minden ok. Nagyon köszönöm a segítséget! Minden nap tanulok valami újat.
![]() Idézet: Ezek nem utasítások, hanem feltételes fordítási direktívák. Vagyis nem futási időben történik a feltételvizsgálat, hanem fordításkor, attól függően, hogy BaudRate szimbólum a program elején milyen értékkel lett definiálva.„az 'if' 'else' 'goto' utasításokat én csak a Basic-ben tanultam, az assembly-ben nem láttam” Idézet: Én az ehhez hasonló feladatot úgy oldottam meg, hogy PIC-ben egy egyszerű parancsértelmezőt írtam, amelyben minden parancs egy "#" jellel kezdődik, s a következő karakter a parancs (A, B, D, stb.). A parancsbetűt szükség esetén adatok követhetik.„Hogy tudok egy "Helló"-t küldeni a számítógépről az LCD-re?” A főprogram végtelen ciklusában: 1. Várok egy #karakterre (minden mást eldobunk) 2. Várok egy parancs karakterre 3. Elágazás ("switch") a parancs karakter szerint: - Ha "A" akkor pl.analóg port beolvasás, eredmény kiírás soros porton. - Ha "T", akkor további karaktereket várunk, és sorra kiküldjük LCD-re, amíg sorvége jel nem jön. - Ha "C" akkor pl. töröljük az LCD-t. És így tovább... Mindezt egyszerűbb megcsinálni PIC18F4550-nel, és C18 nyelven (ráadásulUSB-n) de assemblyben sem lehetetlen, csak szaporátlan... Ami akapcsolásokat illeti, én a www.microchip.com oldalon levő demókártyák kapcsolását szoktam tanulmányozni, lásd pl. Picdem2 plus, vagy az OLIMEX fejlesztői kártyáiét. (az utóbbi linken soros kommunikációhoz C nyelvű mintaprogram is van, az a Hi-Tech fordítóhoz készült,melynek Lite változata az MPLAB-bal települ, ha kéred (de utólag is telepíthető).
Szia!
Nézd meg itt a propeller óra bázisának programját. Benne meg van írva a bufferelt soros vétel és adás. A parancsokat táblázatos módszerrel dekódolja (eldönti, hogy milyen parancs érkezik, megvárja amíg a kellő számú paraméter beérkezik, aztán végrehajtja - a kimenetet az adási bufferbe írja). Kiválóan működik. PC oldal: Szert kell tenni valamilyen programnyelvre.... Onnan meg kell nyitni a soros illesztőt (COM1,...), be kell állítani a 8 bit, no parity, 1 stopbit formátumot, és a sebességet (pl. 9600). Az adni kívánt táviratot a megnyitott COM-ra vonatkozó file írás művelettel lehet elküldeni. A vétel itt is összetettebb, be kell gyűjteni egy bufferbe a vett karaktereket (a megnyitott COM-ra vonatkozó file olvasás művelettel), meg kell találni a távirat elejét, értelmezni kell a táviratot... if - else - endif --- fordítónak szóló direktívák, ahogy írták... Szia
Helló Hp41C.
Lassan kezdenek az alapok tisztulni. Átolvasom, amiket javasoltál, aztán meglátjuk hogy mire megyek. Addig is köszönöm az irányadó infókat. Kellemes Húsvétot Mindenkinek.
Sziasztok!
Elvileg csináltam egy Knight Rider futófényt, csak hát nem nagyon akar működni. A programsort csatoltam. Tudom a késleltetés enyhén szólva rövid, de nem akartam nektek azt a kódot adni, amiben olyan 30 CALL van egymás után ![]() Előre is köszi a segítséget!
Nem vagyok teljesen biztos benne, de lehet, hogy kellene felhúzóellenállás a felső 4 lábra.
Oda nem BTFSS PORTB,7 kéne?
De igen, csak megpróbáltam úgy is, hogy csak az alsó 4 bitet használom és elfelejtettem visszaírni. Ha azt 7-esre átírom a helyzet nem változik. Így is úgy is annyit csinál, hogy végigfut az alsó 4 LED-en a fény...
Nem hiszem, hogy az lenne a baja, mivel ha a portra 0xFFh-t küldök ki, akkor világít az összes LED.
Összeraktam próbapanelon az áramkört, jól működik.
Szia!
Az rlf PORTB,f illetve az rrf PORTB,f utasítások után várj egy kicsit. A
utasításokat. Ugyanis a PORTB írása után a kivezetéseken nem ugrásszerű a feszültség változása... A másik kérdés, hogy a kivezetésekre hogyan vannak kötve a LED-ek. Ellenőrizd le, hogy a kivezetésenek megjelenő feszültség felmegy-e 4V fölé, lemegy-e 0.8V alá... A másik megoldás, hogy a PORTB helyett a műveletemet egy RAM rekeszen végzed el, és az esedményt movwf PORTB-vel írd a portra... Szia
Oké, köszi a tippeket, majd holnap kipróbálom őket.
Kérdésem lenne egy hozzáértőhöz. Meg csak kezdö vagyok pic téren. A kérdés: Adott két villogó led melyek fél másodpercenként felváltva villognak, mit egy szubrutinnal állítottam be. A villogást egy gomb indítja. Idáig minden jó. Nekem azt kéne megcsináljam, hogy mikor megnyomom a gombot és elindult a villogás,egy másik porton 5mp után folyamatossan világítson egy led ugy, hogy a villogó megy tovább.
A félmásodperces időzítésekből számolj le tízet, s akkor telt le az 5 másodperc, akkor kapcsold be a LED-et.
Az időzítéssel nincs baj, csak a bekapcsolással. Nem tudom hova kell írni a port bekapcs parancsot, úgy, hogy a villogó menjen tovább.16f84-ről van szó.
Feltételezem, hogy a mostani programodban van egy ilyen rész:
Most ezt a végtelen ciklust kell kibővíteni egy feltételes résszel, ilyenre:
Köszi valami ilyesmire gondoltam én is. Próbálkoztam már evvel a verzióval, de nem jött össze.Lehet a parancsokat kevertem össze. Mint már írtam még csak most tanulom a progizást.
A lényeg az, hogy a végtelen ciklus nem szakad meg, csak egy feltételes résszel bővül. A számlálót, amely egy adatregiszter (változó) a RAM területen, természetesen induláskor fel kell tölteni az 5 másodpernek megfelelő ciklusszámmal (jelen esetben 10-zel).
Idézet: Lehet, de ezt a kód ismerete nélkül soha nem fogjuk tudni kideríteni... „Lehet a parancsokat kevertem össze.”
Sziasztok!
Egy olyan kérdésem lenne hozzátok, hogy MPLAB-ban való programozáskor a "_INTRC_OSC_NOCLKOUT" beállítás alapesetben milyen frekvenciájú belső oszcillátorra vonatkozik egy 16F628A-s esetében? A 4MHz-es vagy a 48kHz-es órajelre? Lényegében ezzel a definícióval a PCON regiszter 3-as bitje milyen állapotba kerül? Amúgy a belső órajelek között egy sima BSF/BCF PCON,OSCF utasítással (persze a megfelelő bank-on) tudok váltani a programfutás közben? Gondolom ez után azért eltelik pár utasításciklus, mire beáll a stabil, új órajel... Segítségeteket előre is köszönöm!
A Register 4-6-nál az OSCF bit felett látsz egy R/W-1 jelölést, ami azt jelenti, hogy resetkor ez a bit 1-re áll be. Innen meg már gondolom sejted a választ a 4MHz/48kHz kérdésre.
Tudsz váltani, azt írja, hogy két régi és nyolc új oszcillátorciklus ideig tart a váltás, ez idő alatt a kontroller áll.
Köszönöm.
Most már legalább tudom, hogy mit jelentenek azok a jelölések az adatlapban...eddig totál lényegtelennek tartottam és csak elsiklottam fölötte. Hát erősen tévedtem... Még egyszer köszi a segítséget!
Nem tudom kérdezhetek-e még tőled ebben a témában, de kezdőként nem jutok 1-ről a 2-re. Azthiszem így működnie kéne a felvetett témának.
Egy kicsit több mint amit leírtam.
Kérdezhetsz bátran, legfeljebb nem tudok válaszolni.
![]() Mindenesetre az ebben a hozzászólásomban ajánlott algoritmusnál arra kellene ügyelni, hogy a fő ciklusban levő késleltetések közé ne iktass be újabb késleltetéseket, mert akkor felborul az időlánc! Ha az SF lenne a korábban tárgyalt fő ciklus, akkor abban egy számlálórekeszt kellene csak kezelni (az alap időegység többszörösének meghatározásához), és annak tartalmától függően csökkenteni, vagy nem csökkenteni, illetve kapcsolni vagy nem kapcsolni. Kiugrani és ott újabb késleltetőeljárást beiktatni semmiképp sem ildomos. A JEP eljárásban művelt dolgok ezért biztosan nem odavalók! Mellesleg a JEP eljárás végén a GOTO JELP is érthetetlen számomra. Hogy kerülsz vissza a RETURN-hoz? Az egymás utáni BCF, BSF utasításoknál gond lehet (read-modify-write probléma, nézz utána!), amit pl. úgy kerülhetsz el, hogy B regiszternek egy másolatát tárolsz egy LATB nevű változóban, ezen végzet a bitbillegtetéseket, majd kiírod a PORTB-re. A PIC18 mikrovezérlők ez hardveresen csinálják, itt viszont marad a "magad uram, ha szolgád..." akarom mondani: hardveres LATB regisztered nincsen! A szubrutinokhoz jó lenne odaírni, hogy melyikmitcsinál! Az SPV "piros villogó"megjegyzése viszont félrevezető, mert ez csak egy késleltető eljárás. Ilyenkor a 100ms késleltetés (vagy annyi, amennyi) megjegyzés célravezetőbb volna. |
Bejelentkezés
Hirdetés |