PIC16F88に書き込んだプログラムについて
以前、直流電圧と電流を測定する回路を製作し、その時書いたプログラムでは正常にLCDに表示されていたのですが、最近になって測定した電圧および電流を1秒間に8回更新するように書き替えました。しかしLCDに正常に表示されなくなりました。
プログラムと回路図を掲載しますのでどなたか、どうすればいいか教えてください。
よろしくお願い致します。
////////////////////以下プログラム///////////////////////////////////////////////////
<lcd.c>
#include <pic.h>
//#include "lcd.h"
//#include "delay.h"
#define _XTAL_FREQ 4000000
#define LCD_RS RA0
#define LCD_RW RA7
#define LCD_EN RA6
#define LCD_DATA PORTB
#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))
/* write a byte to the LCD in 4 bit mode */
void
lcd_write(unsigned char c)
{
//DelayUs(40);
__delay_us(40);
LCD_DATA = ( ( c >> 4 ) & 0x0F );
LCD_STROBE();
LCD_DATA = ( c & 0x0F );
LCD_STROBE();
}
/*
* Clear and home the LCD
*/
void
lcd_clear(void)
{
LCD_RS = 0;
lcd_write(0x1);
//DelayMs(2);
__delay_ms(2);
}
/* write a string of chars to the LCD */
void
lcd_puts(const char * s)
{
LCD_RS = 1; // write characters
while(*s)
lcd_write(*s++);
}
/* write one character to the LCD */
void
lcd_putch(char c)
{
LCD_RS = 1; // write characters
lcd_write( c );
}
/*
* Go to the specified position
*/
void
lcd_goto(unsigned char pos)
{
LCD_RS = 0;
lcd_write(0x80+pos);
}
/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
char init_value;
//ADCON1 = 0x06; // Disable analog pins on PORTA
init_value = 0x3;
//TRISA=0;
//TRISB=0;
LCD_RS = 0;
LCD_EN = 0;
LCD_RW = 0;
//DelayMs(15); // wait 15mSec after power applied,
__delay_ms(15);
LCD_DATA = init_value;
LCD_STROBE();
//DelayMs(5);
__delay_ms(5);
LCD_STROBE();
//DelayUs(200);
__delay_us(200);
LCD_STROBE();
//DelayUs(200);
__delay_us(200);
LCD_DATA = 2; // Four bit mode
LCD_STROBE();
lcd_write(0x28); // Set interface length
//lcd_write(0xF); // Display On, Cursor On, Cursor Blink
lcd_write(0x0C);
lcd_clear(); // Clear screen
//lcd_write(0x6); // Set entry Mode
lcd_write(0x07);
}
<main.c>
#include <pic.h>
#include <stdlib.h>
#include "lcd.h"
#define _LEGACY_HEADERS
#define _XTAL_FREQ 4000000
__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & CCPMX_RB0 & CP_OFF);
__CONFIG(FCMEN_OFF & IESO_OFF);
unsigned int ADConv(unsigned char ch)
{
ADCON0=(ch<<3)&0x38;
ADCS2=0;
ADCS1=0;
ADCS0=1;
ADON=1;
ADIF=0;
__delay_us(20);
GO_DONE=1;
while(GO_DONE);
return (ADRESH<<8) | ADRESL;
}
unsigned short Code2mV(unsigned char ch)
{
unsigned short ret;
ret=0;
ret += ADConv(ch)<<1;
ret += ADConv(ch)>>1;
ret += ADConv(ch)>>3;
ret += ADConv(ch)>>4;
ret += ADConv(ch)>>5;
return ret;
}
void ioport(void)
{
CMCON=0x07;
ANSEL= 0b00001110;
TRISA = 0b00001110;
PORTA=0x00;
TRISB = 0b00000000;
PORTB=0x00;
}
void main(void)
{
static double data, offset;
static unsigned int v ,i,n1,n0;
static unsigned char buf[8], cnt,tmp1[2],tmp2[2];
OSCCON = 0b01100000; // �N���b�N��8Mhz
ioport();
ADCON1=0b11100000;
lcd_init();
lcd_write(0x0D);
lcd_goto(0);
lcd_puts("Starting");
lcd_goto(0x40);
lcd_puts("DC Meter");
__delay_ms(2500);
lcd_clear();
offset=0.0;
while (1)
{
data=0.0;
for(cnt=0; cnt<10; cnt++)
{
data += Code2mV(1);
}
data /= 10.0;
data *= 2.4287109375;
data *= 11.0;
data -= offset;
v=(unsigned int)(data);
n1=(unsigned int)(v/1000);
n0=v-1000*n1;
itoa(tmp2,n1,10);
itoa(tmp1,n0,10);
lcd_goto(1);
lcd_puts(tmp2);
lcd_goto(3);
lcd_putch('.');
lcd_puts(tmp1);
lcd_goto(6);
lcd_puts("V");
data =0.0;
for(cnt=0; cnt<10; cnt++)
{
data += Code2mV(2);
}
data /= 10.0;
data *= 2.4287109375;
data /= 11.0;
offset = data;
i=(unsigned int)(10.0 * data);
itoa(buf,i,10);
lcd_goto(9);
lcd_puts(buf);
lcd_goto(13);
lcd_puts("mA");
__delay_ms(125);
}
}
補足
第3bit目がマスクし取り出した信号で、この信号を第0bit目に移す場合 x=(0b00001000)〉〉3 これで合っていますか?