RE: defektní PIC16F18015

Miroslav Draxal evik na volny.cz
Středa Duben 3 15:29:45 CEST 2024


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 

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240403/ae933033/attachment-0001.htm>
------------- další část ---------------
A non-text attachment was scrubbed...
Name: image001.png
Type: image/png
Size: 6564 bytes
Desc: [žádný popis není k dispozici]
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240403/ae933033/attachment-0002.png>
------------- další část ---------------
A non-text attachment was scrubbed...
Name: image002.png
Type: image/png
Size: 3336 bytes
Desc: [žádný popis není k dispozici]
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240403/ae933033/attachment-0003.png>


Další informace o konferenci Hw-list