Re: defektní PIC16F18015

Jindrich Fucik fulda na seznam.cz
Pondělí Duben 1 22:02:10 CEST 2024


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
------------- další část ---------------
A non-text attachment was scrubbed...
Name: Screenshot 2024-04-01 215747.png
Type: image/png
Size: 43335 bytes
Desc: [žádný popis není k dispozici]
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240401/364e685a/attachment-0001.png>


Další informace o konferenci Hw-list