2014年12月13日土曜日

iModela+eagleでプリント基板作成(動作確認)

ようやく、パターンのチェックが終わり想定外のショート・断線が無いことを確認した。
すぐにでも電源を入れてみたかったけど、
肝心のソフトウェアがまだ・・・。

この基板に載っているのはPIC16F818で、I2Cのスレーブにもなれる。
これをラズベリーパイから操作したいと思っている。
その前段階として、PIC自身がカウントアップするプログラムを書いて、
動作確認を行うことにした。

やはり、Linux(X86_64)環境では開発環境が遅すぎるので、
32bit環境で開発を行った。

/* 
 * File:   main.c
 * Author: adeno
 *
 * Created on 2014/12/13
 */

#include 
#include 
#include 
#include "nana_seg_ptn.h"

/*
 * 
 */
// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON       // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON         // Low-Voltage Programming Enable bit (RB3/PGM pin has PGM function, Low-Voltage Programming enabled)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB2      // CCP1 Pin Selection bit (CCP1 function on RB2)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

#define _XTAL_FREQ 4000000      //delay用に必要(クロック4MHzを指定)
#define TMR0_CNT 0        //TMR0カウント値設定

static void seg_sel(unsigned char n);

unsigned char keta; //7segの桁
unsigned int num;
unsigned char gcnt;
/*
 *
 */
int main(int argc, char** argv) {

    OSCCON = 0b01100010;
    //PORTA 3-0は7segのd-a 不論理
    //RA4は1桁目、RA6は2桁目 不論理
    //PORTB 3-0は7segのh-e 不論理
    
    //PORTA 0,1,2,3,4,6,7
    //PORTB 0,2,6,7 桁 5
    PORTA = 0b11011111; //PORTAの中身をきれいにする
    TRISA = 0b00000000; //PORTAは 1:入力 0:出力

    PORTB = 0b11100101; //PORTBの中身をきれいにする
    TRISB = 0b00000000; //PORTBは 1:入力 0:出力

    keta = 0;
    num = 0;
    gcnt = 0;

    //TMR0の割り込み初期設定
    //1000ms=0.25us(4MHz)*4*プリスケーラ−256*256
    OPTION_REG = 0b0111; //プリスケーラ値設定0b0111(=256回)
    TMR0 = TMR0_CNT; //TMR0カウント値設定

    INTCONbits.TMR0IE =1; //タイマ割込み許可
    INTCONbits.GIE = 1; //全体割込み許可

    unsigned char ra_bak;

    while(1) {
        //表示を消す
        seg_sel(0);
        //PORTA = 0b01011111;
        __delay_ms(1);

        //表示
        seg_sel(keta);
        //PORTA = 0b01001001;
        //PORTB = 0b00001111;
        //NOP();
        //RA4 = 0;
        __delay_ms(3);
        //桁移動
        keta++;
        if(keta > 5){keta = 1;}



    }


    return (EXIT_SUCCESS);
}


static void interrupt isr(void) { //割り込み関数
    if(INTCONbits.TMR0IF == 1) {  //割込み種がTimer0割込みの場合
        INTCONbits.TMR0IF = 0; //Timer0割り込みフラグクリアー
        TMR0 = TMR0_CNT; //TMR0カウント値設定
        gcnt++;
        if(gcnt > 5){//15){
            num++;
            if(num > 9999){num = 0;}
            gcnt = 0;
        }
    }
}
// =============== セグメントセレクタ    ============
static void seg_sel(unsigned char n){
    //PORTA 0,1,2,3,4,6,7
    //PORTB 0,2,6,7 桁 5

    unsigned char ptn,ra_bak,rb_bak;
    ra_bak = PORTA & 0b00100000;
    rb_bak = PORTB & 0b00011010;

    switch(n){
        default:{ }
        case 0: {
            //初期化
            PORTA = 0b11011111;
            PORTB = 0b11100101;
            break;
        }
        case 1:{
            //セグメント1
            ptn = show_number(num % 10,0);
            if((ptn & 0b00100000) > 0 ){
                PORTB = 0b01100101; //7
            }else{
                PORTB = 0b01000101; //5to7
            }
            
            //PORTB = rb_bak | (0b00001111 & (ptn >> 4));
            //PORTA = 0b01010000 | (0b00001111 & ptn);    //ptn
            //NOP();
            //PORTA = 0b01000000 | (0b00001111 & ptn);    //RA4をL + ptn
            PORTA = ra_bak | (0b11011111 & ptn);
            //PORTA = 0b11000000;
            break;
        }
        case 2:{
            //セグメント2
            ptn = show_number((num / 10)%10,0);
            if((ptn & 0b00100000) > 0 ){
                PORTB = 0b10100101; //6
            }else{
                PORTB = 0b10000101; //5to6
            }
            //PORTB = rb_bak | (0b00001111 & (ptn >> 4));
            //PORTA = 0b01010000 | (0b00001111 & ptn);    //ptn
            //PORTB = 0b11000001; //5と2
            //NOP();
            //PORTA = 0b00010000 | (0b00001111 & ptn);    //RA6をL + ptn
            //PORTA = 0b01000000;
            PORTA = ra_bak | (0b11011111 & ptn);
            break;
        }
        case 3:{
            //セグメント3
            ptn = show_number((num / 100)%10,0);
            if((ptn & 0b00100000) > 0 ){
                PORTB = 0b11100001; //2
            }else{
                PORTB = 0b11000001; //5to2
            }
            //PORTB = rb_bak | (0b00001111 & (ptn >> 4));
            //PORTA = 0b01010000 | (0b00001111 & ptn);    //ptn
            //PORTB = 0b11000001; //5と2
            //NOP();
            //PORTA = 0b00010000 | (0b00001111 & ptn);    //RA6をL + ptn
            //PORTA = 0b01000000;
            PORTA = ra_bak | (0b11011111 & ptn);
            break;
        }
        case 4:{
            //セグメント4
            ptn = show_number((num / 1000)%10,0);
            if((ptn & 0b00100000) > 0 ){
                PORTB = 0b11100100; //0
            }else{
                PORTB = 0b11000100; //5to0
            }
            //PORTB = rb_bak | (0b00001111 & (ptn >> 4));
            //PORTA = 0b01010000 | (0b00001111 & ptn);    //ptn
            //PORTB = 0b11000001; //5と2
            //NOP();
            //PORTA = 0b00010000 | (0b00001111 & ptn);    //RA6をL + ptn
            //PORTA = 0b01000000;
            PORTA = ra_bak | (0b11011111 & ptn);
            break;
        }
    }

}

/*
 * File:   nana_seg_pth.c
 * Author: adeno
 *
 * Created on 2014/11/13
 */

#include "nana_seg_ptn.h"


// =============== 表示パターン ====================
unsigned char show_number(unsigned char n,unsigned char dot){
    static unsigned char ptn = 0b11111111;
    /*
     * 76543210
     * hecagfbd
     */
    switch(n){
        case 0: { //abcdef
            ptn = 0b10001000;
            break;
        }
        case 1: { //bc
            ptn = 0b11011101;
            break;
        }
        case 2: { //abdeg
            ptn = 0b10100100;
            break;
        }
        case 3: { //abcdg
            ptn = 0b11000100;
            break;
        }//hecagfbd
        case 4: { //bcfg
            ptn = 0b11010001;
            break;
        }
        case 5: { //acdfg
            ptn = 0b11000010;
            break;
        }
        case 6: { //acdefg
            ptn = 0b10000010;
            break;
        }
        case 7: { //abc
            ptn = 0b11001101;
            break;
        }
        case 8: { //abcdefg
            ptn = 0b10000000;
            break;
        }
        case 9: { //abcdfg
            ptn = 0b11000000;
            break;
        }
    }

    return ptn;
}

<次回改善>
・数値→7セグパターン出力は汎用的に使えるようにしておく
 今は配線の都合だけでレイアウトしてしまったので、
  RA: 76543210
     7seg:hecagfbd
 みたいなことになっている。。。
 パターンを作る人と出力のために変換する人が必要。

動作確認結果がこちら。
スモーク色のアクリル板を上に載っけておくと表示が見やすい
(というか、板が無いととても見づらい。。。)
カメラで撮るとチラツキが目立つね。



次はI2Cの確認だ−!

0 件のコメント:

コメントを投稿