亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hoarder.c

?? 用51單片機讀取CF卡的程序。對許多項目有參考價值
?? C
?? 第 1 頁 / 共 3 頁
字號:
// Hoarder board software http://vadim.www.media.mit.edu/Hoarder/Hoarder.htm
// Copyright (C) 2001-2002 MIT Media Laboratory
// Concept, design, and programming by Vadim Gerasimov <vadim@media.mit.edu>
// Code fragments by Paul Covell, Matthew Drake
// Ideas contributed by 
// Paul Covell, Ted Selker, Sandy Pentland, Richard DeVaul, 
// Brian Silverman, Tim Hirzel, Josh Weaver, Ivan Chardin 

#include <16F877.H>
#list
#include "Math32.c"

// Configuration bits for initial programming
#fuses   HS, NOPROTECT, WDT, PUT, BROWNOUT, NOLVP

// 20 MHz clock
#use delay (clock=20000000)

// up to 57.6kBaud (recommended 38.4) to be compatible with BiM2 transceiver 
// up to 115,2kBaud for cable connection
#use rs232 (baud=115200, xmit=PIN_C6, rcv=PIN_C7)

// Disable automatic TRIS programming for all ports
#use fast_io(a)  
#use fast_io(b)  
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

// for MIThril bus and I2C-enabled add-on boards
#use I2C (master, sda=PIN_C4, scl=PIN_C3, address=0xc0, SLOW)

// define for initial PIC programming to include the serial programming function
#define InitialProgram

// define only one: Rochester, ESL, GAME, or Tim
//#define Rochester
#define ESL // Every Sign of Life collect/broadcast
//#define GAME // Ball game broadcast
//#define Tim // Tim Hirzel's project data collection

// define OldSAK for boards earlier than NOV 2001
//#define OldSAK

// define DelayedWrite to use with IBM MicroDrive (TM)
//#define DelayedWrite

// CompactFlash pins
// 3 address lines (all others grounded)
  #define CF_A0      PIN_B0
  #define CF_A1      PIN_B1 
  #define CF_A2      PIN_B2
// data flow strobe signals
  #define CF_N_OE    PIN_B3
  #define CF_N_WE    PIN_B4
// card detect signal (high if card is not present)  
  #define CF_CD1     PIN_B7
  #define cf_out     input(CF_CD1)
// CF power switch  
#ifdef OldSAK
  #define CF_POWER   PIN_C0
#else
  #define CF_POWER   PIN_B6
#endif

// LED pins  
  #define CF_LED0    PIN_C1
  #define CF_LED1    PIN_C2

// EKG amplifier enable for BIOMETRICS add-on module   
  #define EKG_EN     PIN_C5

// Real time clock signals
// two lines shared with CF data bus
  #define RTC_RST    PIN_B5	   
  #define RTC_CLK    PIN_D0	   
  #define RTC_IO     PIN_D1	

// BiM transceiver pins TX-, RX-enable and Carrier Detect
// TX, RX data pins connected to UART
#ifdef OldSAK
  #define BIM_TX     PIN_E0   
  #define BIM_RX     PIN_E1   
  #define BIM_CD     PIN_E2 
#else
  #define BIM_TX     PIN_E2   
  #define BIM_RX     PIN_E1   
  #define BIM_CD     PIN_C0 
#endif  

#define RBIF     0x58
#define RCIF	   0x65
#define OERR	   0xC1
#define CREN	   0xC4

// Event button -- Tim Hirzel's project
#define BUTTON	 PIN_A4

#byte   SPBRG	   = 0x99
#byte   TXSTA	   = 0x98
#byte   PORTA	   = 0x05	
#byte   PORTB	   = 0x06	
#byte   PORTC	   = 0x07	

#byte CF_DATA   = 0x08  /* Port D */
#byte CF_DATA_TRIS = 0x88 /* Port D TRIS */

// 1-in 0-out
#define TRIS_A     0xFF  // 11111111 
#define TRIS_B     0x80  // 10000000 

#ifdef OldSAK
  #define TRIS_C     0xF8  // 11111000
  #define TRIS_C_SLEEP 0x80  // 10000000
  #define TRIS_E 0x04  // 0000x100
#else
  #define TRIS_C     0xD9  // 11011001 
  #define TRIS_C_SLEEP 0x81  // 10000001
  #define TRIS_E 0x01  // 0000x001
#endif

#define TRIS_D_IN  0xFF  // 11111111
#define TRIS_D_OUT 0x00  // 00000000 
#define TRIS_D_RTC_OUT 0xFC
#define TRIS_D_RTC_IN  0xFE

// Function Prototypes 
void print_prompt();
#separate void save_audio();
#separate void save_data();
#separate void send_data();
#separate void send_data_bim();
#separate void send_data_Tim();
#separate void send_player_info();
void led_off();
void led_red();
void led_green();
#separate boolean process_command();
void print_help();
int fromHex(char hex);
void set_default_signals();
void cf_task_file_read(int addr);
void cf_task_file_write(int addr, int data);
byte rtc_read(int addr);
void rtc_write(int addr, int data);
#separate boolean get_disk_configuration();
void cf_set_addr(int addr);


// Global variables

// Data file name on CF card
char const fname[12] = "ESL     DAT";
// A/D buffer
#define buf_size 32
long buffer[buf_size];
int buf_head;
int buf_count;
int ad_count;
boolean ad_on;
boolean audio;
long voltage;

int curData;  // Holds data to be sent
int curAddr;  // Holds address to be read/written

char sector[4]; // Current CF sector number for Read/Write operations
boolean disk_valid; // CF seems ok
boolean file_valid; // Data file seems ok

// FAT (file allocation table) variables
char data_start[4];
char fat_start[4]; // first sector of first copy of FAT
char dir_start[4]; // first sector of root directory
char data_sectors[4]; // number of data sectors
char data_file_size[4];
char sector_counter[4]; // to count down number of unused sectors in data file
byte sectors_per_cluster;
long root_entries; // number of entries in root directory
long cluster;

// Real time clock buffer
char time[8]; // hold all 8 time bytes from RTC chip
// Time in ms after last reset (if timer int set to 1kHz)
char ms[4]; // millisecond timer

char cmd; // last command character
long write_pos; // write position in current sector
long crc16; 


// self-programming function
// reprograms PIC thru serial port
// host sends pieces of code as:
// 1 byte header 0xAB
// 2 bytes start address
// 2 bytes (N) number of words to program
// N words (N*2 bytes) program words
// 
// after each program word function sends back 
// 1 if word programmed successfully
// 0 if not
//
// send non 0XAB byte to exit the cycle and restart Hoarder
//
#ifdef InitialProgram	
#ORG 0x1F00, 0x1FFF
void self_program()
{
  long addr, count, val, i;
  disable_interrupts(GLOBAL);
  while(getc()==0xAB) {
    *(&addr)=getc();
    *(&addr+1)=getc();
    *(&count)=getc();
    *(&count+1)=getc();
    for (i=0; i<count; i++) {
      *(&val)=getc();
      *(&val+1)=getc();
      if (val==read_program_eeprom(addr)) putc(1);
      else {
        write_program_eeprom(addr, val);
        if (val==read_program_eeprom(addr)) putc(1);
        else putc(0);
      }
      addr++;
      restart_wdt();
    }
  }
  #asm
  movlw    0 
  movwf	   0x0A
  goto     0		 	
  #endasm 
}
#endif

// jumps to self_program()
// normally called from command processor
// Note: if you want serial programming to work make sure you can always interrupt 
//       your program from serial port and have a command that calls this function  
#inline
void reprogram()
{
#ifdef InitialProgram
  self_program();
#else
  #asm
  movlw	0x18 
  movwf	0x0A
  goto 	0x700		 	
  #endasm 
#endif
}

// timer function
// increments ms counter
// performs timed AD conversion
// can do a lot of other neat stuff!
// normally interrupts 1000 times per second
// Note: in multisensor boards configuration can be set to 8000 times/sec
//       to sample audio
#int_timer2
void timer2() {
  static int i;
// resets watchdog timer
// Note: if you disable timer interrupt do this periodically somewhere else
//       otherwise WDT will reset PIC in ~2 seconds   
  restart_wdt();
//  inc32(ms);
  if (++ms[0]==0) if (++ms[1]==0) if (++ms[2]==0) ++ms[3]; 
  if (ad_on) {
#ifdef Tim
    if (ad_count==3) voltage=read_adc();
    if (ad_count==0)
#endif  	
    if (/*(ad_count==3) && */(buf_count<buf_size)) {
      i=(buf_head+buf_count)&0x1F;
      buffer[i]=read_adc();
      buf_count++;	
    }
    // else overflow  
    if (audio) ad_count=0;
    else {
      ad_count++;
      if (ad_count>3) ad_count=0;
    }
//#ifdef GAME   
//    if (ad_count==1) set_adc_channel(4); else set_adc_channel(ad_count);	
//#else
    set_adc_channel(ad_count);	
//#endif
  }
}

// Resets AD buffer
void purge_adc_buffer()
{
  buf_head=0;
  buf_count=0;
  set_adc_channel(0);
  ad_count=0;
}

// Green-Red... Happy?
void blink_happy()
{
  while (TRUE) {
    led_green();
    delay_ms(250); 
    led_red();
    delay_ms(250); 
  }
}

void blink_sad()
{
  while (TRUE) {
    led_red();
    delay_ms(250); 
    led_off();
    delay_ms(250); 
  }
}

// Turn off CF
void disable_cf()
{
  set_default_signals();
}

// exit if CF is plugged; otherwise sleep waking up on WDT to check for CF; 
void take_a_nap()
{
  if (input(CF_POWER)) {
    output_low(CF_POWER);
    delay_ms(10);
  }	
  disable_cf();
  do {
    while(cf_out) {	
      led_red();
      delay_ms(1);	
      CF_DATA=0;
      SET_TRIS_D(TRIS_D_OUT);
      set_tris_c(TRIS_C_SLEEP);
      led_off(); 	
      sleep();
    }   
    delay_ms(500);
  } while(cf_out); // make sure CF is still in after 0.5 sec 
  output_low(CF_POWER); // power up
  output_high(CF_N_OE);
  output_high(CF_N_WE);
  SET_TRIS_D(TRIS_D_IN);
  led_green();	
  delay_ms(250);
  led_off(); 	
  // Check CF card configuration
  disk_valid=get_disk_configuration();
}

boolean enable_cf()
{
  // sleep until CF is present
  take_a_nap();
  return TRUE; 
}


#define I2CWRITE 0b00000000
#define I2CREAD  0b00000001

void putI2C(int device, int data) 
{
  i2c_start();
  i2c_write(device);
  i2c_write(data);
  i2c_stop();
}

int getI2C(int device) 
{
  i2c_start();
  i2c_write(device | I2CREAD);
  _return_ = i2c_read();
  i2c_stop();
}

void send_hello()
{
  while (!input(RCIF)) printf("Hello! ");
}
  
void main()
{
  setup_adc_ports(A_ANALOG); // port A all analog inputs
  setup_adc(ADC_CLOCK_DIV_32); // set ADC clock
  setup_psp(PSP_DISABLED);

  set_default_signals(); // preset some of the signals

  SET_TRIS_A(TRIS_A); // set TRIS values
  SET_TRIS_B(TRIS_B);
  SET_TRIS_C(TRIS_C);
  SET_TRIS_D(TRIS_D_IN);
  SET_TRIS_E(TRIS_E);

  port_b_pullups(TRUE); // Should be enabled; Used for B6 and B7 (CF power and CF detection)
  setup_timer_2(T2_DIV_BY_4, 250, 5); // default timer: 1mS interval @ 20 MHz; see timer2()
  zero32(ms); // zero millisecond counter
  ad_on=FALSE;
  audio=FALSE;
  purge_adc_buffer();

//  enable_interrupts(INT_RB);  
  enable_interrupts(INT_TIMER2);  
  enable_interrupts(GLOBAL);
  
  disable_cf();
//  set_default_signals();
//  send_hello();
#ifdef GAME  
  puts("GAME");
  send_player_info();
#else  
//  take_a_nap();
#endif
#ifdef Rochester  
  puts("Roch");
  delay_ms(5000);
  save_audio();
#endif  
#ifdef ESL  
  puts("HackFest v odno slovo");
//  send_data_bim();
#endif  
#ifdef Tim  
  puts("Tim");
  send_data_Tim();
#endif  
  print_prompt();	
  while(TRUE)
  {
    led_off();
    process_command();
    led_red();	
    led_green();
    led_green();
//    if (cf_out) take_a_nap();
  }
}

void set_default_signals()
{
  // default RTC signals
  output_low(RTC_RST);
  output_low(RTC_CLK);
  output_low(RTC_IO); 
  // default CF power down signals
  output_low(CF_N_OE);
  output_low(CF_N_WE);
  cf_set_addr(0);
  output_high(CF_POWER);
  // default radio modem signals
  output_high(BIM_TX); // do not transmit
  output_high(BIM_RX); // do not recive
  // disable EKG amplifiers if present
  output_high(EKG_EN);
  // presumption of invalidity
  disk_valid=false;
}

// reset CF
#separate
void cf_reset()
{
  output_high(CF_POWER);
  delay_ms(500);
  output_low(CF_POWER);
}

// set CF port address (see task file in CF specs)
// Horder uses ports 0-7 to control CF
void cf_set_addr(int addr)
{
  output_bit(CF_A0, bit_test(addr, 0));
  output_bit(CF_A1, bit_test(addr, 1));
  output_bit(CF_A2, bit_test(addr, 2));
}

// write 1 byte into current CF port
void cf_write(int data)
{
  // set data	
  CF_DATA_TRIS = TRIS_D_OUT;
  CF_DATA = data;
  // Strobe write signal
  OUTPUT_LOW(CF_N_WE);
  OUTPUT_HIGH(CF_N_WE);
  CF_DATA_TRIS = TRIS_D_IN;
}

// read 1 byte from current CF port
int cf_read()
{
  CF_DATA_TRIS = TRIS_D_IN;
  // strobe read signal and get data
  output_low(CF_N_OE);
  _return_ = CF_DATA;
  output_high(CF_N_OE);
}

// skip bytes from current sector buffer
// assumes: CF port set to 0
void cf_read_skip(unsigned int count)
{
  CF_DATA_TRIS = TRIS_D_IN;
  do {
    output_low(CF_N_OE);
    output_high(CF_N_OE);
    count--;
  } while (count>0);
}

// write data to CF port addr
void cf_task_file_write(int addr, int data)
{
  cf_set_addr(addr);
  cf_write(data);
}

// read byte from CF port addr
int cf_task_file_read(int addr)
{
  cf_set_addr(addr);
  return(cf_read());
}

// enable nice power-saving features of Microdrive (see Microdrive specs)
// does nothing if used with regular CF memory cards
void enable_microdrive_write_cache()
{
  while ((cf_task_file_read(7)&0xC0)!=0x40);
  cf_task_file_write(1, 0x02);   // 0x02 = enable write cache  
  cf_task_file_write(6, 0xE0);     
  cf_task_file_write(7, 0xEF);   // set features command
  while ((cf_read()&0xC0)!=0x40);
  cf_task_file_write(1, 0xAA);   // 0xAA = enable read look ahead  
  cf_task_file_write(6, 0xE0);     
  cf_task_file_write(7, 0xEF);   // set features command
  while ((cf_read()&0xC0)!=0x40);
#ifdef DelayedWrite  
  cf_task_file_write(1, 0x07);   // 7 = enable delayed write  
  cf_task_file_write(6, 0xE0);     
  cf_task_file_write(7, 0xFA);   // set delayed write command
  while ((cf_read()&0x80)==0x80);
#endif  
}

// start reading CF sector
// global var sector indicates sector number
// after calling this function use cf_read() and cf_skip(int) 
// to read/skip 512 bytes from sector
void cf_start_sector_read()
{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费观看日韩av| 波多野结衣中文字幕一区 | 国产自产高清不卡| 亚洲人成网站精品片在线观看| 欧美日韩一二区| 精品免费一区二区三区| 欧美日韩国产经典色站一区二区三区 | 欧美成人一区二区三区在线观看| 成人免费毛片片v| 欧美色老头old∨ideo| aaa亚洲精品| 午夜欧美一区二区三区在线播放| 国产精品视频yy9299一区| 免费成人结看片| 欧美日韩国产一区| 日韩欧美区一区二| 五月婷婷综合网| 日本精品一区二区三区四区的功能| 在线精品国精品国产尤物884a| 精品视频免费在线| 亚洲色图制服诱惑| 成人av午夜电影| 国产精品成人在线观看| 丰满放荡岳乱妇91ww| 久久久久久久久蜜桃| 精品一区二区三区香蕉蜜桃| 精品久久一二三区| 久久精品久久综合| 久久人人97超碰com| 国产资源精品在线观看| 26uuu色噜噜精品一区二区| 亚洲欧洲日韩一区二区三区| 不卡在线观看av| 亚洲欧洲另类国产综合| 日韩国产在线观看一区| 欧美日韩精品二区第二页| 五月激情六月综合| 欧美猛男gaygay网站| 免费久久99精品国产| 久久婷婷色综合| 午夜精品久久久久久久蜜桃app| 国产九色sp调教91| 国产欧美日韩精品一区| 99久久er热在这里只有精品15| 91精品国产综合久久精品图片 | 天天综合天天综合色| 6080日韩午夜伦伦午夜伦| 美女脱光内衣内裤视频久久影院| 国产在线一区二区综合免费视频| va亚洲va日韩不卡在线观看| 亚洲精品成人精品456| 欧美日韩美女一区二区| 国产麻豆视频精品| 亚洲图片你懂的| 国产一区二区三区综合| 国产精品国产自产拍高清av王其| 久久国产婷婷国产香蕉| 中文字幕精品三区| 欧美视频一区二区| 久久99精品久久久| 国产精品理伦片| 欧美群妇大交群中文字幕| 日韩1区2区日韩1区2区| 中文字幕 久热精品 视频在线| 日韩一区精品视频| 久久久久久久综合日本| 99久久99久久综合| 久久精品999| 精品国产乱子伦一区| 91色在线porny| 蜜桃视频一区二区三区 | 国产无一区二区| 国内成人自拍视频| 亚洲夂夂婷婷色拍ww47| eeuss国产一区二区三区| 国产欧美1区2区3区| 欧美三级三级三级| 成熟亚洲日本毛茸茸凸凹| 日韩激情视频网站| 亚洲精品国产无天堂网2021| 色猫猫国产区一区二在线视频| 亚洲欧洲性图库| 欧美精品一区二区三区蜜桃| 韩国av一区二区三区在线观看| 精品理论电影在线观看| 欧洲在线/亚洲| 99久久亚洲一区二区三区青草| 国产精品国产精品国产专区不蜜| 94-欧美-setu| 激情久久久久久久久久久久久久久久| 日韩午夜精品电影| 欧美喷水一区二区| 色婷婷精品久久二区二区蜜臂av| 一区二区三区不卡视频在线观看| 欧美午夜寂寞影院| 91蝌蚪国产九色| jvid福利写真一区二区三区| 国产一区二区三区观看| 精品一区二区免费视频| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲高清不卡在线| 亚洲精品国产精华液| 国产欧美日韩激情| 久久久精品黄色| 成人美女在线视频| 国产成人免费高清| 国产麻豆精品在线| 激情亚洲综合在线| 久久99久久99精品免视看婷婷 | 欧美精品 日韩| 在线精品视频一区二区三四 | 欧美一区二区三区思思人| 在线观看精品一区| 欧美午夜精品一区二区三区| 在线免费精品视频| 另类综合日韩欧美亚洲| 国产精品色哟哟| 国产精品久久免费看| 最新成人av在线| 亚洲影院理伦片| 日本在线不卡一区| 国产主播一区二区| 高清不卡一区二区在线| av中文字幕不卡| 在线亚洲免费视频| 欧美日韩国产电影| 欧美精品一区二区久久婷婷| 日本一区免费视频| 亚洲欧洲日产国码二区| 精品日韩一区二区三区免费视频| 成人精品鲁一区一区二区| 99综合电影在线视频| 精品亚洲免费视频| 国产激情偷乱视频一区二区三区 | 伊人色综合久久天天人手人婷| 日韩免费看的电影| 欧美色图激情小说| 欧美一区二区播放| 国产欧美在线观看一区| 亚洲激情男女视频| 久久av中文字幕片| www.爱久久.com| 欧美一区二区三区视频免费 | 91色porny| 日韩欧美中文字幕公布| 国产精品免费视频观看| 午夜精品久久久| 成人激情图片网| 91精品国产丝袜白色高跟鞋| 国产精品欧美一区二区三区| 日韩在线一区二区| av一区二区三区| 日韩精品中文字幕在线一区| 国产精品国产三级国产aⅴ中文| 久久精品一区二区三区av| 亚洲精品国产精华液| 亚洲欧洲制服丝袜| 捆绑变态av一区二区三区| 一级女性全黄久久生活片免费| 中文字幕一区二区5566日韩| 亚洲va欧美va国产va天堂影院| 一区二区在线观看免费视频播放| 136国产福利精品导航| 麻豆久久久久久久| 欧美亚洲综合一区| 国产精品九色蝌蚪自拍| 中文字幕第一区第二区| 伦理电影国产精品| 狠狠v欧美v日韩v亚洲ⅴ| 欧洲人成人精品| 自拍偷拍亚洲激情| 国产一二三精品| 波多野结衣一区二区三区| 欧美一区二区高清| 亚洲sss视频在线视频| 99久久精品国产一区| 国产日韩精品一区二区三区 | 久久亚洲一区二区三区四区| 亚洲综合成人在线视频| voyeur盗摄精品| 国产日韩精品久久久| 黄色日韩三级电影| 91精品国产综合久久国产大片| 精品免费国产一区二区三区四区| 精品国产免费人成电影在线观看四季| 久久久久久久久久久电影| 麻豆精品视频在线观看免费| 欧美日韩国产综合一区二区 | 精品处破学生在线二十三| 五月婷婷久久丁香| 欧美欧美欧美欧美首页| 亚洲电影中文字幕在线观看| 在线免费一区三区| 精品国产91久久久久久久妲己| 中文字幕第一页久久| 成人黄色电影在线| 国产精品国产自产拍在线| av在线不卡电影| 一区二区三区在线免费| 91久久一区二区|