ユーザ用ツール

サイト用ツール


softdev:tempmeter2

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
softdev:tempmeter2 [2013/01/08 23:00] – [ソース] kingsoftdev:tempmeter2 [2013/07/15 20:25] (現在) – 外部編集 127.0.0.1
行 47: 行 47:
 ででで、ソース ででで、ソース
 ===== ソース ===== ===== ソース =====
-題して、バイクメータ、そのままやんけ。+題して、バイクメータ、そのままやんけ。\\ 
 +main初期化部 
 +<code c#> 
 +/***************************************************** 
 +// for PIC18F1320 
 +// Bike-Meter 
 +// 開発 キング工房 
 +******************************************************/ 
 +#include <htc.h> 
 +#include <delays.h> 
 +#include "delays_usms.h" 
 +#include "lcd_operation.h" 
 +#include "rtc_operation.h"
  
-<code c>+// VCFG1,VCFG0,-,CHS2,CHS1,CHS0,GODONE,ADON 
 +// CHS2,1,0 AN0=000,AN1=001,AN2=010 
 +#define ADON_AN1 0b00000101  
 +#define ADON_AN2 0b00001001 
 +#define LED_pwr PORTAbits.RA0 
 +#define LED_paper PORTAbits.RA4 
 +#define SW_feed PORTAbits.RA7 
 +#define SW_menu PORTAbits.RA6 
 + 
 +void send_dec3(char,int,char,char); 
 +void rtc_init(void); 
 +void rtc_init_mode_in(void); 
 +void get_minmax(int,int); 
 + 
 +// 配列を引きわたして戻す方法がわからないので、 
 +char rtc_today[7]; // グローバルで 
 +int temp_max,temp_min,volt_max,volt_min; //最大最小算出為 
 +char start_time[7]; // 経過時間算出為 
 +// 外部ソースで引用するときは、外部ソース側でextern をつけて再宣言する 
 + 
 +main() 
 +
 +/* 
 +// 書き込み時に使う。最初にないと動作しないみたい。RTCで月を文字で表示する為、EEPROMに書く。 
 +__EEPROM_DATA("J","a","n","F","e","b","M","a"); 
 +__EEPROM_DATA("r","A","p","r","M","a","y","J"); 
 +__EEPROM_DATA("u","n","J","u","l","A","u","g"); 
 +__EEPROM_DATA("S","e","p","O","c","t","N","o"); 
 +__EEPROM_DATA("v","D","e","c",0xFF,0xFF,0xFF,0xFF); 
 +*/ 
 + char a; // ループ等で使う 
 + char led1,keta,rtc_data,cc1u,cc1d; 
 + int an1data,tmp10; 
 +// int tt;// tt1,tt2は計算用 
 + unsigned int past_time,tt,tt1,tt2,an2data,start_time_int; 
 + long tmp10_long; 
 +// char tmp10c; // 判定のため仮変数 
 + char mm,month[3]; 
 + char mode; // 表示モード選択 
 + 
 + OSCCON = 0b01111111; // クロック8MHz 
 +  
 + EECON1 = 0b00010001; // EECON設定ないとEEPROMアクセス不可 
 + 
 + ADCON0 = ADON_AN1; // AN1 on 
 + ADCON1 = 0xFD; // AN1 only use 
 + ADCON2 = 0b10100101; // Right ,8TAD , Fosc/16 
 +  
 + PORTA = 0;// IO 初期化 
 + PORTB = 0; 
 + TRISA = 0xEE; // 0=Out RA0,RA4 
 + TRISB = 0b10100000; // RB5 = IN 
 + 
 + temp_max = -1000; 
 + temp_min =  1000; 
 + volt_max =     0; 
 + volt_min =   300; 
 + 
 + mode=0; 
 +  
 + led1 = 1; 
 + LED_pwr = led1; 
 + LED_paper = led1; 
 + 
 +  
 + rtc_portinit(); 
 + lcd_init(); 
 +  
 + if(rtc_get_stat() 0 ){ 
 + rtc_init_mode_in(); 
 + rtc_init(); // 異常フラグありで初期化 
 + }
 </code> </code>
 +
 +LCD関係
 <code c> <code c>
 +void shiftreg_lat()
 +{
 + SOLAT = 1; /* latch is rise edge */
 + DelayUs(1);
 + SOLAT = 0;
 +}
 +
 +
 +void send_data(char data)
 +{
 + signed char c;
 + /* send MSB first */
 + for(c=7;c>=0;c--){
 + SODAT = data>>c;
 + DelayUs(1);
 + SOCLK = 1;
 + DelayUs(1);
 + SOCLK = 0;
 + }
 +}
 +
 +void send_to_lcd(char data,char rs)
 +{
 + char ctrl_data;
 + /*  data  MSB 7 6 5 4    3    2 1  0  7 6 5 4 3 2 1 0 LSB*/
 + /*            0 0 0 BkON BkHi 0 RS E  Data----      -    */
 +
 + ctrl_data = 0x01 | BKL_AKARUI | rs ; /* E=1,backlight,RS */
 + send_data( ctrl_data );
 + send_data( data ); 
 + shiftreg_lat();
 +
 + ctrl_data = ctrl_data & 0b11111110 ; /* E=0 */
 + send_data( ctrl_data ); 
 + send_data( data );
 + shiftreg_lat();
 +}
 +
 +void lcd_locate(char location)
 +{
 + /* location 00h=Row1/Col1 40h=Row2/Col1 */
 + location |= 0x80; /* rise bit7=1 */
 + send_to_lcd( location , RS0); /*set DDRAM addr to 40h */
 +}
 +
 +/* write a string of chars to the LCD */
 +void lcd_puts(const char * s)
 +{
 + while(*s)
 + send_to_lcd( *s++ , RS1 );
 +}
 </code> </code>
 +
 +ADCのところ
 <code c> <code c>
-</code> + while(1){ 
-<code c> + ADCON0 = ADON_AN1; 
-</code>+ GO_DONE=1; 
 + while(GO_DONE); 
 + an1data = (ADRESH<<8) | ADRESL ; // Temperatrure 
 +  
 + DelayMs(10);
  
 + ADCON0 = ADON_AN2;
 + GO_DONE=1;
 + while(GO_DONE);
 + an2data = (ADRESH<<8) | ADRESL ; // Voltage
 + an2data = an2data * 5 * 10 / 256;
 +
 + tmp10_long = (long)an1data * 500 - 245760;
 + tmp10_long =  tmp10_long / 410;
 + tmp10 = (int)tmp10_long;
 +
 +</code>
 +メモリが足りてるので、温度はlongで計算。
  
  
  
softdev/tempmeter2.1357653641.txt.gz · 最終更新: 2013/07/15 20:28 (外部編集)