/*
 * File:   newmain.c
 * Author: A14942
 *
 * Created on 2019? 4? 15? (?), ?? 9:33
 */

// PIC16F1503 Configuration Bit Settings

// 'C' source line config statements

// PIC16F1503 Configuration Bit Settings

// 'C' source line config statements

// PIC16F1503 Configuration Bit Settings

// 'C' source line config statements


// PIC16F1503 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF        // Watchdog Timer Enable (WDT enabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LPBOR = OFF      // Low-Power Brown Out Reset (Low-Power BOR is disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include 


#define _XTAL_FREQ 500000
void main(void) {
    TRISA = 0x00;
    LATA1 = 1;  __delay_ms(200);
    LATA1 = 0;  __delay_ms(200);
    LATA1 = 1;  __delay_ms(200);
    LATA1 = 0;  __delay_ms(200);
    while(1){
        LATA1 ^= 1; __delay_ms(1);
        CLRWDT();
    }
    return;
}

 

 

Posted by KennyShin
,

"

This is the page in order to compare the power consumption between PIC16F15323 and PIC16F1503
 
PIC16F15323 의 Sleep current
 
PIC16F1503 의 Sleep current
 
 
 
PIC16F1503과 PIC16F15323의 Sleep current를 살펴보자
 
PIC16F1503은 0.3uA @ 3.0V
PIC16F15323은 0.42uA @ 3.0V
 
로 PIC16F1503의 대기전력이 더 낮게 측정된다.
 
대기전력이 중요할 경우
PIC16F1503을 사용하자
 
 
PIC12F1501 의 Sleep current
 
PIC12F1501(8핀 MCU)의 Sleep current는 0.3uA로 PIC16F1503(14핀 MCU)과 동일하다.
 

 

 

"

Posted by KennyShin
,

Absolute Maximum Ratings의 의미




PIC16F1503_40001607D.pdf


PIC16F1503 데이터시트의 Absolute Maximum Rating을 발췌한 부분입니다. 이 부분에서 가장 중요하게 봐야 할 부분은 NOTICE부분입니다.

Stresses above those listed under “Absolute Maximum Ratings” may cause permanent damage to the device. This is a stress rating only and functional operation of the device at those or any other conditions above those indicated in the operation listings of this specification is not implied. Exposure above maximum rating conditions for extended periods may affect device reliability  







Google 번역기로 번역해 보면 아래와 같습니다.

 "절대 최대 정격"에 나열된 것 이상의 스트레스는 장치에 영구적 인 손상을 줄 수 있습니다. 이는 스트레스 등급이며 본 사양의 작동 목록에 표시된 것 이상의 조건에서 장치의 기능 작동은 함축되어 있지 않습니다. 장기간 최대 정격 조건을 초과하는 노출은 장치의 신뢰성에 영향을 미칠 수 있습니다. 


Absolute Maximum Ratings를 보고 제품을 설계하면 안됩니다


 맨 마지막 부분에 보면 "Exposure above maximum rating conditions for extended periods may affect device reliability"과 같이 명시하고 있습니다. 최대 정격 조건을 초과하는 노출이 장시간 지속되면 장치의 신뢰성에 영향을 미칠 수 있다고 합니다. 제품 설계시 Absolute Maximum Ratings가 아닌 Standard operating conditions를 기준으로 설계하시는 것을 추천드립니다.


Posted by KennyShin
,

Windowed WDT란? (WWDT)

MCU Basic 2019. 1. 21. 11:00

 기존의 WDT에서는 WDT가 Overflow만 되지 않으면 MCU의 reset이 일어나지 않습니다. 주로 while문 안에 WDT를 계속 reset하는 방법을 사용하거나 특정 함수가 실행될 때마다 reset되도록 사용합니다.


 그런데 Windowed WDT는 기존 WDT(Watch Dog Timer)와 다르게 특정 구간 내에서만 WDT를 Clear 해야 하도록 설계되어 있습니다. 너무 빠르게 또는 너무 느리게 WDT를 Clear 하면 MCU가 오동작하는 것으로 인식하여 reset를 하게 됩니다. 


따라서 특정 구간 내에서만 WDT를 Clear 해야 합니다.




출처: https://www.microchip.com/design-centers/8-bit/peripherals/core-independent/windowed-watch-dog-timer




그러면 Windowed WDT는 왜 사용해야 하는가?


 외부 X-tal failure 가 발생할 때 대부분 90% 정도는 X-tal이 발진하지 않습니다. 이 경우에는 Windowed WDT가  필요하지 않습니다. 


 Windowed WDT를 사용해야 하는 경우는 나머지 10%의 경우를 위해 존재합니다. 예를 들어 X-tal이 발진하면서 Odd harmonic이 발생할 수 있는데 1Mhz crystal은 3,5,7 ... Mhz와 같은 odd harmonic을 만들 수 있습니다. 이 경우 MCU가 더욱 빠른 속도로 동작하거나 MCU가 너무 빠른 Clock에 의해 오동작 할 수 있습니다. 이러한 오동작은 기존의 WDT로는 방지할 수 없습니다. Windowed WDT를 이용해야만 odd harmonic에 의한 오동작을 방지할 수 있습니다. 


Posted by KennyShin
,

MCU 제품군 중 HEF ( High Endurance Flash) 가 지원된다고 표시된 것을 아래에서 확인할 수 있습니다.






PIC12F1501 MCU의 Flash는 1만 번 E/W 가 가능합니다. 하지만 Flash의 일부 영역인 HEF 영역에 대해서는 10만 번 E/W가 가능합니다. (128byte) (참조: EEPROM의 경우 통상 100만 번 E/W입니다.)





만약 EEPROM에 쓰일 정보가 적고 Erase/Write 횟수가 10만 번 이내일 경우 외부 EEPROM이나 내부 EEPROM이 내장된 MCU를 선정하지 않고 MCU 내 부 HEF 영역을 EEPROM 대신에 사용할 수 있습니다.

아래의 링크에서 HEF를 지원하는 MCU를 확인할 수 있습니다.
http://www.microchip.com/ParamChartSearch/Chart.aspx?branchID=1012






Posted by KennyShin
,



This is an example code which can output 300Hz sine waveform using internal DAC on a microcontroller. DAC on a microcontroller has the 10bit resolution but I used only 32step when i make sine waveform


A device that I used is PIC16F1778 and developed on MPLAB X and XC8 v2.0 Compiler


unsigned int cnt=0; unsigned int sin[] = { 512, 611, 707, 796, 873, 937, 984, 1013, 1023, 1013, 984, 937, 873, 796, 707, 611, 512, 412, 316, 227, 150, 86, 39, 10, 0, 10, 39, 86, 150, 227, 316, 412 }; void main(void) { // initialize the device SYSTEM_Initialize(); DAC1CON0bits.DAC1FM = 0; // When using interrupts, you need to set the Global

// and Peripheral Interrupt Enable bits // Use the following macros to: // Enable the Global Interrupts //INTERRUPT_GlobalInterruptEnable(); // Enable the Peripheral Interrupts //INTERRUPT_PeripheralInterruptEnable(); // Disable the Global Interrupts //INTERRUPT_GlobalInterruptDisable(); // Disable the Peripheral Interrupts //INTERRUPT_PeripheralInterruptDisable(); while (1) { // Add your application code // DAC1_Load10bitInputData(sin[cnt++]); //Loading 10bit data to DAC1 DAC1REFL = (uint8_t) sin[cnt]; DAC1REFH = (uint8_t)(sin[cnt++] >> 8); //Loading DAC1 double buffer data to latch. DACLDbits.DAC1LD = 1; __delay_us(100); if(cnt == 32) cnt = 0; } }


The waveform using DAC without Voltage Follower on MCU




The waveform using DAC with Voltage Follower on MCU



The sine waveform is made by polling mode in while loop. If you remove the delay function in while loop, you can see the 8.6kHz sine waveform. It might be maximum output frequency using this microcontroller.



Sinewave_Table.xlsx


PIC16F_DAC_TO_SINE.X.zip



2019/01/02 - [Embedded] - How can i select the optimization level of compiler on MPLAB X?

2019/01/02 - [Embedded] - How much optimize depend on optimization level of compiler?

2018/08/02 - [Embedded/MCU Basic] - XC8 Compiler optimization level


Posted by KennyShin
,

MCC(MPLAB Code Configurator)에서

어떤 디바이스를 지원하는지 알아보겠습니다.

먼저 www.microchip.com/mcc로 이동합니다.


해당 페이지가 나오면 Current Download Tab을 클릭합니다.

Device Libraries와 부분에서 다바이스 정보를 확인할 수 있습니다.










아래에 표시된 8비트 MCU 시리즈를 클릭해 보겠습니다.





클릭해 보면 PDF 파일이 열리는데 맨 마지막 페이지를 보면

어떤 디바이스를 지원하는지 한눈에 확인할 수 있습니다.





























마지막으로 최신 버전의 MCC에서는

AVR MCUs, PIC24 / dsPIC33 / PIC33MM MCUs / PIC32MX MCUs도

지원하는 것을 확인할 수 있었습니다.



Posted by KennyShin
,

Brown out 이란?(BOR)

MCU Basic 2019. 1. 17. 14:41

 브라운 아웃(Brown-out)은 전원의 전류가 부족해서 전압이 정상적으로 인가되지 않는 상황을 뜻합니다. 브라운 아웃의 어원은 백열전구를 사용하던 시절 전원이 부족해서 백열전구의 밝기가 낮아져 그 결과로 빛 색깔이 갈색으로 보이는 현상에서 유래되었습니다.


  마이크로컨트롤러(MCU)의 브라운 아웃은 마이크로컨트롤러의 정상적인 동작 전압 범위 아래로 내려가는 상황을 뜻합니다. 1.8V~5.5V까지 동작 가능한 마이크로컨트롤러의 경우 동작 전압 범위 내에서는 전압이 변해도 동작이 가능합니다. 

 

 하지만 동작 중 전원이 불안정하여 1.8V 이하로 내려가면 마이크로컨트롤러의 정상적인 동작을 보장하기 어렵습니다. 1.8V 이하로 전압이 내려갔다가 다시 정상 전압 범위로 복귀했더라도 문제가 발생할 수 있습니다. 이러한 상황에 놓이게 되면 마이크로컨트롤러 내에 위치한 CPU가 이상 동작을 하여 내부의 Flash를 지워버리거나 심각한 경우 GPIO의 입출력을 바꾸어 쇼트가 되는 상황을 만들 수도 있습니다.


 따라서 브라운 아웃(Brown out)은 시스템을 심각한 상황으로 만들 수 있습니다. 이러한 브라운 아웃을 방지하기 위해 BOR Protection을 해주어야 합니다.





이러한 상황을 방지하기 위해 사용할 수 있는 방법은 대표적으로 2가지 입니다.


첫째, 마이크로컨트롤러에 내장된 BOR(Brown out reset)을 사용

둘째, 외부에 Reset IC를 별도로 추가

  

 Battery를 이용하는 시스템에서는 BOR이나 Reset IC를 사용하지 않기도 합니다. 그 이유는 BOR이나 Reset IC가 파워 소모를 하기 때문에 배터리 수명을 단축시킬 수 있기 때문입니다. 상시 전원을 이용하는 경우에는 비용이 상승되더라도 BOR이나 Reset IC 사용하여 견고한 시스템을 설계하는 것을 추천드립니다.


Posted by KennyShin
,