Fórum témák
» Több friss téma |
Minek ehhez mikrovezérlő mikor sot 23-6 tokban van ilyen step-down cél áramkör? Ha nagyobb áram kell akkor MC34063, az SO8 as. Céllövöldében is adják vigaszdíjként...
A hozzászólás módosítva: Márc 12, 2020
Köszönöm. Az mindegy hogy milyen sorrendben állítom be a TRIS regisztert és az ADC nél a digit kimenetet a PORTA ra vonatkozólag? Még arra gondoltam hogy előbb átállítom az ADCON regisztert és utána a TRISA t.
A PORTA kimenetek egy analóg kapcsolókat vezérelnek amiknek a vezérlő lábán van egy-egy LED is, tehát a visszajelzés megoldott. A LED ek éppen hogy parázslanak... Ha VDD t adok rájuk akkor világítanak normálisan.
Mindegy milyen sorrendben állítod a regisztereket amíg megelőzik a lábak használatát, szvsz. Esetleg ha skiccelnél egy kapcsolási rajzot, lehet jobb lenne.
A hozzászólás módosítva: Márc 12, 2020
Ok, értem. Otthonról megoldom, most munkahelyen vagyok. Köszi előre is.
Mikor a progid indul(goto ini), az INI, ott a TRISx registerbe akarsz írni, de az melyik bankban is van, nem kéne előbb bankot váltani? (rp0, rp1)
A gyári adatlapban van minta az próbáltad? BCF STATUS, RP0 ; BCF STATUS, RP1 ; Bank0 CLRF PORTA ; Initialize PORTA by ; clearing output ; data latches BSF STATUS, RP0 ; Select Bank 1 MOVLW 0x06 ; Configure all pins MOVWF ADCON1 ; as digital inputs MOVLW 0xCF ; Value used to ; initialize data ; direction MOVWF TRISA ; Set RA<3:0> as inputs ; RA<5:4> as outputs ; TRISA<7:6>are always ; read as '0'.
A bankvaltasok nalam macrok ba meg vannak irva, lasd a program legelejet meg az INI elott. Valtok en is bankot csak nem a "szokvanyos" modon. Nem kozvetlenul a STATUS regiszterbe irok mert a BANK0 - BANK3 macrok ezt megteszik helyettem. A TRISA ha jol emlekszem a BANK 1 ben van, es a BANK1 macro hivasaval meg is tettem a bank valtast.
. A hozzászólás módosítva: Márc 13, 2020
A forrás tabulálása miatt én cimkének néztem a BANK0, BANK1 -et, mivel előbb kezdődik mint az asm utasítások
Ok, no problem. Jeleztem is alább hogy rosszul tördelte a fórummotor e miatt az eredeti forrást. Pl egy sorba rendezett dolgokat ami eleve hibás lenne, de az eredeti forrás nem így néz ki. Nekem viszont így jobban átlátható, ezért használok tabulátort.
Viszont ezzel kapcsolatban eszembe jutott... Macro t nem lehetne rutin helyett használni? Csak mert akkor a CALL utasítás se kéne a rutin híváshoz, elég a macro címe. Az ENDM pedig ugyan oda küldi vissza a programot a macro lefutása után mint a rutinnál a return. Csak úgy eszembe jutott, lehet hülyeség...
Nem szerencsés... A makró teljes tartalma annyifor fordul bele a hex-be ahányszor a forrásban szerepel, míg a rutin csak egyszer bármennyiszer is van használva. Ez pont ezeknél a pic-eknél tud problémákat okozni, amikor a program "kinövi" az első memória lapot és nem elég egy sima utasítás a megfelelő visszatéréshez. További gond lehet még ha egy részt, pl táblázatot stb-t meghatározott helyre teszel és eszre sem veszed, hogy "rálóg" a főprogram vége. Bár utóbbira azt hiszem hibát dob a fordító, az első visztont csak érthetetlen újraindulásokat eredményez.
Értem, köszönöm a fejtágítót. Elsőre működőképes ötletnek tűnt, de gondoltam hogy van valami oka ami miatt nem használják ezt a megoldást.
A hozzászólás módosítva: Márc 13, 2020
Használnak ilyet, és van ahol meg éppen ez a jó megközelítés. A call/return utasításokat meg lehet spórolni, amiknek a futásideje jelentős is lehet. Szubrutin (függvény, metódus, stb) Inline-osítás a neve a technikának.
Valóban egy kompromisszum a sebesség és a programmemória használat között, ezért minden esetben mérlegelni kell a használatát. A helyes megközelítés általában az, hogy ilyesmi optimalizálást csak a kész programon csinálunk azokon a részeken, amik szűk keresztmetszetnek bizonyulnak: azaz elkerüljük a korai optimalizálást.
Értem, akkor nem teljesen "életképtelen" az ötlet csak módjával kell használni, mondhatni kerülendő egy kezdő számára. Én nem vagyok azon a szinten hogy merjem használni, de nem mondom hogy egyszerűbb programoknál nem fogom kipróbálni. Ahol valószínűleg nem is fog gondot okozni, mert nem olyan PIC et használok amiknél van már program lap váltás. Egyszer futottam bele hogy kinőttem egy F628 at, és helyette egy F648 at használtam végül mivel láb kompatibilis csakhogy ott már két memória lap van. Amelyek között váltani kell ha egy rutin még az egyik lapon van de már a másik lapról kell meghívni. Ilyenkor használni kell a lapváltást különben borul a bili. Szenvedtem is vele eleget mire rájöttem hogyan is működik ez.
Szoszo... csak felrémlett hogy a macro kb. ugyan azt csinálja amit a subrutin. Lefut, majd a program folytatódik onnét ahonnan a meg lett hívva. A különbséget nem láttam, de ezt Pali79 érthető módon leírta. Neked is köszönöm a választ, ez is egy alternatíva. Idézet: Van itt egy kis zavar... A 628-nak is 2 lapja van, a 648-nak 3, az általad most használt 877-nek meg már 4. Szóval bele lehet keveredni rendesen. Ha nem akarod szivatni magad ezzel akkor át kell térni a 18F szériára. Nagyon hasonló, de bővített az utasításkészlet és a memória kezelése is egyszerűbb. „Egyszer futottam bele hogy kinőttem egy F628 at, és helyette egy F648 at használtam végül mivel láb kompatibilis csakhogy ott már két memória lap van.” A hozzászólás módosítva: Márc 14, 2020
Igen, valóban a 628 nak is 2 lapja van. Lehet csak nem emlékeztem rá de most megnéztem. Tény, hogy elég nehézkes a lapváltások használata, hamar bele lehet keveredni a dologba. A 18F szériát nem ismerem egyáltalán, eddig csak a 10F - F648 volt a repertoár amikkel foglalkoztam. Azt is évekkel ezelőtt, ezért most sok minden nem ugrik már be. Pl a 877 el kreáltam az első projectemet (mezei futófény ) és semmi gondom nem volt a PORTA val, az RA4 en kívül, ami ugye open draines ezért máshogy működik mint a többi kimenet. De ez igaz a 628/648 ra is. De azt a problémát is "kiszenvedtem" anno. Most még mindig a F877 es PORTA jával szenvedek, az istennek se tudom beállítani kimenetnek és H ba tenni őket. ADCON1 regiszternél minden digit I/O nak beállítva, TRISA nál mind a 6 láb kimenet ("0") , PORTA nál 0 - 5 ig beállítva H ba ("1") . Minden regiszter a megfelelő bankjában van beállítva. 76x átnéztem. Mégse műkszik... Lehet döglött az F877 esem? 10 éve vettem nem is tudom használtam e már. DIL40 es, foglalatban még lehetett. Még a lapváltásokat átnézem de ha az nem lenne a helyén akkor úgy emlékszem a fordításkor hibát dobna és ez pár soros kód gond nélkül lefordul. A PCLATH hoz eleve nem nyúltam, és gondolom defaultban a Page0 án áll eleve, a PCLATH ráadásul mind a 4bankból elérhető tehát a bankváltás hiba is kilőve. Nincs ötletem de szenvedek tovább, hátha rájövök mi a gond. Pl a többi portot nem is próbáltam még (B,C,D,E) ott mit mutat ugyan ez a dolog. Ha azok se mennek akkor lehet döglött a PIC. Még esetléeg arra gondolok hogy a quartz nem rezeg és nincs órajel. 12MHz est használok, ezt találtam. INT_OSC a 877 ben nincs is, így ezt nem tudom kipróbálni hogy úgy menne e és kizárhatnám a quartz hibát. Az oszcillátor tipusa lényegtelen, mehetne belső 4MHz ről is akár. Majd szkóppal ránézek van e órajel.
Nagyon nagy itt a zavar:
Különbséget kell tenni a program memória lapjai és az adat memória bankjai között. Egy program memória lap 2k szót, egy adat memória lap 128 byte -ot jelent. 16F628: 2k program memória lap azaz 1 lap 16F648: 4k program memória lap azaz 2 lap 16F877: 8k program memória lap azaz 4 lap Továbbá nem kell aggódni, hanem át kell nézni a lapok kezelését... Erről írtam is egy cikket ide. Javaslat: 0. lap: Ugrás az inicializáló rutinra (jé! Pont 4 programszó áll rendelkezése... Egy a nyomkövetéshez, kettő a PCLATH felső bitjeinek beállítására és egy az ugrásnak.) és a megszakítási rutin. 1. lap: A többi kód. 2-3. lap: adatok, ugrótáblák. Kis odafigyeléssel szépen működik. Továbbá nem célszerű az bank váló makrok -ban az IRP állítása. Egyrészt sok helyet foglal feleslegesen, másrészt elront(hat)ja a memória indirekt címzés már beállított bankját.
16F877 vagy 16F877A? Van-e benne komparátor? CMCON be van állítva?
Mellékeld a forrást (asm állomány), hogy meg tudjuk vizsgálni.
Sima F877, nincs benne komparátor. Legalábbis CMCON regiszter nincs, és a perifériák közt sem sorolja a datasheet. Már lebutítottam a forrást csak a PORTA állítására, de úgysem megy. Mindjárt felrakom csak kiszedem belőle a tabulátorokat mert megzavarja a fórumon a kód megjelenését.
A hozzászólás módosítva: Márc 14, 2020
Igen, azt értem(?) hogy a bankok és a program memória lapok az 2 külön dolog. Az IRP t azért tettem a macro ba hogy akár melyik címzésmódot használom működjön ugyan az a macro. De ezek szerint ez sem jó megoldás, köszönöm. Nézem a cikket is!
Erről lenne szó...:
A hozzászólás módosítva: Márc 14, 2020
Uppppsz.... a CLRF PORTA eleve hibás a H ba állítás előtt, mivel a program így 12MHz es ütemben folyamatosan ki bekapcsolgatja a már H ba állított kimeneteket...
A hozzászólás módosítva: Márc 14, 2020
Inkább így:
- A makrok definíciója volt hibás. - Az PORTA összes lábának digitálisra állítása a B'00000111' = 0x07 értékkel lehetséges (ld. adatlap Register 11-2) - A program végére kell valami, ami meggátolja, hogy a kontroller újra és újra eljusson a 0 címre. A hozzászólás módosítva: Márc 14, 2020
Köszönöm, próbálom a Te verziódat. Én hiába vettem ki a CLRF PORTA sort változatlanul nem műkszik. De én még a régi macro definíciókat használom egyelőre. Mindjárt módosítom. Vagy a program végére berakok egy sleep et, próbából...
A mikrokontrollerek programja egy végtelen hurok. A sleep mást jelent, elküldi a kontrollert "aludni", alacsony áramfelvételű állapotba.
Sajna így sem megy, lefordul hiba nélkül de fordításkor az output ablak teli van warning al és az összes PORTA marad L ben.
"Warning[207] C:\USERS\USER\DESKTOP\KEYBOARDSIM\KEYBOARDSIM.ASM 15 : Found label after column 1. (BANK0) Warning[207] C:\USERS\USER\DESKTOP\KEYBOARDSIM\KEYBOARDSIM.ASM 22 : Found label after column 1. (BANK1) Warning[207] C:\USERS\USER\DESKTOP\KEYBOARDSIM\KEYBOARDSIM.ASM 29 : Found label after column 1. (BANK2) Warning[207] C:\USERS\USER\DESKTOP\KEYBOARDSIM\KEYBOARDSIM.ASM 36 : Found label after column 1. (BANK3) Warning[207] C:\USERS\USER\DESKTOP\KEYBOARDSIM\KEYBOARDSIM.ASM 68 : Found label after column 1. (INT) Warning[207] C:\USERS\USER\DESKTOP\KEYBOARDSIM\KEYBOARDSIM.ASM 76 : Found label after column 1. (INI) Warning[207] C:\USERS\USER\DESKTOP\KEYBOARDSIM\KEYBOARDSIM.ASM 95 : Found label after column 1. (Loop)"
Igen, de úgy tudom csak a ciklust állítja le, a program futását. A kimenetek állapotát megőrzi, tehát ha a PORTA H ba állítása után aludni küldöm akkor ami H ban volt az H ban is marad. De ha nincs ott a CLRF PORTA akkor is H ban marad csak folyamatosan fut a program és minden cilusban H ba állítja feleslegesen a kimeneteket mivel már amúgy is H ba lettek egyszer állítva. Értelmetlen ez így persze, de ez az egész csak egy próba részemről, miért nem megy a PORTA H ba állítása? Mert így se megy. Lehet hibás a kontrollerem... Másra már nem igen tudok gondolni.
Minden esetre köszönöm szépen a segítségeteket!
A sok warning csak a miatt volt hogy nem a sor elején kezdődtek a cimkék. Egy az egyben másoltam be a kódot és így tördelte a gép az MPLAB alá. A PORTA viszont nem megy, nyomozok tovább. Köszi szépen. Lehet nincs is órajelem pl...
A __config -ban ne állítsd a DEBUG bitet, hanem az MpLab ablakának felső részén a Debug -ot állítsd át Release -ra
|
Bejelentkezés
Hirdetés |