Re: defektní PIC16F18015
Pavel Hudeček
edizon na seznam.cz
Středa Duben 3 22:31:29 CEST 2024
Tak správnej simulátor simuluje reálné chování a ne předpokládané:-)
PH
Dne 03.04.2024 v 22:17 Jindrich Fucik napsal(a):
> Bezva, je tu jeden problém. Program napsaný v céčku se chová mravně.
> Dokonce můj první program na tom procesoru se chová mravně.
> Takže možná existuje něco, co se chová předvídatelně mravně.
>
> O víkendu musím reverzně rozebrat, co vzniklo překladem céčkového
> programu a izovovat z něj tu mravnost.
>
> Udělal jsem si na to i thread na microchip fóru. Doufaje, že se někdo
> chytne a napíše mi k tomu něco:
> https://forum.microchip.com/s/topic/a5CV40000000hUnMAI/t394850
> Nechcete mi do toho vlákna někdo napsat? Klidně i nesprávnou odpověď,
> ale k tématu? Lidé prý mnohem raději opravují nesprávné odpovědi, než
> rovnou vytváří správné.
>
> Nejdivnější je, že se do toho stavu dá dostat i simulátor. To buď
> simulátor interpretuje podobný mikrokód jako procesor, nebo nevím.
>
> Dne 03.04.2024 v 20:53 Miroslav Draxal napsal(a):
>> Tak gratuluji,
>> Zřejmě jste objevil BUG, zdá se, že je vše OK. Je zajímavé, že ta
>> chyba je nadrátovaná i v simulátoru, pokud se spustí kontinuální běh
>> simulátoru, tak se neprojeví. Ale pokud si dáte breakpointy na konec
>> přerušení " a na " movwf INTCON", máte zobrazený analyzér s
>> zmáčknete F5 (nebo rychle mačkáte F5), tak se po chvíli objeví
>> podobné průběhy jako jste posílal.
>> Při jaké konkrétní instrukci nastane problém, nedovedu lokalizovat.
>> Zatím jsem jenom objevil že:
>> 1/ někdy to při vyskočení z přerušení skočí na nesmyslnou, prázdnou
>> programovou adresu a tam to jede dokud čítač programu nepřeteče do
>> 0x0000 (reset)
>> 2/ párkrát dokonce vynuloval T0IE, takže zůstal zacyklená ve smyčce s
>> LATA1, ale přerušení se nekonalo.
>>
>> Jak jste psal, že jste to posílal na support, tak jim tyhle poznatky
>> můžete k tomu problému přeposlat.
>> A dejte vědět jak jste dopadl!!!
>>
>> Míra
>>
>> -----Original Message-----
>> From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of
>> Miroslav Draxal
>> Sent: Wednesday, April 3, 2024 7:20 PM
>> To: 'HW-news'
>> Subject: RE: defektní PIC16F18015
>>
>> Lépe takto
>> -Wa,-a -Wl,-pisrVec=4h, ( tá čárka na konci asi musí být)
>>
>> Můžu potvrdit, že to co vám dělá křemí, dělá i simulátor v MPLABx.
>> Takže hledám něco zakopaného v programu.
>> Míra
>>
>> -----Original Message-----
>> From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of
>> Jindrich Fucik
>> Sent: Wednesday, April 3, 2024 6:18 PM
>> To: hw-list na list.hw.cz
>> Subject: Re: defektní PIC16F18015
>>
>> oops, ten komentář tam zůstal i s definicí SAF. Omlouvám se, správně jen
>> takto:
>> -Wa,-a -Wl,-pisrVec=4h
>>
>> Celej projekt jsem poslal úschovnou, tady třeba lst z optimálního
>> překladu
>>
>> Dne 03.04.2024 v 16:38 Miroslav Draxal napsal(a):
>>> Aha, tak jsem to do Additional options: hodil a ono to zase na mě
>>> vyplivlo při kompilaci:
>>>
>>> Kde zase dělám chybu?
>>>
>>> make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
>>>
>>> make -f nbproject/Makefile-default.mk
>>> dist/default/debug/pokus3.X.debug.hex
>>>
>>> make[2]: Entering directory 'C:/pokus3/pokus3.X'
>>>
>>> "C:\Program Files\Microchip\xc8\v2.46\pic-as\bin\pic-as.exe"
>>> -mcpu=PIC16F18015 -c \
>>>
>>> -o build/default/debug/_ext/539236051/newAsmTemplate.o \
>>>
>>> C:/pokus3/pokus3.X/newAsmTemplate.s \
>>>
>>> -D__DEBUG=1 -mdfp="C:/Program
>>> Files/Microchip/MPLABX/v6.20/packs/Microchip/PIC16F1xxxx_DFP/1.24.387/
>>> xc8"
>>> -msummary=+mem,-psect,-class,-hex,-file,-sha1,-sha256,-xml,-xmlfull
>>> -fmax-errors=20 -mwarn=0 -xassembler-with-cpp -Wa,-a -Wl,-pisrVec=4h
>>> -Wl,-pSAFVec=1F80h
>>>
>>> make[2]: Leaving directory 'C:/pokus3/pokus3.X'
>>>
>>> make[2]: Entering directory 'C:/pokus3/pokus3.X'
>>>
>>> "C:\Program Files\Microchip\xc8\v2.46\pic-as\bin\pic-as.exe"
>>> -mcpu=PIC16F18015 build/default/debug/_ext/539236051/newAsmTemplate.o
>>> \
>>>
>>> -o dist/default/debug/pokus3.X.debug.hex \
>>>
>>> -D__DEBUG=1 -mdfp="C:/Program
>>> Files/Microchip/MPLABX/v6.20/packs/Microchip/PIC16F1xxxx_DFP/1.24.387/
>>> xc8"
>>> -msummary=+mem,-psect,-class,-hex,-file,-sha1,-sha256,-xml,-xmlfull
>>> -mcallgraph=std -Wl,-Map=dist/default/debug/pokus3.X.debug.map
>>> -mno-download-hex -Wa,-a -Wl,-pisrVec=4h -Wl,-pSAFVec=1F80h
>>>
>>> ::: error: (450) psect "SAFVec" was never defined, or is local
>>>
>>> (908) exit status = 1
>>>
>>> make[2]: Leaving directory 'C:/pokus3/pokus3.X'
>>>
>>> make[2]: *** [nbproject/Makefile-default.mk:116:
>>> dist/default/debug/pokus3.X.debug.hex] Error 1
>>>
>>> make[1]: *** [nbproject/Makefile-default.mk:85: .build-conf] Error 2
>>>
>>> make: *** [nbproject/Makefile-impl.mk:39: .build-impl] Error 2
>>>
>>> BUILD FAILED (exit value 2, total time: 1s)
>>>
>>> *From:*Hw-list [mailto:hw-list-bounces na list.hw.cz] *On Behalf Of
>>> *Jindrich Fucik
>>> *Sent:* Wednesday, April 3, 2024 4:01 PM
>>> *To:* HW-news
>>> *Subject:* RE: defektní PIC16F18015
>>>
>>> ne ne, tam je důležitý ten komentář na začátku:
>>>
>>> ; Add this line in the project properties box, pic-as Global Options
>>> -> Additional options:
>>>
>>> ; -Wa,-a -Wl,-pisrVec=4h -Wl,-pSAFVec=1F80h
>>>
>>> V definici projektu je potřeba přidat linker option, že isrVec=4h
>>> Jinak to linker nacpe kam se mu hodí. A kdykoli se neživý předmět může
>>> rozhodnout, tak se rozhodne pro nejméně užitečnou variantu.
>>>
>>> To .c vyzkouším večer doma
>>>
>>> ---------- Původní e-mail ----------
>>> Od: Miroslav Draxal <evik na volny.cz>
>>> Komu: 'HW-news' <hw-list na list.hw.cz>
>>> Datum: 3. 4. 2024 15:30:18
>>> Předmět: RE: defektní PIC16F18015
>>>
>>> Ono není divu, že to nechodí. Koukněte, jak to přeloží, pokud máte
>>>
>>> #define KillMe 1
>>>
>>> #define KillAll 1 V JAKÉKOLI kombinaci
>>>
>>> Interrupt vektor začíná na adresa 0x004 a on to v tomhle překladu
>>> ignoruje.
>>>
>>> Takže než chyba křemíku chyba překladače.
>>>
>>> To PSECT….Je pro mě zlo, jsem rád, že jsem se ho zbavil.
>>>
>>> 87: ;
>>> --------------- Program Section --------------------------------------
>>>
>>> 88:
>>>
>>> 89:
>>>
>>> 90: PSECT
>>> resetVec,class=CODE,delta=2,abs
>>>
>>> 91: resetVec:
>>>
>>> 92: PowerUp:
>>>
>>> 93:
>>>
>>> 0000 018B CLRF INTCON 94: clrf
>>> INTCON ; Disable all interrupts
>>>
>>> 0001 018A CLRF PCLATH 95: clrf
>>> PCLATH ; Tables on page 0
>>>
>>> 96: ;clrf
>>> STATUS ; reset flags
>>>
>>> 97: goto
>>> INIT
>>>
>>> 98:
>>>
>>> 99:
>>>
>>> 100: ;
>>>
>>> 101:
>>> ;*********************************************************************
>>> *************************************************
>>>
>>> 102: ; ISR
>>> (Interrupt Service Routines)
>>>
>>> 103:
>>> ;*********************************************************************
>>> *************************************************
>>>
>>> 104: ;
>>>
>>> 105: PSECT
>>> isrVec,class=CODE,delta=2
>>>
>>> 106: isr:
>>>
>>> 107: Interrupt:
>>>
>>> 108:
>>>
>>> 109:
>>> ;Transmit next bit
>>>
>>> 0002 0140 MOVLB 0x0 110: movlb 0
>>> ; BANK 0
>>>
>>> 0003 1018 BCF LATA, 0x0 111: bcf LATA,0
>>>
>>> 0004 0000 NOP 112: nop
>>>
>>> 0005 1418 BSF LATA, 0x0 113: bsf LATA,0
>>>
>>> 0006 0141 MOVLB 0x1 114:
>>> BANKSEL PIR4 ; BANK 14
>>>
>>> 0007 128C BCF PIR0, 0x5 115: bcf TMR0IF
>>> ; clear timer overflow?
>>>
>>> 0008 0009 RETFIE 116: retfie
>>>
>>> 117:
>>>
>>> *From:*Hw-list [mailto:hw-list-bounces na list.hw.cz] *On Behalf Of
>>> *Jindrich Fucik
>>> *Sent:* Wednesday, April 3, 2024 3:00 PM
>>> *To:* HW-news
>>> *Subject:* RE: defektní PIC16F18015
>>>
>>> Ten můj .S - od slova aSsembler
>>>
>>> To linkování není úplně přesně. Tím "PSECT resetVec" předepisuji, že
>>> se tohle složí na reset vector, což je pro tenhle procesor adresa
>>> 0000. Ten program v zásadě nepřipouští dinamické linkování.
>>>
>>> ---------- Původní e-mail ----------
>>> Od: Miroslav Draxal <evik na volny.cz>
>>> Komu: 'HW-news' <hw-list na list.hw.cz>
>>> Datum: 3. 4. 2024 14:57:25
>>> Předmět: RE: defektní PIC16F18015
>>>
>>> Tak teď jsem přeložil ten váš .c
>>>
>>> Koukám na to
>>>
>>> Míra
>>>
>>> *From:*Hw-list [mailto:hw-list-bounces na list.hw.cz] *On Behalf Of
>>> *Miroslav Draxal
>>> *Sent:* Wednesday, April 3, 2024 2:43 PM
>>> *To:* 'HW-news'
>>> *Subject:* RE: defektní PIC16F18015
>>>
>>> Je skutečně škoda, že jste neposlal ten projekt, ušetřilo by to dost
>>> času. Prostě jsem neviděl jak to přeložilo, do jakých paměťových
>>> lokací.
>>>
>>> Překopal jsem si to do C., protože jsem to proste v asm. Nepřeložil.
>>>
>>> Podle všeho je problém v
>>>
>>> PSECT resetVec,class=CODE,delta=2,abs
>>>
>>> resetVec:
>>>
>>> PowerUp:
>>>
>>> clrf INTCON ; Disable all interrupts
>>>
>>> TADY clrf PCLATH ; Tables on page 0
>>>
>>> ;clrf STATUS ; reset flags
>>>
>>> goto INIT
>>>
>>> po přeložení nevíme od jaké adresy startuje program, to je věc
>>> překladače, C to přeloží od adresy 0x0807
>>>
>>> Pak projede komplet inicializaci a dojde k adrese 0x0821, kde je GOTO
>>> 0x22, ale protože má vynulovaný PCLATH, tak místo aby skočil na adresu
>>> 0x0822 tak skočí na nesmyslnou adresu.
>>>
>>> Schválně to zkuste.
>>>
>>> Dejte vědět. Míra
>>>
>>> -----Original Message-----
>>> From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of
>>> Jindrich Fucik
>>> Sent: Wednesday, April 3, 2024 1:57 PM
>>> To: HW-news
>>> Subject: RE: defektní PIC16F18015
>>>
>>> Trochu si myslím, že přeložením to ztratí kouzlo. Spíš pošlu celý
>>> projekt, nebo ukázku, jak jej mám vytvořený.
>>>
>>> EQU je direktiva EQUivalent. Tedy jenom říká, že když napíšu
>>> TRISA_INI, tak jsem vlastně chtěl napsat 00000000B. Jak tuto hodnotu
>>> použiji už se neřeší. Pokud jí přiřadím jako literál, tak zůstane
>>> literálem:
>>>
>>> movlw TRISA_INI ; tohle přiřadí do W literál 00000000B
>>>
>>> movwf TRISA ; a tohle pak hodnotu z W do TRISA
>>>
>>> Ano, pokud bych použil TRISA_INI jako referenci, byl by to ukazatel do
>>> paměti na pozici 0, ale tak to nedělám.
>>>
>>> V dokumentu "MPLAB_XC8_PIC_Assembler_Users_Guide_50002974.pdf" je
>>> popis v kapitole 4.9.16. Případně poznámka v kapitole 4.6.4.
>>>
>>> Ono jde o to, že tenhle defekt pozoruji právě na té sadě deseti
>>> procesorů co mám doma. Na jiném typu se to neděje a tak mi trvalo
>>> strašnou dobu to pochopit. Je to něco, co používám často a pořád to
>>> funguje, tak to beru jako fakt. Čili zajímavé by bylo to vyzkoušet na
>>> stejném procesoru z jiné série. Třeba na PIC16F15313 žádný problém
>>> není.
>>>
>>> ---------- Původní e-mail ----------
>>>
>>> Od: Miroslav Draxal <evik na volny.cz>
>>>
>>> Komu: 'HW-news' <hw-list na list.hw.cz>
>>>
>>> Datum: 3. 4. 2024 11:32:56
>>>
>>> Předmět: RE: defektní PIC16F18015
>>>
>>> Vytvořte úplně nový projekt na C:\
>>>
>>> Hoďte tam ten váš kód a zkompilujte. Pokud to projede, tak to sem
>>> hoďte.
>>> Bude to mít pár kB.
>>>
>>> Tím eliminujeme nesrovnalosti v nastavení projektu.
>>>
>>> Za moment budu mít čas se na to podívat a třeba to nahrát i do
>>> jiného PICu.
>>>
>>> ALE!
>>>
>>> Všiml jsem si včera letmo, možná že to má nějaký důvod.
>>>
>>> Pokud používáte
>>>
>>> TRISA_INI equ 00000000B;
>>>
>>> Tak TRISA_INI nemá hodnotu 0x00, ale přiřazujete TRISA_INI registr v
>>> nulté stránce paměti RAM s adresou 0x00
>>>
>>> Takže podle mě
>>>
>>> #define TRISA_INI 00000000B
>>>
>>> Nebo
>>>
>>> TRISA_INI set d'0'
>>>
>>> ALE: pokud něco dělám v asm, tak jenom opravuji staré projekty z doby
>>> do 2010 a to ještě v MPLAB8.92, možná se pro mplabx něco změnilo.
>>>
>>> Míra
>>>
>>> From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of
>>> Jindrich Fucik
>>>
>>> Sent: Wednesday, April 3, 2024 10:11 AM
>>>
>>> To: HW-news
>>>
>>> Subject: RE: defektní PIC16F18015
>>>
>>> používám mplabx verze tuším 6.5. V zásadě jsem nic neměnil proti
>>> defaultu, vlastně jen tu definici vektorů, která je napsaná v prvním
>>> řádku kódu.
>>>
>>> Co píše pic-as?
>>>
>>> Vlastné - není problém se jménem souboru, které obsahuje mezery a
>>> mínusko? Pravda je, že v editoru to mám s romantickým náznem default.s
>>>
>>> ---------- Původní e-mail ----------
>>>
>>> Od: Miroslav Draxal <evik na volny.cz>
>>>
>>> Komu: 'HW-news' <hw-list na list.hw.cz>
>>>
>>> Datum: 2. 4. 2024 21:16:30
>>>
>>> Předmět: RE: defektní PIC16F18015
>>>
>>> Nakopněte mě. V jakém editoru to píšete (MPLABx to defect - config.s
>>> otevře) ale nedokážu to asemblovat (pic-as to nějak nebere)
>>>
>>> Míra
>>>
>>> -----Original Message-----
>>>
>>> From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of
>>> Jindrich Fucik
>>>
>>> Sent: Tuesday, April 2, 2024 7:11 PM
>>>
>>> To: hw-list na list.hw.cz
>>>
>>> Subject: Re: defektní PIC16F18015
>>>
>>> Bezva, tak jsem to dotáhl téměř k dokonalosti. Vytvořil jsem kód,
>>> který
>>>
>>> je složený převážně z instrukcí "nop" a "#ifdef". Na začátku jsou pak
>>>
>>> dva #define, které umožňují si vybrat, co se stane. Možnosti jsou:
>>>
>>> 1) program funguje jak má.
>>>
>>> 2) program zamrzne zhruba na 2ms před každým přerušením
>>>
>>> 3) program zamrzne úplně
>>>
>>> Ke stažení jako zip i se záznamem z analyzátoru:
>>>
>>> https://www.uschovna.cz/zasilka/OX4JT76LTH6MCBD2-XU7
>>>
>>> Jdu se zeptat na support, co s tím.
>>>
>>> Dne 01.04.2024 v 22:02 Jindrich Fucik napsal(a):
>>>
>>> > Bezva, tohle funguje jak by se dalo očekávat.
>>>
>>> > Jdu hledat, co tohle udělá jinak než já.
>>>
>>> > V příloze pro porovnání výstup ze Saleae. Je hodně podobný tomu ze
>>>
>>> > simulátoru (ne zcela stejný).
>>>
>>> >
>>>
>>> > Jdu hledat, co je tady nastaveno jinak.
>>>
>>> >
>>>
>>> >
>>>
>>> > Dne 01.04.2024 v 21:08 Miroslav Draxal napsal(a):
>>>
>>> >> Zkuste tohle, ověřeno v MPLABx simulátoru a výstup taktéž MPLABx
>>> Logic
>>>
>>> >> Analyzer (viz příloha).
>>>
>>> >>
>>>
>>> >> #include <xc.h>
>>>
>>> >> #include <pic16f18015.h>
>>>
>>> >>
>>>
>>> >> // Configuration bits: selected in the GUI
>>>
>>> >>
>>>
>>> >> //CONFIG1
>>>
>>> >> #pragma config FEXTOSC = ECH // External Oscillator Selection
>>>
>>> >> bits->EC (external clock) above 16 MHz
>>>
>>> >> #pragma config RSTOSC = HFINTOSC_32MHz // Reset Oscillator
>>>
>>> >> Selection bits->HFINTOSC (32 MHz)
>>>
>>> >> #pragma config CLKOUTEN = OFF // Clock Out Enable bit->CLKOUT
>>>
>>> >> function is disabled; i/o or oscillator function on OSC2
>>>
>>> >> #pragma config VDDAR = HI // VDD Range Analog Calibration
>>> Selection
>>>
>>> >> bit->Internal analog systems are calibrated for operation between
>>> VDD
>>>
>>> >> = 2.3 - 5.5V
>>>
>>> >>
>>>
>>> >> //CONFIG2
>>>
>>> >> #pragma config MCLRE = EXTMCLR // Master Clear Enable bit->If LVP
>>> =
>>>
>>> >> 0, MCLR pin is MCLR; If LVP = 1, RA3 pin function is MCLR
>>>
>>> >> #pragma config PWRTS = PWRT_OFF // Power-up Timer Selection
>>>
>>> >> bits->PWRT is disabled
>>>
>>> >> #pragma config WDTE = OFF // WDT Operating Mode bits->WDT
>>> disabled;
>>>
>>> >> SEN is ignored
>>>
>>> >> #pragma config BOREN = ON // Brown-out Reset Enable
>>> bits->Brown-out
>>>
>>> >> Reset enabled, SBOREN bit is ignored
>>>
>>> >> #pragma config DACAUTOEN = OFF // DAC Buffer Automatic Range
>>> Select
>>>
>>> >> Enable bit->DAC Buffer reference range is determined by the REFRNG
>>> bit
>>>
>>> >> #pragma config BORV = LO // Brown-out Reset Voltage Selection
>>>
>>> >> bit->Brown-out Reset Voltage (VBOR) set to 1.9V
>>>
>>> >> #pragma config ZCD = OFF // ZCD Disable bit->ZCD module is
>>>
>>> >> disabled; ZCD can be enabled by setting the ZCDSEN bit of ZCDCON
>>>
>>> >> #pragma config PPS1WAY = ON // PPSLOCKED One-Way Set Enable
>>>
>>> >> bit->The PPSLOCKED bit can be cleared and set only once after an
>>>
>>> >> unlocking sequence is executed; once PPSLOCKED is set, all future
>>>
>>> >> changes to PPS registers are prevented
>>>
>>> >> #pragma config STVREN = ON // Stack Overflow/Underflow Reset
>>> Enable
>>>
>>> >> bit->Stack Overflow or Underflow will cause a reset
>>>
>>> >>
>>>
>>> >> //CONFIG4
>>>
>>> >> #pragma config BBSIZE = BB512 // Boot Block Size Selection
>>>
>>> >> bits->512 words boot block size
>>>
>>> >> #pragma config BBEN = OFF // Boot Block Enable bit->Boot Block
>>>
>>> >> disabled
>>>
>>> >> #pragma config SAFEN = OFF // Storage Area Flash (SAF) Enable
>>>
>>> >> bit->SAF disabled
>>>
>>> >> #pragma config WRTAPP = OFF // Application Block Write Protection
>>>
>>> >> bit->Application Block is NOT write protected
>>>
>>> >> #pragma config WRTB = OFF // Boot Block Write Protection bit->Boot
>>>
>>> >> Block is NOT write protected
>>>
>>> >> #pragma config WRTC = OFF // Configuration Register Write
>>>
>>> >> Protection bit->Configuration Register is NOT write protected
>>>
>>> >> #pragma config WRTD = OFF // Data EEPROM Write Protection
>>> bit->Data
>>>
>>> >> EEPROM is NOT write-protected
>>>
>>> >> #pragma config WRTSAF = OFF // Storage Area Flash (SAF) Write
>>>
>>> >> Protection bit->SAF is NOT write protected
>>>
>>> >> #pragma config LVP = ON // Low Voltage Programming Enable bit->Low
>>>
>>> >> Voltage programming enabled. MCLR/Vpp pin function is MCLR. MCLRE
>>>
>>> >> Configuration bit is ignored
>>>
>>> >>
>>>
>>> >> //CONFIG5
>>>
>>> >> #pragma config CP = OFF // Program Flash Memory Code Protection
>>>
>>> >> bit->Program Flash Memory code protection is disabled
>>>
>>> >> #pragma config CPD = OFF // Data EEPROM Code Protection
>>> bit->EEPROM
>>>
>>> >> code protection is disabled
>>>
>>> >>
>>>
>>> >> void main(void) {
>>>
>>> >> // Set the CLOCK CONTROL module to the options selected in the
>>>
>>> >> user interface.
>>>
>>> >> //
>>>
>>> >> OSCCON2 = 0x0;
>>>
>>> >> // SOSCPWR Low power;
>>>
>>> >> OSCCON3 = 0x0;
>>>
>>> >> // HFOEN disabled; MFOEN disabled; LFOEN disabled; SOSCEN
>>>
>>> >> disabled; ADOEN disabled;
>>>
>>> >> OSCEN = 0x0;
>>>
>>> >> // HFFRQ 8_MHz;
>>>
>>> >> OSCFRQ = 0x3;
>>>
>>> >> //
>>>
>>> >> OSCSTAT = 0x0;
>>>
>>> >> // TUN undefined;
>>>
>>> >> OSCTUNE = 0x0;
>>>
>>> >> // ACTEN disabled; ACTUD enabled; ACTLOCK Not locked; ACTORS In
>>>
>>> >> range;
>>>
>>> >> ACTCON = 0x0;
>>>
>>> >>
>>>
>>> >>
>>>
>>> >> /**
>>>
>>> >> LATx registers
>>>
>>> >> */
>>>
>>> >> LATA = 0x0;
>>>
>>> >> LATA0 = 1;
>>>
>>> >>
>>>
>>> >> /**
>>>
>>> >> TRISx registers
>>>
>>> >> */
>>>
>>> >> TRISA = 0x34;
>>>
>>> >>
>>>
>>> >> /**
>>>
>>> >> ANSELx registers
>>>
>>> >> */
>>>
>>> >> ANSELA = 0x34;
>>>
>>> >>
>>>
>>> >> /**
>>>
>>> >> WPUx registers
>>>
>>> >> */
>>>
>>> >> WPUA = 0x0;
>>>
>>> >>
>>>
>>> >> /**
>>>
>>> >> ODx registers
>>>
>>> >> */
>>>
>>> >>
>>>
>>> >> ODCONA = 0x0;
>>>
>>> >> /**
>>>
>>> >> SLRCONx registers
>>>
>>> >> */
>>>
>>> >> SLRCONA = 0x37;
>>>
>>> >> /**
>>>
>>> >> INLVLx registers
>>>
>>> >> */
>>>
>>> >> INLVLA = 0x37;
>>>
>>> >>
>>>
>>> >> /**
>>>
>>> >> PPS registers
>>>
>>> >> */
>>>
>>> >>
>>>
>>> >> /**
>>>
>>> >> APFCON registers
>>>
>>> >> */
>>>
>>> >>
>>>
>>> >> /**
>>>
>>> >> IOCx registers
>>>
>>> >> */
>>>
>>> >> IOCAP = 0x0;
>>>
>>> >> IOCAN = 0x0;
>>>
>>> >> IOCAF = 0x0;
>>>
>>> >>
>>>
>>> >> //TMR0H 119;
>>>
>>> >> TMR0H = 0x77;
>>>
>>> >>
>>>
>>> >> //TMR0L 0;
>>>
>>> >> TMR0L = 0x0;
>>>
>>> >>
>>>
>>> >> //T0CS FOSC/4; T0CKPS 1:1; T0ASYNC not_synchronised;
>>>
>>> >> T0CON1 = 0x50;
>>>
>>> >>
>>>
>>> >> //Clear Interrupt flag before enabling the interrupt
>>>
>>> >> PIR0bits.TMR0IF = 0;
>>>
>>> >>
>>>
>>> >> //Enable TMR0 interrupt.
>>>
>>> >> PIE0bits.TMR0IE = 1;
>>>
>>> >>
>>>
>>> >> //T0OUTPS 1:1; T0EN enabled; T016BIT 8-bit;
>>>
>>> >> T0CON0 = 0x80;
>>>
>>> >>
>>>
>>> >> ei();
>>>
>>> >>
>>>
>>> >> do {
>>>
>>> >> LATA1 = 1;
>>>
>>> >> NOP();
>>>
>>> >> LATA1 = 0;
>>>
>>> >> } while (1);
>>>
>>> >> return;
>>>
>>> >> }
>>>
>>> >>
>>>
>>> >> void __interrupt() myHighIsr(void) {
>>>
>>> >> if (TMR0IF == 1) {
>>>
>>> >> TMR0H = 0x77;
>>>
>>> >> TMR0IF = 0;
>>>
>>> >> LATA0 = 0;
>>>
>>> >> NOP();
>>>
>>> >> LATA0 = 1;
>>>
>>> >> }
>>>
>>> >> }
>>>
>>> >>
>>>
>>> >> -----Original Message-----
>>>
>>> >> From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of
>>>
>>> >> Jindrich Fucik
>>>
>>> >> Sent: Monday, April 1, 2024 7:14 PM
>>>
>>> >> To: hw-list na list.hw.cz
>>>
>>> >> Subject: Re: defektní PIC16F18015
>>>
>>> >>
>>>
>>> >> Tak to jsem z toho jelen. Vzal jsem nový procesor a chová se
>>> stejně.
>>>
>>> >> V příloze je obrázek z analyzátoru.
>>>
>>> >> pochopitelně když program krokuji, tak se chová normálně. Nic
>>>
>>> >> takového, že by přerušení skočilo někam jinam a běžel kus jiného
>>>
>>> >> programu.
>>>
>>> >>
>>>
>>> >> Dne 01.04.2024 v 17:22 Jindrich Fucik napsal(a):
>>>
>>> >>> To není můj případ, start přerušení trvá tuším 3 instrukční
>>> cykly,
>>>
>>> >>> procesor jede 8MHz, takže 1,5μs nebo tak něco. Program je velmi
>>>
>>> >>> primitivní, je napsaný v assembleru, abych vyloučil nějakou botu
>>> z
>>>
>>> >>> jazyka.
>>>
>>> >>> Nakopíruji sem podstatnou část programu. Nepodstatná nastavuje
>>> config:
>>>
>>> >>> vypnutý watchdog, interní oscilátor 8MHz a tak.
>>>
>>> >>>
>>>
>>> >>> Program nedělá nic, než že v mainu bliká jedním výstupem a v
>>> přerušení
>>>
>>> >>> druhým. přerušení je od časovače (v příkladu Timer 0, ale stejně
>>> se
>>>
>>> >>> chová i Timer 2) a je nastaveno na 60 μs.
>>>
>>> >>>
>>>
>>> >>> Na analyzátoru je pak velice zřetelné, že proběhne 25 bliknutí
>>> RA1,
>>>
>>> >>> pak je těch 350μs mezera a pak jedno bliknutí RA0 a pak hned zase
>>> 25x
>>>
>>> >>> RA1 (jasně, ten kód není optimální, je to poslední troska, než
>>> jsem to
>>>
>>> >>> zabalil). Podstatné je, že ta díra je větší, než vlastní běh,
>>> takže je
>>>
>>> >>> to velmi zřetelné a nemá cenu zjišťovat, jestli je něco ±
>>> jednotky
>>>
>>> >>> instrukčních cyklů. Zábavné je, že stejný čas dostanu i při
>>> přepnutí
>>>
>>> >>> rychlosti procesoru na 4MHz (tedy díra je asi 350μs, běh se 2x
>>>
>>> >>> prodlouží).
>>>
>>> >>>
>>>
>>> >>> -------
>>>
>>> >>>
>>>
>>> >>> ; Timer0 management ; used for software serial Tx time ticks -
>>>
>>> >>> 60 micro sec per tick T0CON1_INI equ 0x51 ; T0CS FOSC/4; T0CKPS
>>>
>>> >>> 1:2; T0ASYNC not_synchronised; T0CON0_INI equ 0x80 ; T0OUTPS
>>>
>>> >>> 1:1; T0EN enabled; T016BIT 8-bit; TMR0H_INI equ 0x3B ; in 8 bit
>>>
>>> >>> mode the TMR0H is compared same as
>>>
>>> >>> timer2 0x3B = 59 = LN baud rate
>>>
>>> >>>
>>>
>>> >>> PIE0_INI equ 0x20 ; Enable TMR0 interrupt.
>>>
>>> >>> PIE1_INI equ 0x00 ; none used
>>>
>>> >>> PIE2_INI equ 0x00 ; none used
>>>
>>> >>> PIE3_INI equ 0x00 ; none used
>>>
>>> >>> PIE4_INI equ 0x00 ; none used
>>>
>>> >>>
>>>
>>> >>> INTC_INI equ 0xC0 ; GIE enable, PIE enable
>>>
>>> >>>
>>>
>>> >>>
>>>
>>> >>> PSECT resetVec,class=CODE,delta=2,abs
>>>
>>> >>> resetVec:
>>>
>>> >>> PowerUp:
>>>
>>> >>>
>>>
>>> >>> clrf INTCON ; Disable all interrupts
>>>
>>> >>> clrf PCLATH ; Tables on page 0
>>>
>>> >>> ;clrf STATUS ; reset flags
>>>
>>> >>> goto START
>>>
>>> >>>
>>>
>>> >>> PSECT isrVec,class=CODE,delta=2
>>>
>>> >>> isr:
>>>
>>> >>> Interrupt:
>>>
>>> >>>
>>>
>>> >>> movlb 0 ; BANK 0
>>>
>>> >>> bsf LATA,0
>>>
>>> >>> nop
>>>
>>> >>> bcf LATA,0
>>>
>>> >>> nop
>>>
>>> >>> bsf LATA,0
>>>
>>> >>> BANKSEL PIR4 ; BANK 14
>>>
>>> >>> bcf TMR0IF ; clear timer overflow
>>>
>>> >>> retfie
>>>
>>> >>>
>>>
>>> >>> START:
>>>
>>> >>> (...tady je miliarda přiřazení *_INI do správných registrů ...)
>>>
>>> >>>
>>>
>>> >>> movlw INTC_INI ; GIE enable, PEIE enable
>>>
>>> >>> movwf INTCON
>>>
>>> >>>
>>>
>>> >>> movlb 0 ; BANK 0
>>>
>>> >>>
>>>
>>> >>> testloop:
>>>
>>> >>> bsf LATA,1
>>>
>>> >>> nop
>>>
>>> >>> bcf LATA,1
>>>
>>> >>> goto testloop
>>>
>>> >>>
>>>
>>> >>>
>>>
>>> >>> Dne 01.04.2024 v 13:46 Miroslav Draxal napsal(a):
>>>
>>> >>>> Dobrý den,
>>>
>>> >>>> Pozor na to, PICi si při přerušení ukládají registry soft, ne
>>> hw.
>>>
>>> >>>> Kolikrát ta obsluha toho uložení registrů je docela časově
>>> náročná.
>>>
>>> >>>> Standardně se ukládá
>>>
>>> >>>> STATUS
>>>
>>> >>>> WREG
>>>
>>> >>>> BSR
>>>
>>> >>>> Pokud se někde v používájí FSRx registry, a v přerušení Se
>>> používají
>>>
>>> >>>> také, potom se i ty ukládají
>>>
>>> >>>> FSR1
>>>
>>> >>>> FSR1H
>>>
>>> >>>> FSR2
>>>
>>> >>>> FSR2H
>>>
>>> >>>>
>>>
>>> >>>> A můžou se ukládat i další. Při ukončení přerušení se zase
>>> registry
>>>
>>> >>>> obnovují. Tudíž je tam nějaká režie a prodleva, než se přerušení
>>>
>>> >>>> dostane na příslušnou obsluhu. Takže pokud by docházelo k velmi
>>>
>>> >>>> častému přerušení, může se i občas nějaké ztratit.
>>>
>>> >>>>
>>>
>>> >>>> A ještě jedna věc, na kterou se zapomíná.
>>>
>>> >>>> Novější procesory umí ukládat STATUS, WREG, BSR v režimu FAST.
>>> Nebudu
>>>
>>> >>>> vypisovat podrobnosti, nakoukněte do *-.pdf konkrétního PICu,
>>> jestli
>>>
>>> >>>> umí. Ovšem pozor, pokud odlaďujete program třeba s ICDx, potom
>>> tyto
>>>
>>> >>>> FAST rutiny využívá ICDx. Pokud pak natvrdo pustíte program v
>>>
>>> >>>> samotném PICu, tyto rutiny většinou potom používá přerušení s
>>> vysokou
>>>
>>> >>>> prioritou. Takže časování je následně o něco rychlejší než při
>>> ladění
>>>
>>> >>>> HW prostředky.
>>>
>>> >>>>
>>>
>>> >>>> Nahoďte při jaké příležitosti se seká, jestli je to při
>>> periodickém
>>>
>>> >>>> přerušení (např. od TMRx), nebo něčeho externího. Třeba nás něco
>>>
>>> >>>> napadne.
>>>
>>> >>>>
>>>
>>> >>>> Míra
>>>
>>> >>>>
>>>
>>> >>>> -----Original Message-----
>>>
>>> >>>> From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of
>>>
>>> >>>> Jindrich Fucik
>>>
>>> >>>> Sent: Monday, April 1, 2024 12:09 PM
>>>
>>> >>>> To: HW-news
>>>
>>> >>>> Subject: defektní PIC16F18015
>>>
>>> >>>>
>>>
>>> >>>> Ahoj,
>>>
>>> >>>>
>>>
>>> >>>> občas si tu někdo hraje s těmito typy procesorů. Narazil jsem na
>>>
>>> >>>> jeden defektní kus. Bohužel to byl ten, kterej jsem si odvezl na
>>>
>>> >>>> velikonoce a nemám tu náhradu.
>>>
>>> >>>> Projevuje se tak, že při vyvolání přerušení se procesor na cca
>>> 350 μs
>>>
>>> >>>> zasekne. jak to tak bývá, tak mi trvalo dva dny zjistit, co se
>>> děje a
>>>
>>> >>>> proč se nemohu dopočítat času nějaké události.
>>>
>>> >>>>
>>>
>>> >>>> Tak třeba se někomu tato informace bude hodit. Nebo možná někdo
>>> ví o
>>>
>>> >>>> něčem, co jsem špatně nastavil a může mi to říci.
>>>
>>> _______________________________________________
>>>
>>> HW-list mailing list - sponsored by www.HW.cz
>>>
>>> Hw-list na list.hw.cz
>>>
>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>
>>> _______________________________________________
>>> HW-list mailing list - sponsored by www.HW.cz Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>
>>> _______________________________________________
>>> HW-list mailing list - sponsored by www.HW.cz Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>
>>>
>>> _______________________________________________
>>> HW-list mailing list - sponsored by www.HW.cz Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list