RE: defektní PIC16F18015
Miroslav Draxal
evik na volny.cz
Pondělí Duben 1 21:08:19 CEST 2024
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
------------- další část ---------------
A non-text attachment was scrubbed...
Name: Analizer.png
Type: image/png
Size: 6693 bytes
Desc: [žádný popis není k dispozici]
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240401/1ed085ff/attachment.png>
Další informace o konferenci Hw-list