Re: defektní PIC16F18015
Jindrich Fucik
fulda na seznam.cz
Středa Duben 3 22:17:38 CEST 2024
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
Další informace o konferenci Hw-list