すぐにでも電源を入れてみたかったけど、
肝心のソフトウェアがまだ・・・。
この基板に載っているのは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 件のコメント:
コメントを投稿