Re: defektní PIC16F18015

Jindrich Fucik fulda na seznam.cz
Úterý Duben 2 19:10:46 CEST 2024


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


Další informace o konferenci Hw-list