0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PIC18F47Q43 メカナムホイール車 M5AtomLite bluetooth通信

Last updated at Posted at 2024-06-27

40ピンPICマイコン18F47Q43で、メカナムホイール車を動かしました。

IMG_4840.JPG

メカナム車本体

PIC18F47Q43+M5 ATOM Lite

・18F47Q43のPWM1,2,3モジュールと、CCP1,2モジュールを使って、4輪駆動のメカナムホイール車を操作します。

・メカナム車本体受信用でATOM Liteを使用(シリアル通信で受信データをPICマイコンに送信)

無線コントローラ部
・M5AtomLiteを使用しています。
・スーパーファミコンコントローラボタン押下送信

メカナムホイール車の動作

メカナムホイール動作1.jpg
メカナムホイール動作2.jpg

メカナムホイール車 DCモータ部

IMG_4837.JPG

メカナムホイール車 モータ電源部とHブリッジ基板

HブリッジIC BD6211 を4つ使用して、DCモータを駆動しています。
LM371可変電源レギュレータでモータ電源電圧をコントロールしています。(2.5v~3v)
IMG_4826.JPG
BD6211回路図.png

メカナムホイール車 マイコン部PIC18F47Q43

IMG_4843.JPG

メカナム車配線図.jpg

メカナムホイール車 M5Atom Lite bluetooth無線通信部 受信(Q43とシリアル通信で接続)

IMG_4844.JPG

ポート割り振り
port表1.png
port表2.png

無線コントローラ M5Atom Liteとスーパーファミコンコントローラ送信機

コントローラの押下データを、メカナム車搭載のATOM Liteに送信します。
IMG_4841.JPG

ATOM配線図.jpg

メカナム車側本体コード PIC18F47Q43

・PWM1,2,3,およびCCP1,2PWMモジュールのデューティーサイクルは15msで統一しています。
・スーファミコントローラ
L:減速 R:加速 十字キーで移動 A:CW回転 B:CCW回転
・ATOMLiteとUARTで接続し、コントローラから送られてくるデータを受信します。

main
// PIC18F27Q43 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FEXTOSC = OFF    // External Oscillator Selection (Oscillator not enabled)
#pragma config RSTOSC = HFINTOSC_64MHZ// Reset Oscillator Selection (HFINTOSC with HFFRQ = 64 MHz and CDIV = 1:1)

// CONFIG2
#pragma config CLKOUTEN = OFF   // Clock out Enable bit (CLKOUT function is disabled)
#pragma config PR1WAY = OFF     // PRLOCKED One-Way Set Enable bit (PRLOCKED bit can be set and cleared repeatedly)
#pragma config CSWEN = ON       // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)

// CONFIG3
#pragma config MCLRE = EXTMCLR  // MCLR Enable bit (If LVP = 0, MCLR pin is MCLR; If LVP = 1, RE3 pin function is MCLR )
#pragma config PWRTS = PWRT_OFF // Power-up timer selection bits (PWRT is disabled)
#pragma config MVECEN = ON      // Multi-vector enable bit (Multi-vector enabled, Vector table used for interrupts)
#pragma config IVT1WAY = ON     // IVTLOCK bit One-way set enable bit (IVTLOCKED bit can be cleared and set only once)
#pragma config LPBOREN = OFF    // Low Power BOR Enable bit (Low-Power BOR disabled)
#pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled , SBOREN bit is ignored)

// CONFIG4
#pragma config BORV = VBOR_1P9  // Brown-out Reset Voltage Selection bits (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 = OFF     // PPSLOCK bit One-Way Set Enable bit (PPSLOCKED bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle)
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = ON         // Low Voltage Programming Enable bit (Low voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Extended Instruction Set and Indexed Addressing Mode disabled)

// CONFIG5
#pragma config WDTCPS = WDTCPS_31// WDT Period selection bits (Divider ratio 1:65536; software control of WDTPS)
#pragma config WDTE = OFF       // WDT operating mode (WDT Disabled; SWDTEN is ignored)

// CONFIG6
#pragma config WDTCWS = WDTCWS_7// WDT Window Select bits (window always open (100%); software control; keyed access not required)
#pragma config WDTCCS = SC      // WDT input clock selector (Software Control)

// CONFIG7
#pragma config BBSIZE = BBSIZE_512// Boot Block Size selection bits (Boot Block size is 512 words)
#pragma config BBEN = OFF       // Boot Block enable bit (Boot block disabled)
#pragma config SAFEN = OFF      // Storage Area Flash enable bit (SAF disabled)
#pragma config DEBUG = OFF      // Background Debugger (Background Debugger disabled)

// CONFIG8
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block not Write protected)
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers not Write protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not Write protected)
#pragma config WRTSAF = OFF     // SAF Write protection bit (SAF not Write Protected)
#pragma config WRTAPP = OFF     // Application Block write protection bit (Application Block not write protected)

// CONFIG10
#pragma config CP = OFF         // PFM and Data EEPROM Code Protection bit (PFM and Data EEPROM code protection disabled)

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

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include "Q_peripheral27Q43.h"
#include "Q_interrupt27Q43.h"
#include "Q_initialize.h"
#include "Q_I2C1.h"
#include "I2C_LCD.h"
#include "stringFormat.h"
#include  "MCP23017.h"
#include "I2C_LCD.h"
#include "I2C_LCD_BarMeter.h"
#include "RTC_DS3231.h"
#include "EEPROM_24LCxxx.h"
#include "Q_SPI2.h"
#include "MCP23Sxx.h"
#include "DFMRW.h"
#include "ds_ST7735S.h"
#include "ST7735_BarMeter.h"
#include "famicon.h"

void portInit(void);
void oscillatorInit(void);
void vicInit(void);
uint16_t strToInt16(uint8_t *ch, uint8_t _length);



void main(void)
{
    
    uint8_t length,i;
    int16_t val16;
    uint16_t buttonState;
    
    i=0;
    val16=0;
    //CPUハード初期化-----------------------
    portInit();
    oscillatorInit();
    vicInit();
    __delay_ms(100);
  /*  while(1)
    {
        LATCbits.LATC2=1;
        LATCbits.LATC5=1;
        __delay_ms(500);
        LATCbits.LATC2=0;
        LATCbits.LATC5=0;
        __delay_ms(500);
    }*/
    //周辺機能初期化--------------------------------
    timer0Init();//LED表示
    timer1Init();//表示
    //timer2Init();//ADC trigger
    timer3Init();//CCP capture
    timer4Init();//I2C timeOut
    timer6Init();//CCP1 PWM
    //timer6Init();
    usartInit();
    //adcInit();//Timer2も同時に初期化
    pwm1Init();
    pwm2Init();
    pwm3Init();
    CCP1_PWM_Init();
    CCP2_PWM_Init();
    //iocInit();//RC0:input
    //I2C1_Init();//I2C初期化
    //LCD_Init(LcdDeviceAdd);//LCD初期化(PCD8574駆動)
    //Lcd_Mem_Char_Set(LcdDeviceAdd);//LCD CGRAMデータセット
    //LCD_Printf(LcdDeviceAdd,"18F27Q43",8,0x80);
    //LCD_Printf(LcdDeviceAdd,"PWM1 Slice1",11,0xC0);
    //famicon controller
    //famiconInit();
   
    
  
//#define debug
#ifdef debug
    INTCON0bits.IPEN=1;//プライオリティ無し
    INTCON0bits.GIE=1;//Enable all masked interrupts
    while(1)
    {
        printf("%d\n",val16++);
        __delay_ms(500);
         if(rxUsart.completed)
            {
                rxUsart.completed=false;
                printf("%s",rxUsart.buf);
                rxUsart.length=0;
                PIE4bits.U1RXIE=1;
            }
    };
#endif
    
    //グローバル割り込み許可------------------------------------------
    IPR3bits.TMR2IP=1;
    INTCON0bits.IPEN=1;//プライオリティ無し
    INTCON0bits.GIE=1;//Enable all masked interrupts
    
    adcData.val[0]=0x0FFF;
    while(1)
    {
     
        //Timer0割込み処理-------------------------------------
        if(tm0.fg==true)
        {
            tm0.fg=false;
            PORTCbits.RC0=~PORTCbits.RC0;
            T0CON0bits.EN=1;
            PIE3bits.TMR0IE=1;
        }
        
        //Timer1割込み------------------------------------------
        if(tm1.fg==true)
        {
            tm1.fg=false;
            T1CONbits.ON=1;
            PIE3bits.TMR1IE=1;
        }
        
        //USART受信割り込み----------------------------------------
        if(rxUsart.completed)
        {
            rxUsart.completed=false;
            
            buttonState = (uint16_t)strtol(rxUsart.buf,NULL,16);
            
            if(buttonState==0xFFF0)
            {
                PWM1S1P1L=0;
                PWM1S1P2L=0;
                //FR 後ろ
                PWM2S1P1L=0;
                PWM2S1P2L=0;                    
               //RL 前
                PWM3S1P1L=0;
                PWM3S1P2L=0;
                //RR 前
                CCPR1=0;              
                CCPR2=0;    
            }
                          
            if((buttonState&0x0800)==0x0000)//UP
            {
                if((buttonState&0x0200)==0x0000)
                {//左上
                    //FL 停止
                    PWM1S1P1L=0;
                    PWM1S1P2L=0;
                    //FR  前
                    PWM2S1P1L=adcData.val[0]>>4;
                    PWM2S1P2L=0;
                    //RL 前
                    PWM3S1P1L=adcData.val[0]>>4;
                    PWM3S1P2L=0;
                    //RR  停止
                    CCPR1=0;              
                    CCPR2=0;   
                }
                else
                {
                    if((buttonState&0x0100)==0x0000)
                    {//右上
                        //FL 前
                        PWM1S1P1L=adcData.val[0]>>4;
                        PWM1S1P2L=0;
                        //FR  停止
                        PWM2S1P1L=0;
                        PWM2S1P2L=0;
                        //RL 停止
                        PWM3S1P1L=0;
                        PWM3S1P2L=0;
                        //RR 前
                        CCPR1=adcData.val[0]>>2;              
                        CCPR2=0;   
                    }else
                    {//前進
                        //FL 前
                        PWM1S1P1L=adcData.val[0]>>4;
                        PWM1S1P2L=0;
                        //FR  前
                        PWM2S1P1L=adcData.val[0]>>4;
                        PWM2S1P2L=0;
                        //RL 前
                        PWM3S1P1L=adcData.val[0]>>4;
                        PWM3S1P2L=0;
                        //RR 前
                        CCPR1=adcData.val[0]>>2;              
                        CCPR2=0;   
                    }
                }
            }
             
            if((buttonState&0x0400)==0x0000)//DOWN
            {
                if((buttonState&0x0200)==0x0000)
                {//左下
                    //FL 後ろ
                    PWM1S1P1L=0;
                    PWM1S1P2L=adcData.val[0]>>4;
                    //FR 停止
                    PWM2S1P1L=0;
                    PWM2S1P2L=0;
                    //RL 停止
                    PWM3S1P1L=0;
                    PWM3S1P2L=0;
                    //RR 後ろ
                    CCPR1=0;
                    CCPR2=adcData.val[0]>>2;
                }else
                {
                    if((buttonState&0x0100)==0x0000)
                    {//右下
                        //FL 停止
                        PWM1S1P1L=0;
                        PWM1S1P2L=0;
                        //FR 後ろ
                        PWM2S1P1L=0;
                        PWM2S1P2L=adcData.val[0]>>4;
                        //RL 後ろ
                        PWM3S1P1L=0;
                        PWM3S1P2L=adcData.val[0]>>4;
                        //RR 停止
                        CCPR1=0;
                        CCPR2=0;
                    }else
                    {//後進
                        //FL 後ろ
                        PWM1S1P1L=0;
                        PWM1S1P2L=adcData.val[0]>>4;
                        //FR 後ろ
                        PWM2S1P1L=0;
                        PWM2S1P2L=adcData.val[0]>>4;
                        //RL 後ろ
                        PWM3S1P1L=0;
                        PWM3S1P2L=adcData.val[0]>>4;
                        //RR 後ろ
                        CCPR1=0;
                        CCPR2=adcData.val[0]>>2;
                    }                    
                }               
            }
             
            if(((buttonState&0x0800)!=0x0000) && ((buttonState&0x0400)!=0x0000)) 
            {
                if((buttonState&0x0200)==0x0000)//LEFT
                {//左すべり
                    //FL 後
                    PWM1S1P1L=0;
                    PWM1S1P2L=adcData.val[0]>>4;
                    //FR  前
                    PWM2S1P1L=adcData.val[0]>>4; 
                    PWM2S1P2L=0;                   
                    //RL 前
                    PWM3S1P1L=adcData.val[0]>>4;
                    PWM3S1P2L=0;
                    //RR 後
                    CCPR1=0;
                    CCPR2=adcData.val[0]>>2;
                }
             
                if((buttonState&0x0100)==0x0000)//RIGHT
                {//右すべり
                    //FL 前
                    PWM1S1P1L=adcData.val[0]>>4;
                    PWM1S1P2L=0;
                    //FR 後ろ
                    PWM2S1P1L=0;
                    PWM2S1P2L=adcData.val[0]>>4;                    
                    //RL 後ろ
                    PWM3S1P1L=0;
                    PWM3S1P2L=adcData.val[0]>>4;
                    //RR 前
                    CCPR1=adcData.val[0]>>2;              
                    CCPR2=0;    
                }
                
                if((buttonState&0x8000)==0x0000)
                {//CW
                    //FL 前
                    PWM1S1P1L=adcData.val[0]>>4;
                    PWM1S1P2L=0;
                    //FR 後ろ
                    PWM2S1P1L=0;
                    PWM2S1P2L=adcData.val[0]>>4;                    
                    //RL 前
                    PWM3S1P1L=adcData.val[0]>>4;
                    PWM3S1P2L=0;
                    //RR 後ろ
                    CCPR1=0;             
                    CCPR2=adcData.val[0]>>2;     
                }
                
                if((buttonState&0x0080)==0x0000)
                {//CCW
                    //FL 後
                    PWM1S1P1L=0;
                    PWM1S1P2L=adcData.val[0]>>4;
                    //FR 前
                    PWM2S1P1L=adcData.val[0]>>4;  
                    PWM2S1P2L=0;
                    //RL 後
                    PWM3S1P1L=0;
                    PWM3S1P2L=adcData.val[0]>>4;
                    //RR 前
                    CCPR1=adcData.val[0]>>2;             
                    CCPR2=0;
                }
                
                
            }    
            
            if((buttonState&0x0020)==0x0000)
            {//減速
                adcData.val[0]-=100;
                if(adcData.val[0]<110)
                    adcData.val[0]=10;
            }

            if((buttonState&0x0010)==0x0000)
            {//加速
                adcData.val[0]+=100;
                if(adcData.val[0]>0x0FFF)
                    adcData.val[0]=0x0FFF;
            }
            
            
             PWM1CONbits.LD=1;
             PWM2CONbits.LD=1;
             PWM3CONbits.LD=1;
             while(PWM1CONbits.LD);  
             while(PWM2CONbits.LD);
             while(PWM3CONbits.LD);
             PIE1bits.ADIE=1;
             //ADCON0bits.ON=1;
             PIE3bits.TMR2IE=1;
             T2CONbits.TMR2ON=1;
             //Usart復帰
             rxUsart.length=0;
             PIE4bits.U1RXIE=1;
        }
       
    }
    return;
}

void oscillatorInit(void)
{
    //オシレータ設定----------------
    OSCCON3bits.CSWHOLD=1;//Hold
    OSCCON1bits.NDIV=1;//64Mhz/2=32Mhz;
    while(!OSCCON3bits.NOSCR);
    while(!PIR0bits.CSWIF);//ready state
    PIR0bits.CSWIF=0;
    OSCCON3bits.CSWHOLD=0;
    while(!OSCCON3bits.ORDY);
}

void portInit(void)
{
    //ポート設定----------------------    
    PORTA=0x00;
    LATA=0x00;
    ANSELA=0x00;
    TRISA=0x00;
    
    PORTB=0x00;
    LATB=0x00;
    ANSELB=0x00;
    TRISB=0x00;
    
    PORTC=0x00;
    LATC=0x00;
    ANSELC=0x00;
    TRISC=0x00;
   
    PORTD=0x00;
    LATD=0x00;
    ANSELD=0x00;
    TRISD=0x00;
    
    
    PORTE=0x00;
    LATE=0x00;
    ANSELE=0x00;
    TRISE=0x00;
   
     //PPS---------------------
    PPSLOCK = 0x55;
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 0;
    
    //I2C1-------------------------
    //RC4 for SDA
    RC4PPS=0x38;
    I2C1SDAPPS=0x14;
    //RC3 for SCL
    RC3PPS = 0x37;
    I2C1SCLPPS=0x13;
    
    PPSLOCK = 0x55;
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 1;
    
    ODCONCbits.ODCC3=1;
    ODCONCbits.ODCC4=1;
    
    RC3I2Cbits.TH=1;
    RC4I2Cbits.TH=1;
    
}

void vicInit(void)
{
 //割り込みテーブルaddress設定----------------------------------
    INTCON0bits.GIE=0;//Enable all masked interrupts
    IVTLOCK=0x55;
    IVTLOCK=0xAA;
    IVTLOCKbits.IVTLOCKED=0;
    IVTBASE = 0x000008;
    IVTLOCK=0x55;
    IVTLOCK=0xAA;
    IVTLOCKbits.IVTLOCKED=1;
}

uint16_t strToInt16(uint8_t *ch, uint8_t _length)
{
    uint8_t i;
    uint16_t ret;
    ret = strtol(ch,NULL,16);
}
Q_Peripheral.c

#include "Q_peripheral27Q43.h"

//*****************************************************//
//USART初期化
//*****************************************************//
_rxUsart rxUsart;
void usartInit(void)
{
    //6.PPS
    PPSLOCK = 0x55; 
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 0;//Unlock.
    U1RXPPS=0b010111;//RC7:rx
    RC6PPS=0x20;//RC6:tx
    TRISC|=0x80;
    PPSLOCK = 0x55; 
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 1;//lock.
    
    
    //1.ボーレート設定115200
    U1BRG=SET_SPBRG_DATA1;
    //2.モード 非同期
    U1CON0bits.MODE=0b0000; //Asynchronous 8-bit USART mode
    //4.Serial port enabled
    U1CON1bits.ON=1;
    //5.Transmit is enabled.
    U1CON0bits.TXEN=1;
    U1CON0bits.RXEN=1;
    
    //7.interrupt
    PIR4bits.U1RXIF=0;
    PIE4bits.U1RXIE=1; 
    
}

void putch(uint8_t _txData)
{
    if(U1ERRIRbits.TXMTIF==High)//シフトレジスタ空?
    {
        do{
            U1TXB=_txData;
            while(U1ERRIRbits.TXMTIF==Low);
        }while(U1FIFObits.TXBF);//TXバッファ空になるまで送信。
    }else{
        //error operation
    }
}

uint8_t getch(void)
{
    while(PIR4bits.U1RXIF==Low);//受信完了
    return U1RXB;
}

uint8_t usartTxData[20];
void myUsartPrint(uint8_t *txBuf, uint8_t _length)
{
    do{
        putch(*txBuf++);
    }while(--_length);
}
//*****************************************************//
//Timer0初期化
//*****************************************************//
_tm tm0;
void timer0Init(void)
{
//Timer0初期化--------------------------------------------------
    T0CON1bits.CS=0b010;//クロックソースFosc/4
    T0CON1bits.CKPS=0b0011;//プリスケ1:8
    T0CON0bits.MD16=1;//16bitsタイマー
    T0CON0bits.OUTPS=0b0000;//ポストスケーラ1:1
    TMR0H=0xD8;//10ms Fosc=32Mhz
    TMR0L=0xF0;//10ms 
    T0CON0bits.EN=1;
    PIE3bits.TMR0IE=1;
    PIR3bits.TMR0IF=0;
}


/*---------------------------------------------------
 Timer1
 ---------------------------------------------------*/
_tm tm1;
void timer1Init(void)
{
    T1CLK=1;//Fosc/4
    T1CONbits.CKPS=0b11; //1:8
    T1CONbits.RD16=1;//16bits.Timer
    T1CLK=0b00001;//Fosc/4
    TMR1H=0xD8;//Fosc=32 10ms
    TMR1L=0xF0;
    T1CONbits.ON=1;
    PIR3bits.TMR1IF=0;
    PIE3bits.TMR1IE=1;
}


/*---------------------------------------------------
 Timer3
 ---------------------------------------------------*/
_tm tm3;
void timer3Init(void)
{
    T3CONbits.CKPS=0b11; //1:8
    T3CONbits.RD16=1;//16bits.Timer
    T3CLK=0b00001;//Fosc/4
    TMR3H=0x00;
    TMR3L=0x00;
    T3CONbits.ON=1;
    PIR5bits.TMR3IF=0;
    PIE5bits.TMR3IE=1;
}
/*---------------------------------------------------
 Timer2
 ---------------------------------------------------*/
_tm tm2;
void timer2Init(void)
{
    TMR2=0x00;
    T2CONbits.T2CKPS=0b100;//prescle1:16
    T2CONbits.OUTPS=0b0001;//postScaler 1:2
    T2HLTbits.PSYNC=1;//synchoronized to Fosc/4
    T2CLKCONbits.CS=0b00001;//Fosc/4
    //PR2=0x1F;//Fosc=32Mhz 1ms 16,16
    PR2=0x19;//32Mhz 0.1ms 16,2
    tm2.cnt=0;
    tm2.fg=false;        
    PIR3bits.TMR2IF=0;
    PIE3bits.TMR2IE=1;
    T2CONbits.TMR2ON=1;
}

/*---------------------------------------------------
 Timer4
 ---------------------------------------------------*/
_tm tm4;
void timer4Init(void)
{
    TMR4=0x00;
    T4CONbits.OUTPS=0b1111;//postScaler 1:16
    T4CONbits.T4CKPS=0b111;//prescle1:128
    T4HLTbits.PSYNC=1;//synchoronized to Fosc/4
    T4CLKCONbits.CS=0b00001;//Fosc/4
    //PR4=0x1F;//Fosc=32Mhz 1ms
    PR4=0x27;//Fosc=32Mhz 10ms
    tm4.cnt=0;
    tm4.fg=false;        
    PIR11bits.TMR4IF=0;
    PIE11bits.TMR4IE=0;
    T4CONbits.TMR4ON=0;
}

/*---------------------------------------------------
 Timer6
 ---------------------------------------------------*/
_tm tm6;
void timer6Init(void)
{
    TMR6=0x00;
    T6CONbits.T6CKPS=0b101;//prescle1:32
    T6CONbits.OUTPS=0b1111;//postScaler 1:16
    T6HLTbits.PSYNC=1;//synchoronized to Fosc/4
    T6CLKCONbits.CS=0b00001;//Fosc/4
    //PR6=0xEA;//Fosc=32Mhz 5ms  pre1:128,post1:16
    //PR6=0x27;//Fosc=32Mhz 10ms pre1:128,post1:16
    T6PR=0xEA; //Fosc=32Mhz 15ms pre1: 32,post1:16
    
    tm6.cnt=0;
    tm6.fg=false;        
    PIR15bits.TMR6IF=0;
    PIE15bits.TMR6IE=0;
    T6CONbits.TMR6ON=1;
}


//*****************************************************//
//ioc初期化
//*****************************************************//
 _ioc ioc;
void iocInit(void)
{
    IOCCNbits.IOCCN0=1;//RC0
    TRISC|=0x01;//RC0
    PIE0bits.IOCIE=1;
    PIR0bits.IOCIF=0;
}

//******************************************************//
// * ADC初期化
// *****************************************************//
_adc adcData;
#define ADC_AverageMode
#ifdef ADC_BasicMode
void adcInit(void)
{
    ADCON0bits.FM=1;//Right justified
    ADCON0bits.CS=0;//Fosc
    ADREFbits.NREF=0;//connected Vss
    ADREFbits.PREF=0b00;//connected Vdd
    ADACTbits.ACT=0b00100;//TMR2 postscaled.
    ADPCH=2;//RA2 ANA2
    adcData.ch[0]=2;
    //port設定
    TRISA|=0x04;//RA2:input 
    ANSELA|=0x04;//RA2:ANA4; 
    //割込み許可
    PIR1bits.ADIF=0;
    PIE1bits.ADIE=1;
    ADCON0bits.ON=1;
    //Trigger Timer begins
    timer2Init();
}
#endif 
#ifdef ADC_AverageMode
void adcInit(void)
{
    ADCON0bits.FM=1;//Right justified
    ADCON0bits.CS=0;//Fosc
    ADCLK=15;
    //Avarage MODE sample=16
    ADCON2bits.MD=0b010;//Average Mode
    ADCON2bits.CRS=3;//divied by 2^4=16;
    ADRPT=8;
    
    ADREFbits.NREF=0;//connected Vss
    ADREFbits.PREF=0b00;//connected Vdd
    ADACTbits.ACT=0b00100;//TMR2 postscaled.
    
    
    //acquisition time Tacq=7us
    ADACQ = 224;            //Tosc=1/32Mhz = 1/32 us =0.03125us
    
    ADPCH=0;
    adcData.ch[0]=0;
    //port設定
    TRISA|=0x03;
    ANSELA|=0x03;
    //割込み許可
    PIR1bits.ADIF=0;
    PIE1bits.ADIE=1;
    ADCON0bits.ON=1;
    //Trigger Timer begins
    timer2Init();
}
#endif

//******************************************************//
// * CCP1 PWM初期化
// *****************************************************//
void CCP1_PWM_Init(void)
{
    
    CCP1CONbits.CCP1MODE=0b1100;//PWMmode
    CCP1CONbits.CCP1FMT=0b0;
    CCPR1=0x00;
    CCPTMRS0bits.C1TSEL=0b11;//Timer6
    //6.PPS
    PPSLOCK = 0x55; 
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 0;//Unlock.
    RB0PPS=0x15;//CCP1 output
    PPSLOCK = 0x55; 
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 1;//lock.
    
    CCP1CONbits.CCP1EN=1;
}

//******************************************************//
// * CCP2 PWM初期化
// *****************************************************//
void CCP2_PWM_Init(void)
{
    
    CCP2CONbits.CCP2MODE=0b1100;//PWMmode
    CCP2CONbits.CCP2FMT=0b0;
    CCPR2=0x00;
    CCPTMRS0bits.C2TSEL=0b11;//Timer6
    //6.PPS
    PPSLOCK = 0x55; 
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 0;//Unlock.
    RB1PPS=0x16;//CCP2 output
    PPSLOCK = 0x55; 
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 1;//lock.
    
    CCP2CONbits.CCP2EN=1;
}

//******************************************************//
// * CCP1 キャプチャー初期化
// *****************************************************//
volatile _CCP1 CCP1;
void CCP1_CaptureInit(void)
{
    CCP1CONbits.MODE=0b0101;//every rising edge
    CCPTMRS0bits.C1TSEL=0b10;//Timer3
    CCP1CAP=0x00;//Pin selected by CCP1PPS
    
    //6.PPS
    PPSLOCK = 0x55; 
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 0;//Unlock.
    CCP1PPS=0b010010;//RC2
    PPSLOCK = 0x55; 
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 1;//lock.
    TRISC|=0x04;//RC2 input
    //interrupt
    PIR3bits.CCP1IF=0;
    PIE3bits.CCP1IE=1;
    CCP1CONbits.CCP1EN=1;
}


//******************************************************//
// * PWM1 初期化
// *****************************************************//
void pwm1Init(void)
{
    PWM1CLK=0x05;//MFINTOSC 500khz
    PWM1PR=0x00EA;//15ms
    //PWM1PR=0x7EF;//100ms
    
    //PWM1PR=0x02FFF;
    PWM1CPRE=0x20;//prescaler
    PWM1S1P1H=0x00;
    PWM1S1P1L=0x00;
    PWM1S1CFG=0x00;
    
    //Clear PWM1_16BIT period interrupt flag
    PIR4bits.PWM1PIF = 0;
    //Clear PWM1_16BIT interrupt flag
    PIR4bits.PWM1IF = 0;  
    //Clear PWM1_16BIT slice 1, output 1 interrupt flag
    PWM1GIRbits.S1P1IF = 0;
    //Clear PWM1_16BIT slice 1, output 2 interrupt flag
    PWM1GIRbits.S1P2IF = 0;
    //PWM1_16BIT interrupt enable bit
    PIE4bits.PWM1IE = 0;
    //PWM1_16BIT period interrupt enable bit
    PIE4bits.PWM1PIE = 0;
   
    //PPS
     //6.PPS
    PPSLOCK = 0x55; 
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 0;//Unlock.
    RB2PPS=0x18;
    RB3PPS=0x19;
    PPSLOCK = 0x55; 
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 1;//lock.
    PWM1CONbits.EN=1;
}

//******************************************************//
// * PWM2 初期化
// *****************************************************//
void pwm2Init(void)
{
    PWM2CLK=0x05;//MFINTOSC 500khz
    PWM2PR=0x00EA;//15ms
    //PWM2PR=0x7EF;//100ms
    //PWM2PR=0x02FFF;
    PWM2CPRE=0x20;//prescaler
    PWM2S1P1H=0x00;
    PWM2S1P1L=0x00;
    PWM2S1CFG=0x00;
    
    //Clear PWM1_16BIT period interrupt flag
    PIR5bits.PWM2PIF = 0;
    //Clear PWM1_16BIT interrupt flag
    PIR5bits.PWM2IF =0;
    //Clear PWM1_16BIT slice 1, output 1 interrupt flag
    PWM2GIRbits.S1P1IF=0;
    //Clear PWM1_16BIT slice 1, output 2 interrupt flag
    PWM2GIRbits.S1P2IF =0;
    //PWM1_16BIT interrupt enable bit
    PIE5bits.PWM2IE=0;
    //PWM1_16BIT period interrupt enable bit
    PIE5bits.PWM2PIE=0;
   
    //PPS
     //6.PPS
    PPSLOCK = 0x55; 
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 0;//Unlock.
    RB4PPS=0x1A;
    RB5PPS=0x1B;
    PPSLOCK = 0x55; 
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 1;//lock.
    PWM2CONbits.EN=1;
}

//******************************************************//
// * PWM3 初期化
// *****************************************************//
void pwm3Init(void)
{
    PWM3CLK=0x05;//MFINTOSC 500khz
    PWM3PR=0x00EA;//15ms
    //PWM3PR=0x7EF;//100ms
    //PWM3PR=0x02FFF;
    PWM3CPRE=0x20;//prescaler
    PWM3S1P1H=0x00;
    PWM3S1P1L=0x00;
    PWM3S1CFG=0x00;
    
    //Clear PWM1_16BIT period interrupt flag
    PIR7bits.PWM3PIF = 0;
    //Clear PWM1_16BIT interrupt flag
    PIR7bits.PWM3IF =0;
    //Clear PWM1_16BIT slice 1, output 1 interrupt flag
    PWM3GIRbits.S1P1IF=0;
    //Clear PWM1_16BIT slice 1, output 2 interrupt flag
    PWM3GIRbits.S1P2IF =0;
    //PWM1_16BIT interrupt enable bit
    PIE7bits.PWM3IE=0;
    //PWM1_16BIT period interrupt enable bit
    PIE7bits.PWM3PIE=0;
   
    //PPS
     //6.PPS
    PPSLOCK = 0x55; 
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 0;//Unlock.
    //RC5PPS=0x1C;
    //RC2PPS=0x1D;
    RD0PPS=0x1C;
    RD1PPS=0x1D;
    PPSLOCK = 0x55; 
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 1;//lock.
    PWM3CONbits.EN=1;
}

interrupt.c
#include "Q_interrupt27Q43.h"

//****************割り込み関数***********************//
// USART1割込み
//**************************************************//
void __interrupt(irq(IRQ_U1RX)) USART1RX_ISR(void)
{
    uint8_t ch;
    PIR4bits.U1RXIF=0;
    ch=getch();
    rxUsart.buf[rxUsart.length++]=ch;
    if(rxUsart.length>RXUSART_BUFFER_SIZE)
    {
        rxUsart.length=0;
    }
    if(ch==0x0a)
    {
        rxUsart.buf[rxUsart.length-2]=0x00;
        PIE4bits.U1RXIE=0;
        rxUsart.completed=1;
    }
}

//****************割り込み関数***********************//
// Timer0割込み
//**************************************************//
void __interrupt(irq(IRQ_TMR0)) Timer0_ISR(void)
{
    PIR3bits.TMR0IF=0;
    tm0.cnt++;
    TMR0L=0xF0;//10ms
    if(tm0.cnt==50)
    {
        tm0.cnt=0;
        tm0.fg=true;
        T0CON0bits.EN=0;
        PIE3bits.TMR0IE=0;
    }
    
}
//****************割り込み関数***********************//
// Timer1割込み
//**************************************************//
void __interrupt(irq(IRQ_TMR1)) Timer1_ISR(void)
{
    PIR3bits.TMR1IF=0;
    tm1.cnt++;
    TMR1L=0xF0;
    if(tm1.cnt==1)
    {
        tm1.cnt=0;
        tm1.fg=true;
        T1CONbits.ON=0;
        PIE3bits.TMR1IE=0;
    }
}


//****************割り込み関数***********************//
// Timer2割込み
//**************************************************//
void __interrupt(irq(IRQ_TMR2)) Timer2_ISR(void)
{
    PIR3bits.TMR2IF=0;
    PIE3bits.TMR2IE=0;
}

//****************割り込み関数***********************//
// Timer3割込み
//**************************************************//
void __interrupt(irq(IRQ_TMR3)) Timer3_ISR(void)
{
    PIR5bits.TMR3IF=0;
    CCP1.cnt[1]++;     

    if(CCP1.cnt[1]>10)
    {   
        CCP1.cnt[0]=0x00;
        CCP1.cnt[1]=0x00;
        CCP1.index=0;
        CCP1.val[0]=0x0000;
        CCP1.val[1]=0x0000;
        CCP1.flag=true;  
        CCP1.Tupflag=true;
    }
}


//****************割り込み関数***********************//
// Timer4割込み
//**************************************************//
void __interrupt(irq(IRQ_TMR4)) Timer4_ISR(void)
{
    PIR11bits.TMR4IF=0;
    PORTBbits.RB2=~PORTBbits.RB2;
   // PIE11bits.TMR4IE=1;
   // T4CONbits.TMR4ON=1;
}
//****************割り込み関数***********************//
// Timer6割込み
//**************************************************//
void __interrupt(irq(IRQ_TMR6)) Timer6_ISR(void)
{
    PIR15bits.TMR6IF=0;
    PORTBbits.RB2=~PORTBbits.RB2;
   // PIE11bits.TMR4IE=1;
   // T4CONbits.TMR4ON=1;
}
//****************割り込み関数***********************//
// IOC割込み
//**************************************************//
void __interrupt(irq(IRQ_IOC)) IOC_ISR(void)
{
    uint8_t val;
    
    PIR0bits.IOCIF=0;
    val=IOCCF;
    if(IOCCNbits.IOCCN0==1 && val==0x01)
    {
        ioc.fg=true; 
        PIE0bits.IOCIE=0;
    }
    //zero clear--------------
    val=0xFF;
    val=val^IOCCF;
    IOCCF&=val;
}

//****************割り込み関数***********************//
// ADC割込み
//**************************************************//
void __interrupt(irq(IRQ_AD)) ADC_ISR(void)
{
    PIR1bits.ADIF=0;
   
    //adcData.val[0]=(uint16_t)((ADRESH << 8) + ADRESL);

    if(ADCNT==ADRPT)
    {
        if(ADPCH==0)
        {
            adcData.val[0]=ADFLTR;
            
            ADPCH=1;
        }else
        {
            if(ADPCH==1)
            {
                adcData.val[1]=ADFLTR;
                ADFLTR=0x0000;
                ADPCH=0;
                PIE3bits.TMR2IE=0;
                T2CONbits.TMR2ON=0;
                PIE1bits.ADIE=0;
                //ADCON0bits.ON=0;
                adcData.completed=true;
            }
        }
    }                 
}

//****************割り込み関数***********************//
// CCP1キャプチャー割込み
//**************************************************//
void __interrupt(irq(IRQ_CCP1)) CCP1_ISR(void)
{
    PIR3bits.CCP1IF=0;
    CCP1.val[CCP1.index]=((uint16_t)CCPR1H)<<8;
    CCP1.val[CCP1.index++]|=CCPR1L;
    if(CCP1.index==2)
    {
        CCP1.flag=true;
        CCP1.index=0;
        CCP1CONbits.CCP1EN=0;
        PIE3bits.CCP1IE=0;
       
        T3CONbits.ON=0;
        PIE5bits.TMR3IE=0;
        TMR3H=0x00;
        TMR3L=0x00;
        
      
    }
}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?