Fórum témák
- • Vezetéknélküli termosztát
- • Kazettás magnó (deck) javítása
- • Audiofil, High End Audio
- • Opel Astra elektromos hibák
- • Hűtőgép kompresszor
- • Elfogadnám, ha ingyen elvihető
- • Kombikazán működési hiba
- • Gáz fogyasztás monitorozása
- • Vicces - mókás történetek
- • Felajánlás, azaz ingyen elvihető
- • Kapcsolóüzemű táp 230V-ról
- • Hűtőgép probléma
- • Arduino
- • Oszcilloszkóp, avagy hogyan kell használni?
- • Klíma szervizelés, javítás
- • Klíma beszerelése, fűtés-hűtés házilag
- • Tápegységgel kapcsolatos kérdések
- • Számítógép hiba, de mi a probléma?
- • Fejhallgató erősítő
- • Labortáp javítás
- • MOSFET-ek
- • Sprint-Layout NYÁK-tervező
- • Tápegység
- • Androidos okos telefonok
- • Tervezzünk nyákot EasyEDA-val
- • Hegesztő inverter javítás
- • Videomagnó problémák
- • Ellenállás
- • Rádióamatőrök topikja
- • Mosógép vezérlők és általános problémáik
- • Szobatermosztát bekötése
- • Villanyszerelés
- • HESTORE.hu
- • Multiméter - miért, milyet?
- • Érdekességek
- • A műhely (bemutató topik, ahol az alkotások készülnek)
- • Villanymotor bekötése
- • Dióda helyettesítés
- • Transzformátor készítés, méretezés
- • Menetszámolós tekercselőgép házilag
- • Leválasztó transzformátor
- • Szigetelésvizsgáló
- • USB 3.2 HUB modul
- • Kamerás megfigyelőrendszer
- • Tranzisztorok helyettesítése
- • Borhűtő vezérlő panel
- • CNC építése házi alkatrészekből az alapoktól
- • Sütő javítás
- • Kondenzátor
- • Eberspacher állófűtés javítása
- • Dobozolási technikák, műszerdobozok
- • Erősítő mindig és mindig
- • Magyarokamarson
- • MyElecParts alkatrész kereső és készlet nyilvántartó
- • Mosogatógép hiba
» Több friss téma
|
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Semmi extrém sürgős, és nem kell műszer pontosság sem. Annyi kell, hogy ha a környezeti sugárzás sokkal nagyobb az átlagosnál (100 nSv/h fölött sokszorosan), akkor azt érzékelni tudja "nincs baj" / "baj van" jelleggel. Például 800 nSv/h már túl sok. Dobok róla privit is emlékeztetőnek, és időnként rádüzenek
Jól értem akkor a main rutinban ban nem tudsz értéket adni konstans tömbnek, hisz
fordításkor az értékadást kihagyja mint pld Const unsigned char t4[4] = {1 ,2,3,4}...
A C-ben ezt a részt nem írhatnád ASM utasításokkal kiegészítve.
Több programozás is engedi, hogy assembler utasítások is lehessenek menet közben
mov .... jnl ... push ... pop stb
Akkor a tömböket memóriacímre ki kellene dolgozni a RAMban
pld a legelső RAMban használható hely címét a LED villogja ki tesztként és onnan lehetne feljebb építkezni ASM és C ben
pld ez a pont 0x20 -
akkor C ben csak egy memória lefoglalást csinálsz
pld unsigned char ramx[ írd be mennyi hely kell ];
tesztként villogtasd le LED el &ramx(0) címét a ramban
mov 0x20,0x20
innentől
mov ptr[0x20]+1,value_x1
mov ptr[0x20]+2,value_x2
...
ezután a C ben
a saját nevű változókhoz illesztheted
de pointeresen kellene megoldani
unsigned char *x1;
*x1=0x21; hopp ezt momentán nem tudom hogy is kell
és a ramx[] et is tudod használni
egy char változó
Leegyszerűsítettem, hogy átláthatóbb legyen.
A LED az A port 0-ás bitjén van. Asm-ben működőképesnek tűnik de futtatás után az értéke 0.
Azt hiszem nem látom a fától az erdőt.
#include <xc.h>
#include "cfg.h"
const int x[] __at(0x900)={0x05,0x07,0x03,0x09};
const int *p;
void main __at(0x800) (void)
{
OSCFRQ = 0b0000011; // 8MHz
TRISA = 0x00;
ANSELA=0x00;
LATA = 0x00;
p=&x[0];
LATA=*p;
while(1);
}
/*
Line Address Opcode Label DisAssy
1 153 0900 0005 PUSH
1 154 0902 0007 DAW
1 155 0904 0003 SLEEP
1 156 0906 0009 TBLRD*+
1 157 0908 0E00 MOVLW 0x0
1 158 090A 6EF8 MOVWF TBLPTRU, ACCESS
1 159 090C 0100 MOVLB 0x0
1 160 090E EF00 GOTO 0x800
1 161 0910 F004 NOP
1 162 0912 FFFF NOP
Line Address Opcode Label DisAssy
1 025 0800 0E03 MOVLW 0x3
1 026 0802 010E MOVLB 0xE
1 027 0804 6FDE MOVWF 0xDE, BANKED
1 028 0806 0E00 MOVLW 0x0
1 029 0808 6E88 MOVWF TRISA, ACCESS
1 030 080A 0E00 MOVLW 0x0
1 031 080C 010F MOVLB 0xF
1 032 080E 6F11 MOVWF 0x11, BANKED
1 033 0810 0E00 MOVLW 0x0
1 034 0812 6E83 MOVWF LATA, ACCESS
1 035 0814 0E00 MOVLW 0x0
1 036 0816 6E01 MOVWF 0x1, ACCESS
1 037 0818 0E09 MOVLW 0x9
1 038 081A 6E02 MOVWF 0x2, ACCESS
1 039 081C 0E00 MOVLW 0x0
1 040 081E 6E03 MOVWF 0x3, ACCESS
1 041 0820 C001 MOVFF 0x1, TBLPTR
1 042 0822 FFF6 NOP
1 043 0824 C002 MOVFF 0x2, TBLPTRH
1 044 0826 FFF7 NOP
1 045 0828 C003 MOVFF 0x3, TBLPTRU
1 046 082A FFF8 NOP
1 047 082C 0008 TBLRD*
1 048 082E CFF5 MOVFF TABLAT, LATA
1 049 0830 FF83 NOP
1 050 0832 D7FF BRA 0x832
1 051 0834 0000 NOP
1 052 0836 FFFF NOP
*/
Ezt a PIC-et (18F25K40) nem tudtam mással fordítani, csak az MPLABX-el.
Én még ilyet nem láttam. Biztos ezek jók így ? mi az az __at(0x800) ?
Az értékadások neked C ből gépi kódra nincsenek, így akkor e teszt, hogy lenne jó ?
A c fájlod elején nem tudsz nem C hanem ASM nyelves értékadásokat adni biztos jó címre
aztán a mainban e címet add meg 1 pointeres változónak. ha LATA 8 bit akkor char legyen a pointeresed is.
A c program fordításának eredménye van a main utáni megjegyzésben, a ROM tartalma.
Lemaradt belőle a 0-ás cím, ahol GOTO 0x908 van.
A fordítás asm eredménye, a tárgykód, a ROM 0x800 címén kezdődik, az adatok 0x900-on.
így ok gondolkodok
a pointert add meg beírt számmal
const char *p;
p=0x900;
*p=0x900;
passz most nem tudom
Nincs változás, megpróbálom az asm-et lefordítani, csak rég csináltam.
A futtatott állományban hexában látszódjon az értékadás ASM módon 5 7 3 9
Futtatás után mindkettő ugyanazt az eredményt adja: LATAbits.LATA0-ra kötött LED 1 másodpercig világít, majd elalszik.
Szimulátorban persze működik, minden a helyén van.
A c program:
#include <xc.h>
#include "cfg.h"
#define _XTAL_FREQ 8000000
const int x[] __at(0x900)={0x0005,0x07,0x03,0x09};
const int *p;
void main __at(0x800) (void)
{
OSCFRQ = 0b0000011; // 8MHz
TRISA = 0x00;
ANSELA=0x00;
LATA = 0x0F;
__delay_ms(1000);
p=&x[0];
LATA=*p;
while(1);
}
A forráskód assemblyben:
list p=18f25k40
#include <p18f25k40.inc>
; CONFIG1L
CONFIG FEXTOSC = OFF ; External Oscillator mode Selection bits (Oscillator not enabled)
CONFIG RSTOSC = HFINTOSC_64MHZ; Power-up default value for COSC bits (HFINTOSC with HFFRQ = 64 MHz and CDIV = 1:1)
; CONFIG1H
CONFIG CLKOUTEN = OFF ; Clock Out Enable bit (CLKOUT function is disabled)
CONFIG CSWEN = ON ; Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
; CONFIG2L
CONFIG MCLRE = INTMCLR ; Master Clear Enable bit (If LVP = 0, MCLR pin function is port defined function; If LVP =1, RE3 pin fuction is MCLR)
CONFIG PWRTE = OFF ; Power-up Timer Enable bit (Power up timer disabled)
CONFIG LPBOREN = OFF ; Low-power BOR enable bit (ULPBOR disabled)
CONFIG BOREN = SBORDIS ; Brown-out Reset Enable bits (Brown-out Reset enabled , SBOREN bit is ignored)
; CONFIG2H
CONFIG BORV = VBOR_2P45 ; Brown Out Reset Voltage ion bits (Brown-out Reset Voltage (VBOR) set to 2.45V)
CONFIG ZCD = OFF ; ZCD Disable bit (ZCD disabled. ZCD can be enabled by setting the ZCDSEN bit of ZCDCON)
CONFIG PPS1WAY = ON ; PPSLOCK bit One-Way Set Enable bit (PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle)
CONFIG STVREN = ON ; Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
CONFIG DEBUG = OFF ; Debugger Enable bit (Background debugger disabled)
CONFIG XINST = OFF ; Extended Instruction Set Enable bit (Extended Instruction Set and Indexed Addressing Mode disabled)
; CONFIG3L
CONFIG WDTCPS = WDTCPS_31 ; WDT Period Select bits (Divider ratio 1:65536; software control of WDTPS)
CONFIG WDTE = OFF ; WDT operating mode (WDT Disabled)
; CONFIG3H
CONFIG WDTCWS = WDTCWS_7 ; WDT Window Select bits (window always open (100%); software control; keyed access not required)
CONFIG WDTCCS = SC ; WDT input clock or (Software Control)
; CONFIG4L
CONFIG WRT0 = OFF ; Write Protection Block 0 (Block 0 (000800-001FFFh) not write-protected)
CONFIG WRT1 = OFF ; Write Protection Block 1 (Block 1 (002000-003FFFh) not write-protected)
CONFIG WRT2 = OFF ; Write Protection Block 2 (Block 2 (004000-005FFFh) not write-protected)
CONFIG WRT3 = OFF ; Write Protection Block 3 (Block 3 (006000-007FFFh) not write-protected)
; CONFIG4H
CONFIG WRTC = OFF ; Configuration Register Write Protection bit (Configuration registers (300000-30000Bh) not write-protected)
CONFIG WRTB = OFF ; Boot Block Write Protection bit (Boot Block (000000-0007FFh) not write-protected)
CONFIG WRTD = OFF ; Data EEPROM Write Protection bit (Data EEPROM not write-protected)
CONFIG SCANE = ON ; Scanner Enable bit (Scanner module is available for use, SCANMD bit can control the module)
CONFIG LVP = OFF ; Low Voltage Programming Enable bit (HV on MCLR/VPP must be used for programming)
; CONFIG5L
CONFIG CP = OFF ; UserNVM Program Memory Code Protection bit (UserNVM code protection disabled)
CONFIG CPD = OFF ; DataNVM Memory Code Protection bit (DataNVM code protection disabled)
; CONFIG5H
; CONFIG6L
CONFIG EBTR0 = OFF ; Table Read Protection Block 0 (Block 0 (000800-001FFFh) not protected table reads executed in other blocks)
CONFIG EBTR1 = OFF ; Table Read Protection Block 1 (Block 1 (002000-003FFFh) not protected table reads executed in other blocks)
CONFIG EBTR2 = OFF ; Table Read Protection Block 2 (Block 2 (004000-005FFFh) not protected table reads executed in other blocks)
CONFIG EBTR3 = OFF ; Table Read Protection Block 3 (Block 3 (006000-007FFFh) not protected table reads executed in other blocks)
; CONFIG6H
CONFIG EBTRB = OFF ; Boot Block Table Read Protection bit (Boot Block (000000-0007FFh) not protected table reads executed in other blocks)
code
org 0
goto start
org 0x800
MOVLW 0x3
MOVLB 0xE
MOVWF 0xDE, BANKED
MOVLW 0x0
MOVWF TRISA, ACCESS
MOVLW 0x0
MOVLB 0xF
MOVWF 0x11, BANKED
MOVLW 0xF
MOVWF LATA, ACCESS
MOVLW 0xB
MOVWF 0x5, ACCESS
MOVLW 0x26
MOVWF 0x4, ACCESS
MOVLW 0x5E
DECFSZ WREG, F, ACCESS
BRA 0x81E
DECFSZ 0x4, F, ACCESS
BRA 0x81E
DECFSZ 0x5, F, ACCESS
BRA 0x81E
MOVLW 0x0
MOVWF 0x1, ACCESS
MOVLW 0x9
MOVWF 0x2, ACCESS
MOVLW 0x0
MOVWF 0x3, ACCESS
MOVFF 0x1, TBLPTR
NOP
MOVFF 0x2, TBLPTRH
NOP
MOVFF 0x3, TBLPTRU
NOP
TBLRD*
MOVFF TABLAT, LATA
NOP
x1 BRA x1
org 0x900
PUSH ; da 5
DAW ; da 7
SLEEP ; da3
TBLRD*+ ; da 9
start
CLRF 0x3, ACCESS
CLRF 0x2, ACCESS
CLRF 0x1, ACCESS
MOVLW 0x0
MOVWF TBLPTRU, ACCESS
MOVLB 0x0
GOTO 0x800
end
A hozzászólás módosítva: Nov 25, 2017
Kikommentelnéd az asm. Kódot?
Én ugyanis kizárólag assemblyben programozok, de nem sikerült rájönnöm, hogy ez mit csinál.
Erre kíváncsi leszek...
Bocs, a címek nélkül valóban nehezen követhető.
Line Address Opcode Label DisAssy
1 0000 EF84 GOTO 0x908 ; ugrás a belépési pontra
Beállítások:
OSCFRQ = 0b0000011; // 8MHz
OSCENbits.HFOEN=0;
TRISA = 0x00;
ANSELA=0x00;
LATA = 0x0F;
1 025 0800 0E03 MOVLW 0x3
1 026 0802 010E MOVLB 0xE
1 027 0804 6FDE MOVWF 0xDE, BANKED
1 028 0806 9DDC BCF 0xDC, 6, BANKED
1 029 0808 0E00 MOVLW 0x0
1 030 080A 6E88 MOVWF TRISA, ACCESS
1 031 080C 0E00 MOVLW 0x0
1 032 080E 010F MOVLB 0xF
1 033 0810 6F11 MOVWF 0x11, BANKED
1 034 0812 0E0F MOVLW 0xF
1 035 0814 6E83 MOVWF LATA, ACCESS
1 036 0816 0E0B MOVLW 0xB
1 037 0818 6E05 MOVWF 0x5, ACCESS
Időzítés 1 másodperc
1 038 081A 0E26 MOVLW 0x26
1 039 081C 6E04 MOVWF 0x4, ACCESS
1 040 081E 0E5E MOVLW 0x5E
1 041 0820 2EE8 DECFSZ WREG, F, ACCESS
1 042 0822 D7FE BRA 0x820
1 043 0824 2E04 DECFSZ 0x4, F, ACCESS
1 044 0826 D7FC BRA 0x820
1 045 0828 2E05 DECFSZ 0x5, F, ACCESS
1 046 082A D7FA BRA 0x820
1,2,3 regiszterek feltöltése a tába olvasáshoz
1 047 082C 0E00 MOVLW 0x0
1 048 082E 6E01 MOVWF 0x1, ACCESS
1 049 0830 0E09 MOVLW 0x9
1 050 0832 6E02 MOVWF 0x2, ACCESS
1 051 0834 0E00 MOVLW 0x0
1 052 0836 6E03 MOVWF 0x3, ACCESS
Tábla regiszterek feltöltése az 1,2,3 címekről
1 053 0838 C001 MOVFF 0x1, TBLPTR
1 054 083A FFF6 NOP
1 055 083C C002 MOVFF 0x2, TBLPTRH
1 056 083E FFF7 NOP
1 057 0840 C003 MOVFF 0x3, TBLPTRU
1 058 0842 FFF8 NOP
Tábla olvasás:
1 059 0844 0008 TBLRD*
Eredményt LATA regiszterbe
1 060 0846 CFF5 MOVFF TABLAT, LATA
1 061 0848 FF83 NOP
Loop
1 062 084A D7FF BRA 0x84A
1 153 0900 0005 PUSH ;da 5
1 154 0902 0007 DAW ; 7
1 155 0904 0003 SLEEP ; 3
1 156 0906 0009 TBLRD*+ ; 9
1 157 0908 6A03 CLRF 0x3, ACCESS ; törlés
1 158 090A 6A02 CLRF 0x2, ACCESS ; törlés
1 159 090C 6A01 CLRF 0x1, ACCESS ; törlés
1 160 090E 0E00 MOVLW 0x0 ; literal
1 161 0910 6EF8 MOVWF TBLPTRU, ACCESS ; regiszterbe
1 162 0912 0100 MOVLB 0x0
1 163 0914 EF00 GOTO 0x800
Mire vagy kíváncsi, talán segíthetek.
Ez változatlanul nem világos. Sőt! Most még kevésbé értem.
Mik ezek a bankváltások?
Miért org 0x800-nál kezdődik a program?
Mihez kell a táblázat kezelő.
Ha már táblázat, hol az adat?
Nem írnád le, mit is csinál ez a program voltaképpen?
Tudsz programot írni assembly nyelven?
A bankváltás banksel-el történik. A banked egy konstans.
MOVWF Move W to f
Syntax: MOVWF f {,a}
If ‘a’ is ‘0’, the Access Bank is selected.
If ‘a’ is ‘1’, the BSR is used to select the GPR bank.
A p18f25k40.inc tartalma érthetővé teszi:
;
...
==========================================================================
; 18xxxx Family EQUates
;==========================================================================
FSR0 EQU 0
FSR1 EQU 1
FSR2 EQU 2
FAST EQU 1
W EQU 0
A EQU 0
ACCESS EQU 0
BANKED EQU 1
;==========================================================================
...
Előfordult már. Jó pár éve jobban benne voltam.
Hallgass sonajkniz-re! Írd le mit is vársz ettől a programtól! Nem tűnik valami nagyon bonyolultnak mégis napok óta egy helyben állsz vele ha jól látom.
Az asm ben hol van az hogy hivatkozol a 0x900 cím tartalmára ?
Azt hittem ilyet látok értékadásnak :
MOVLB 0x9 állítani a bankot ( passz hogy mennyit írj be 0x900 eléréséhez )
momentán nem tudom hogy 0x900 vagy 0x00 lenne a MOVWF után
MOVLW 0x5
MOVWF 0x900,1
MOVLW 0x7
MOVWF 0x901,1
MOVLW 0x3
MOVWF 0x902,1
MOVLW 0x9
MOVWF 0x903,1
és char pointer nek átadás 0x900
Ugyan még nem váltottam bankot PIC18-nál, legfeljebb az alapbankon kívüli regiszterteket állítottam be MOVFF-el
De PIC12-nél a MOVLB 0xakármi bankváltó utasítás.
Egyébként ez a 18F25K40 amennyire kell használnod nagyon eltér a 18F46K22 26K22
programozásától ?
E kettőt amit írtam tudja C ből a te programodat lefordítani úgy hogy az adott globális értékek benne legyenek ?
Ha igen Mi lenne ha arra fordítanád le és ezután lenne csak az átírva ami nem oda esik
Esetleg ha tudom mik azok küldök programot, ami átkonvertál 25K40
pld Config ok stb LATA ha máshova esik és a többi
Ha ezekkel se fordítja jól nem szóltam semmit
Itt is az. A C fordító teszi a programba...
Szerintem jól működik, letárolsz egy 0-át a 900-as címre, és ezt kiolvasod. Mitől világítana a led?
A konstans miatt a 900-as cím a program memóriába kerül, itt nem lehet MOV parancsokkal írni/olvasni, azt a TBLPTR, TABLAT regiszterekkel történik.
Ja ezt a C fordító szülte?
Sűrűn vannak ilyen ötletei? A táblázat címének szánt változót először ramba teszi, majd MOVFF-el rakja a helyére? Remek. Így lesz 2 órajel ciklusból 6, 2 sorból 4. Így nem csoda, hogy komolyabb programoknál kifogy a programmemória és kevés az órajel.
Persze! Ide rakta fel. Itt látszik, hogy a 16 soros C-ből a fordító gyártott egy 119 soros assembly-t.
Nem értem mi a bajod ezzel, első ránézésre azt fordítja ebből amit kell. A ROM területről csak a tblrd utasítással tudsz adatot kinyerni. Amúgy ha pl. bootloader miatt az a célod, hogy 0x800-tól kezdődjön a programod, azt nem így kell megoldani, hanem a project beállításoknál: XC8-linker - additional options kategória - CodeOffset-be 0x800-at adj meg.
|
|