Fórum témák
- • Borhűtő vezérlő panel
- • Kapcsolóüzemű tápegység
- • Erősítő mindig és mindig
- • Analóg voltmérő (multiméter)
- • Transzformátor készítés, méretezés
- • Mosogatógép hiba
- • Boombox javítás
- • Opel Astra elektromos hibák
- • Számítógép hiba, de mi a probléma?
- • Elfogadnám, ha ingyen elvihető
- • Li-Ion saját akkucsomag készítése
- • Videomagnó problémák
- • USB 3.2 HUB modul
- • Arduino
- • Kaputelefon
- • Sprint-Layout NYÁK-tervező
- • Adatlapot keresek
- • Rádióamatőrök topikja
- • CNC építése házi alkatrészekből az alapoktól
- • Klíma szervizelés, javítás
- • Autóriasztó és központi zár
- • Elektromos távirányítós kapunyitó
- • Analóg oszcilloszkóp javítása
- • LED szalag
- • Hangszórójavítás (otthon)
- • Mosógép vezérlők és általános problémáik
- • Érdekességek
- • Villanypásztor
- • Kondenzátor
- • IMI villanymotor
- • Digitális adatátvitel
- • Nagyfeszültségű tápegység
- • 3-fázisú Modbus-os teljesítményszabályzó (SCR power controller)
- • Villanyszerelés
- • TDA7294 végerősítő
- • Klíma beszerelése, fűtés-hűtés házilag
- • Kombikazán működési hiba
- • Általános antennás kérdések, válaszok
- • Dobozolási technikák, műszerdobozok
- • Elektronikai témájú könyvek újságok
- • Elektromos vezérlésű pneumatika
- • Internetes rádióvevő
- • Alternativ HE találkozó(k)
- • 3D nyomtatás
- • Felajánlás, azaz ingyen elvihető
- • Akkumulátor töltő
- • Háromfázisú aggregátor
- • Szintetizátor javítás
- • Sütő javítás
- • Laptop javítás, tuning
- • Autós erősítős kérdések, problémák
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • Villanymotor
- • Vegyes barkácsfogások
- • Digitális óra
» Több friss téma
|
Fórum » PIC programozás assemblyben
Hát nem is gondoltam én más nyelvre...
Ezt most nem értettem!
Ez most kinek szólt és mire vonatkozott?
Szerintem a IT rutinon belüli GIE bit piszkálása és a stack összefüggéseire. Mikor elugrik a pic az IT rutinra letiltja az azonos szintű megszakításokat, a RETFIE pedig újra engedélyezi, ezzel neked nem kellene törődni.
Értem, és köszönöm.
Amúgy ezt a cikket több nappal azelőtt zártam le, minthogy erre Hp41C felhívta volna a figyelmemet.
Sziasztok!
Legutóbi cikkem programjával kapcsolatban jött néhány észrevétel.
Úgy gondoltam, feltöltöm ide a programot, hogy a fórumon többen hozzászolhassanak.
;*-----------------------------------------------------------------------------*
;* Fordulatszámmér? 4 digites kijelz?vel *
;* Létrehozva:2015.09.18. *
;*-----------------------------------------------------------------------------*
INCLUDE <P18F14K22.INC> ; includde fájlok megadása
RADIX hex ; alapértelmezet számrendszer megadása
CONFIG FOSC = IRC ; bels? oszcillátor
CONFIG WDTEN = OFF ; watchdog bekapcsolása
CONFIG LVP = OFF ; alacsony feszültség? programozás kikapcsolva
CONFIG MCLRE = OFF ; RA3 bemenetkénti használatra állítása
CBLOCK 0x20
SZJ : 5 ;Számjegyek
LSZ : 2 ;Lebontandó szám
KC ;Kijelz? kikapcsolása
CIKLUS
OSZTANDO : 4
OSZTO : 4
MARADEK : 4
MEROIDO
MB ;Memoriabit
ENDC
org 0x0000 ; program memória kezd? címe
nop ; ICD miatt
GOTO START
org 0x0008
GOTO MEGSZAKITAS
org 0x0028 ; kezd? cím
nop
START
CALL INICIALIZALAS
;--------------------------Kijelzés 1000-es szegmens----------------------------
MAIN
MOVFF KC,LATB
MOVF SZJ+3, W
MOVFF PLUSW0, LATC
BCF LATB,6
CLRF TMR2 ; timer törlése
BCF PIR1,TMR2IF ; túlcsordulás jelz? fleg törlése
BTFSS PIR1,TMR2IF ; flegbit figyelése, ugrik ha "1"
GOTO $-2
;--------------------------Kijelzés 100-As szegmens-----------------------------
MOVFF KC,LATB
MOVF SZJ+2, W
MOVFF PLUSW0, LATC
BCF LATB,4
CLRF TMR2 ; timer törlése
BCF PIR1,TMR2IF ; túlcsordulás jelz? fleg törlése
BTFSS PIR1,TMR2IF ; flegbit figyelése, ugrik ha "1"
GOTO $-2 ; ugrás a feltételhez
;--------------------------Kijelzés 10-es szegmens------------------------------
MOVFF KC,LATB
MOVF SZJ+1, W
MOVFF PLUSW0, LATC
BCF LATB,5
CLRF TMR2 ; timer törlése
BCF PIR1,TMR2IF ; túlcsordulás jelz? fleg törlése
BTFSC MB,7
CALL OSZTAS_32_BIT
BTFSS PIR1,TMR2IF ; flegbit figyelése, ugrik ha "1"
GOTO $-2 ; ugrás a feltételhez
;--------------------------Kijelzés 1-es szegmens-------------------------------
MOVFF KC,LATB
MOVF SZJ, W
MOVFF PLUSW0, LATC
BCF LATB,7
CLRF TMR2 ; timer törlése
BCF PIR1,TMR2IF ; túlcsordulás jelz? fleg törlése
CALL SZAMJEGYBONTAS
BTFSS PIR1,TMR2IF ; flegbit figyelése, ugrik ha "1"
GOTO $-2 ; ugrás a feltételhez
GOTO MAIN
;------------------------------INICIALIZALAS------------------------------------
INICIALIZALAS
CLRF LATA ; kimeneti portok törlése
CLRF LATB ;
CLRF LATC ;
MOVLW B'00000000' ; analóg / digitális bemenetek
MOVWF ANSEL ;
MOVLW B'00011000' ; A port
MOVWF TRISA
MOVLW B'00000000' ; B port kimenet
MOVWF TRISB
MOVLW B'00000000' ; C port kimenet
MOVWF TRISC
MOVLW B'01010010' ; oszcillátor frekvenciája 4Mhz
MOVWF OSCCON
MOVLW B'00111100' ;Multiplex id?zítése 2ms
MOVWF T2CON
;----------------------Megszakítás beállítása
MOVLW B'00000001' ; timer 1 beállítása, el?osztó <5:4>
MOVWF T1CON
MOVLW B'1001000' ; megszakítás bekapcsolása
MOVWF INTCON ;
BSF PIE1,TMR1IE ; TMR1IE 1-be állítása (PIE1 regiszter
BSF IPR1,TMR1IP ; TMR1IP 1-be állítása (IPR1 regiszter
BSF INTCON2,0
MOVLW B'00001000'
MOVWF IOCA
BSF LATA,2
MOVLW D'192' ;(0) kijelzö bitjeinek megadása
MOVWF 0x1
MOVLW D'249'
MOVWF 0x2
MOVLW D'164'
MOVWF 0x3
MOVLW D'176'
MOVWF 0x4
MOVLW D'153'
MOVWF 0x5
MOVLW D'146'
MOVWF 0x6
MOVLW D'130'
MOVWF 0x7
MOVLW D'248'
MOVWF 0x8
MOVLW D'128'
MOVWF 0x9
MOVLW D'144' ;(9)
MOVWF 0xA
MOVLW D'255'
MOVWF KC
;-------------------------------------------------------------------------------
MEGSZAKITAS
BTFSS PIR1,TMR1IF ;Kiváltó ok ellen?rzése
GOTO BEJOVO
BCF PIR1,TMR1IF ; kiváltó ok törlése
INCF MEROIDO
BTFSS MEROIDO,4
GOTO KILEPES
CLRF MEROIDO
CLRF OSZTANDO
CLRF OSZTANDO+1
GOTO KILEPES
BEJOVO
MOVFF PORTA,W
BCF INTCON,0 ;RABIF bit törlése
BTFSC PORTA,3
GOTO KILEPES
BTG MB,1
BTFSC MB,1
GOTO NINCS_ATTOLTES
BTFSC MB,7
GOTO NINCS_ATTOLTES
MOVFF TMR1H,OSZTO+1
MOVFF TMR1L,OSZTO
MOVFF MEROIDO,OSZTO+2
CLRF TMR1L
CLRF TMR1H
CLRF MEROIDO
BSF MB,7
GOTO KILEPES
NINCS_ATTOLTES
CLRF TMR1L
CLRF TMR1H
CLRF MEROIDO
GOTO KILEPES
KILEPES
RETFIE
;------------------------------Osztás 32 biten----------------------------------
OSZTAS_32_BIT
MOVLW D'32' ;32 lépésben végezzük el az osztást
MOVWF CIKLUS
CLRF MARADEK ;a maradék kezdetben nulla legyen
CLRF MARADEK+1
CLRF MARADEK+2
CLRF MARADEK+3
CLRF OSZTO+3
MOVLW H'0'
MOVWF OSZTANDO
MOVLW H'87'
MOVWF OSZTANDO+1
MOVLW H'93'
MOVWF OSZTANDO+2
MOVLW H'03'
MOVWF OSZTANDO+3
BCF STATUS,C ; a Carry bitet töröljük
VIZSGALAT
RLCF OSZTANDO ;ezen a ponto C mindig nulla!
RLCF OSZTANDO+1 ; az osztandóból egy bitet
RLCF OSZTANDO+2 ; átléptetünk a maradékba
RLCF OSZTANDO+3
RLCF MARADEK
RLCF MARADEK+1
RLCF MARADEK+2
RLCF MARADEK+3
MOVF OSZTO,W ;az osztó és a maradék
SUBWF MARADEK,W ;összahasonlítása
MOVF OSZTO+1,W
SUBWFB MARADEK+1,W
MOVF OSZTO+2,W
SUBWFB MARADEK+2,W
MOVF OSZTO+3,W
SUBWFB MARADEK+3,W
BNC NINCS_KIVONAS ;átlépjük, ha az osztó a nagyobb
MOVF OSZTO,W ;az osztóval csökkentjük a maradékot
SUBWF MARADEK
MOVF OSZTO+1,W
SUBWFB MARADEK+1
MOVF OSZTO+2,W
SUBWFB MARADEK+2
MOVF OSZTO+3,W
SUBWFB MARADEK+3
INCF OSZTANDO ;a hányados következ? bitje 1 lesz!
NINCS_KIVONAS
DECFSZ CIKLUS ;ciklus számlálása
BRA VIZSGALAT
BCF MB,7
RETURN
;-----------------Ötjegy? szám lebontása 5 különálló karakterre-----------------
SZAMJEGYBONTAS
CLRF SZJ
CLRF SZJ+1
CLRF SZJ+2
CLRF SZJ+3
CLRF SZJ+4
MOVFF OSZTANDO,LSZ
MOVFF OSZTANDO+1,LSZ+1
TIZEZRESEK
INCF SZJ+4
MOVLW H'10'
SUBWF LSZ,F
MOVLW H'27'
SUBWFB LSZ+1,F
BC TIZEZRESEK
MOVLW H'10'
ADDWF LSZ,F
MOVLW H'27'
ADDWFC LSZ+1
EZRESEK
INCF SZJ+3
MOVLW H'E8'
SUBWF LSZ,F
MOVLW H'03'
SUBWFB LSZ+1,F
BC EZRESEK
MOVLW H'E8'
ADDWF LSZ,F
MOVLW H'03'
ADDWFC LSZ+1
SZAZASOK
INCF SZJ+2
MOVLW H'64'
SUBWF LSZ,F
MOVLW H'0'
SUBWFB LSZ+1,F
BC SZAZASOK
MOVLW H'64'
ADDWF LSZ,F
TIZESEK
INCF SZJ+1
MOVLW H'0A'
SUBWF LSZ,F
BC TIZESEK
MOVLW H'0A'
ADDWF LSZ,W
MOVWF SZJ
INCF SZJ
RETURN
;-------------------------------------------------------------------------------
END
Azt láttad az adatlapban, hogy a belső oszcinak mekkora a hőmérséklet függése? Nem valami pontos. Lehet nem kellene megspórolni az a 200 Ft-ot egy normális külső kvarcra.
Először is hozzátennék néhány gondolatot a timer kezelésről. A 151-es sorban először mented a TMR1H-t, majd az L-et. A timer folyamatosan számol, ezért előfordulhat olyan olyan eset, hogy a számláló pl. 0x01FF-en áll, ilyenkor lemented a H-t -> 0x01, mivel a movff 2 utasításig tart közben a számláló túlcsordul mondjuk 0x0201- re, ha ekkor lemented az L-et -> 0x01-et kapsz, az eredmény ( 0x0101) hibás lesz. Ez ellen megteheted például, hogy megállítod a timert mentés előtt, és csak a regiszterek törlése után indítod újra. A másik lehetőség, hogy mivel ez a pic támogatja a 16 bites timer műveleteket, ha engedélyezed, a TMR1L olvasásakor elmenti a H értékét is, így nem tud túlcsordulni, íráskor pedig a H értékét csak az L írásakor menti be a timer regiszterekbe. Tehát ilyenkor mindíg az L-et kell először olvasni és utoljára írni.
Nos rátapintottál a lényegre. Ezen igen sokat gondolkodtam, de végül nem tudtam megoldani. A timer megállításával próbálkoztam, csakhogy magasabb fordulaton az a 4-5 órajel is számít.
Erről a 16 bites timer mentésről még nem hallottam. Ha részleteznéd, főleg, ha egy pár soros példát készítenél, megköszönném.
Nincs példaprogram, csak a TxCON 7 bitjét (RD16) kell 1-be állítani ![](/pic/smile/smile.gif) .
Ha a megszakítás végén a retfie FAST utasítást írnád, mindenkinek eszébe jutna, hogy az árnyékregiszterekbe mentett értékeket visszateszi a fő regiszterekbe (WREG, STATUS, BSR...)
Az interrupt kezelésről is néhány szó. Először is kijelenthetjük, hogy semmi nem történik egyszerre és azonnal ![](/pic/smile/smile.gif) . A IT rutinra ugrásnak van egy késleltetése (interrupt latency), ami 3-4 utasítás. Ez akkor kerül előtérbe, ha konkurens IT-k kezelése zajlik. Ebben az esetben előfordulhat, hogy ha bejön a mérendő jel, bebillenti a RABIF-et, eltelik két ciklus, közben a timer számlálója is túlcsordul és ő is bebillenti a TMR1IF bitet. Mire az IT rutinra érek nem tudom pontosan mi váltotta ki az IT-t először. Mivel Te csak egy IT kezelsz le egyszerre, ilyenkor mindig a számláló növelése történik először (holott lehet a mérőjel jött előbb), majd ha ez végzett a pic újra belép az IT rutinba és végrehajtja a mentéseket. Ez a késleltetés (mivel ilyenkor a számláló számol tovább) magasabb fordulaton hibát okozhat.
A jelenlegi esetben ez a hiba lehet belefér a kijelzés kerekítésébe, ráadásul magas fordulaton hamar új eredmény születik, így legfeljebb csak felvillan egy hibás eredmény, de a szemünk észre sem veszi.
Idézet: „így legfeljebb csak felvillan egy hibás eredmény, de a szemünk észre sem veszi.”
Ezt már többször tapasztaltam, de azt hittem, az infra jibázik.
Ebben a PIC -ben van CCP modul is. A Timer1 eredményét el lehet tárolni a segítségével. Sőt még azt is meg lehet mondeni, mi történt előbb. Ha a betárolt minta felső bitjei egyesek, akkor a jel váltott előbb, ha 0 -k, akkor a túlcsordulás volt előbb.
Ez jól hangzik, és szivesen alkalmaznám, csak fogalmam sincs róla, hogy ezt hogyan kell.
Igen, a pontos időmérést a CCP modul capture üzemmódjával lehet megvalósítani, de így is működhet, csak ki kell számolni, hogy a timer mentése, törlése és az IT rutin hibája mennyire befolyásolja a pontosságot (mondjuk a belső órajel pontosságát is figyelembe véve), és egyáltalán mekkora pontosságra van szükségem. Szerintem a felvillanásokat a timer mentés hibája okozhatta inkább. Az IT-nél egyszerűen nem kell kiugrani a rutinból, ha végzett a számláló növelésével, hanem továbbengedni, és megvizsgálni közben jött-e RABIF megszakítás (hiszen az is lehetséges, hogy akkor jön mikor már a benn vagyok az IT rutinban és a mérőidőt növelgetem).
És még egy javaslat. Úgy látom ügyesen megoldottad, hogy amíg a számítás és kijelzés zajlik ne változhasson a kijelezendő érték a megszakítás miatt. Én ezt megfordítanám, hogy a mérések folyamatosak legyenek, legfeljebb nem kerül mind kijelzésre (lassú fordulaton úgyis ritkán jön mérés, minek dobáljuk el őket). A 32 bites számolás előtt egy segédváltozóba mentem az értékeket, amivel számolok: PWM_UJRA
BSF KTSTATUS,4 ;a mentés idejére figyeljük az IT-t
;ha közben jön IT az törli ezt a bitet
MOVFW KT_TMR1_FEL
MOVWF REGB0
MOVFW KT_TMR1_FEL1
MOVWF REGB1
MOVFW KT_TMR1_FEL2
MOVWF REGB2
MOVFW KT_TMR1_FEL3
MOVWF REGB3
BTFSS KTSTATUS,4 ;most már mehet
BRA PWM_UJRA
Elég sok infót zúdítottatok rám Hp41C-vel.
Eltartott egy darabig, míg feldolgoztam. Ezek, az álltalatok jelzett hibák mind javításra fognak kerülni. Az is lehet, Hogy Pali79 tanácsa szerint rárakok egy kvarcot, csak nem úgy, ahogy ő gondolja. Arra gondoltam, hogy egy 1MHz-s kvarccal hajtanám Timer1-et, a proci frekijét meg fellőném 16MHz-re. Így a futási sebesség 4x gyorsabb lenne, így csökkenne az elcsúszás a számlálásban, ráadásul az időmérés pontossabbá válna.
Vélemény?
Szia!
Felesleges a timer1-be másik kvarc, a rendszerórajel ottvan és pontos.Csak előosztót kell 4-re állítani. A timer2-őt pedig pofon egyszerű bármilyen frekin másodperc alapú megszakításra állítani.
esetleg t2-t beállítod 1/10 vagy 1/100 másodpercre a ccp1 capture üzemmódjával ott a pontos freki, és nem függ semmilyen programcsúszástól, vagy megszakítás késleltetéstől sem.
üdv.:Foxi A hozzászólás módosítva: Okt 14, 2015
Az lenne a kerdesem, hogy 32 bites adatot hogyan tudnek definialni? Az eeprom-ban szeretnem a program sorai koze. Mint a db es a dw, csak nincs tovabb. A data nem mukodik (nem jelez hibat, de csak wordot fordit) es a dd-re is hibat ad. MPASM-al forditom le.
Elore is koszi.
Sajnos nem jo, csak egyetlen byteot rak le.
Bocsanat, azt meg elfelejtettem, hogy 18F-es sorozatrol van szo, tehat 8 bites mikroproci. A hozzászólás módosítva: Okt 15, 2015
Változó értékről van szó vagy konstansról?
Szia! Ha van kedved böngészni! Mellékletbe betettem egy programrészletemet, ez egy fordulat után már kiírja az eredményt. A progi kb 2/3-át kitöröltem, de a maradékból kihámozható a lényeg.
(Én így csináltam..)
Konstansrol. De sok decimalisrol, szoval ha egy kellene csak, fognam a szamologep HEX-DEC forditojat es beirnam.
Meg tudom oldani igy is trukkosen, csak erdekelne, hogy van-e ilyen az MPLABon belul.
Hát... Mivel 8 bites PIC-et használsz, nem hinném, hogy a fordító támogatná a 32 bites számokat. A 16 bites Timer1 is TMR1L-ből és TMR1H-ból áll és nem egy 16 bitesből.
Szia!
Nincs, de szervezheted úgy az adatokat, hogy 4byte-ot olvas ki egymás után, és leteszi a megfelelő változóba.A mutatót néggyel növeled. Igy mégis tudsz 32 bitet tárolni.Hiszen a 32 bit nem más mint 4byte. Az első helyen a legkisebb helyiértékű byte van és követi a többi. A hozzászólás módosítva: Okt 16, 2015
Az MPLAB elfogadja az 1 Byte-os decimális számokat, nem kell átszámolni hexába.
Ismeri a több bittel rendelkező decimális számokat is: pl .1000 az ezer.
A byte -ra osztását így lehet megoldani:
low(.1000) az alacsony helyiértékű (bit 7..0) byte: 0xE8
high(.1000) az magas helyiértékű (bit 15..8) byte: 0x03
upper(.1000) az felső helyiértékű (bit 23..16) byte: 0x00
|
|