_SETI (694811), страница 5
Текст из файла (страница 5)
}piofc
when (io_in_ready(s_bus))1 //готовность приема информации
{
piofc.length = DATA_SIZE; //максимальное число в байтах
to read
io_in(s_bus,&piofc); //получить 10 байт
incoming data
}
when (io_out_ready(s_bus)) //готовность передать 10 байт
{
piofc.length = 10; //кол-во байт
io_out(s_bus,&piofc); //передать 10 байт из буфера
}
when (...) //условие по которому будет отправлено сообщение о заполнении буфера
{
io_out_request(s_bus); } request
8.1.2. Программа обработки
************************************************************************
* Эта программа на Neuron C задает Neuron Chip в slave A
* подсчет импульсов поступающих с нейрочипа.
************************************************************************
#pragma enable_io_pullups
////////////////////Параматры для подсчета (определяются пользователем)////////////
#define lower_limit 0 //нижний предел подсчета
#define upper_limit 100 //верхний предел подсчета
#define shaft_direction 1 //направление счета (т.е.,
0=лево,1=право)
/////////////////// Программа //////////////////////
IO_5 input pulsecount analog_input;
IO_5 input quadrature shaft_encoder; //импульсы поступают на 5 вход нейрочипа
signed long count;
signed long increment;
when (io_update_occurs(shaft_encoder){
if (shaft_direction) count += input_value;
else count -= input_value; //вывод полученных данных
/////////////////// Проверка //////////////////////
if (count if (count>upper_limit) count=upper_limit; //Проверка переполнения overflow } when (reset) // Сброс { count = 0; } ************************************************************************ * Эта программа на Neuron C задает Neuron Chip в master A * принимает информацию со всех нейрочипов типа slave A и в случае превышения порогового уровня в 50 импульсов, что * соответствует ветру 50м/с передает информацию в центральную ЭВМ с указанием номера того датчика с которого поступила * данная информация и времени ее поступления ************************************************************************ #pragma scheduler_reset // процедура сброса #pragma enable_io_pull-ups // процедура подчета импульсов (описана выше) #pragma num_addr_table_entries 1 #pragma one_domain #pragma app_buf_out_priority_count 0 #pragma net_buf_out_priority_count 0 #define timerl 100 // таймер производит опрос по входам на наличие информации каждые 100мкС #define max_char_from_PC 30 //максимально разрешенное кол-во символов принимаемых нейрочипом #define porog 50 //установочный порог { unsigned int speed; //данные о скорости unsigned int number; // данные о номере датчика }; #define max_packet_size 60 // максимально разрешенный пакет отсылаемый в ЭВМ { unsigned int speed; //данные о скорости unsigned int minutes; //время принятия сообщения unsigned int hours; unsigned int number // номер датчика }; /******************************** Дополнительные файлы ************************************/ #include /********************************* Определение I/O ****************************************/ IO_5 output bit RTS; IO_2 output bit СTS; IO_4 output serial baud(4800) RXD; // read data from PC IO_10 output serial baud(4800) TXD; // send data to PC IO_8 input bit R/W; IO_5 input bit CS; IO_9 input bit HS; /****************************** Сетевые данные *************************************/ network input struct temp_time pctobc_speed_in; // speed network input struct temp_time pctobc_number_in; // number network input struct time NV_time_in; // BC time network input boolean NVfan_state_in // TRUE: fan is flashing network input boolean NVcomp_state_in; // TRUE: compressor is on network output struct temp_time bind_info(unackd) NV_timesetpt_out; //************************************ Глобальные ***************************************/ char input_but[max_packet_size]; // пакет отсылаемый в ЭВМ char input_buf1[max_char_from_PC]; // Input from PC (1st time) char input_buf2[max_char_from_PC]; // Input from PC (2nd time) char * buf_ptr; // указатель в буфере boolean packet_found = FALSE; // пакет не найден. boolean compress_state = FALSE; // датчик не исправен int last_num_chars; // количество принятых символов int speed; char out_char[1]; struct bcd digits; // holds BCD data to be sent to PC // digits.d1 most significant nibble in ms byte // digits.d2 least significant nibble in ms byte // digits.d3 most significant nibble // digits.d4 least significant nibble // digits.d5 most significant nibble in ls byte // digits.d6 least significant nibble in ls byte struct { // data from bc unsigned int speed; unsigned int number; } bc_data; struct speed_time bc_number; /************************************ Timers ******************************************/ mtimer repeating check_CTS; mtimer repeating get_data_from_bc; // every 100 ms poll bc // then send to PC /*********************************** Functions ****************************************/ boolean append_packet( ) description: assert CTS, append data to input_buf[ ] if any and return append_packet = TRUE if 1st char. = ‘D’ and last char. is a CR. { boolean packet; int i; int num_chars1; int num_chars2; packet = FALSE; num_chars1 = 0; num_chars2 = 0; io_out( CTS, 0 ); // enable cts num_chars1 = io_in( RXD, input_buf1, max_char_from_PC ); io_out( CTS, 1 ); // disable cts when (io_puls_up io_5 > porog ) { num_chars2 = io_in( RXD, input_buf2, max_char_from_PC ); // append data over to where final packet goes if ( num_chars1 != 0 ) { // if data append it to input_buf for ( i = last_num_chars; i < last_num_chars + num_chars1; i++ ) { input_buf[i] = input_buf1[ i - last_num_chars ]; // append } last_num_chars = last_num_chars + num_chars1; } if ( num_chars2 != 0 ) { // if data append it to input_buf for ( i = last_num_chars; i < last_num_chars + num_chars2; i++ ) { input_buf[i] = input_buf2[ i - last_num_chars ]; // append } last_num_chars = last_num_chars + num_chars2; } if ( last_num_chars > 0 ) { // something there if ( input_buf[0] != ‘D’ ) { // A packet is started and packet is invalid last_num_chars = 0; // reset count of total characters read packet = FALSE; } else if ( input_buf[ last_num_chars - 1 ] == ‘/r’ ) { // 1st char. a ‘D’ and last char. a carriage return packet = TRUE; } } // something there return( packet ); } // This function converts a hex character to 2 ASCII characters // and sends the characters to out the TXC port to the PC // void putch_hex(unsigned int hex_char) { out_char[0] = ( hex_char >> 4 ) & 0x0f; // keep lower nibble if( out_char > 9 ) out_char[0] += 0x37; else out_char[0] += 0x30; io_out( TXD, out_char, 1 ); // output 1 char. out the 232 port to the PC out_char[0] = hex_char & 0x0f; if(out_char > 9) out_char[0] += 0x37; else out_char[0] += 0x30; io_out( TXD, out_char, 1 ); // output 1 char. out the 232 port to the PC } // // This function converts two ascii characters to a decimal digit // unsigned char to_dec(unsigned char msb,unsigned char lsb) { return( (msb - 48) * 10 + (lsb - 48) ); } /************************************* Reset ***************************************** when (reset) { bc_data.hours = 0; bc_data.minutes = 0; bc_data.speed = 0; bc_data.number = 0; check_CTS = timer1; // repeating timer when to assert CTS // to check for PC data get_data_from_bc = 100; // every 100 ms poll bc and then send to PC when (io_puls_up io_5 >50 ) { when ( timer_expires(check_CTS) { // go get next character(s) packet_found = append_packet( ); // append more data if any // to input_buf[]. // also returns true if // when finds what looks like a good packet. check_CTS = timer1; } when ( packet_found ) { // process packet // packet format: switch( input_buf[1] ) { // select from type of packet byte case ‘1’:// set time if ( last_num_chars == 7 ) { NV_timesetpt_out.temp = 255; // code for do not use // convert ASCII HHMM in input_buf[2-5] to unsigned int. bc_data.hours = NV_timesetpt_out.hours = to_dec(input_buf[2], input_buf[3]); bc_data.minutes = NV_timesetpt_out.minutes = to_dec(input_buf[4], input_buf[5]); } break; case ‘2’: // set number if ( last_num_chars == 5 ) { // convert ASCII set point in input_buf[2-3] to unsigned int. bc_data.number = NV_timesetpt_out.speed = to_dec(input_buf[2], input_buf[3]); NV_timesetpt_out.hours = 255; // code for do not use NV_timesetpt_out.minutes = 255; // code for do not use } break; default: // bad packet break; } packet_found = FALSE; // finished last packet last_num_chars = 0; // reset # of bytes collected in packet for ( temp = 0; temp < max_packet_size; temp++ ) { // not needed but helps in d input_buf[temp] = 0; } } when ( nv_update_fails ) { } when ( nv_update_occurs(NV_time_in) ) { // BC to PC time (HHMM) bc_data.hours = NV_time_in.hours; // HH time bc_data.minutes = NV_time_in.minutes; // MM time } when ( nv_update_occurs(pctobc_temp_in) ) { // BC to PC speed bc_data.speed = pctobc_temp_in.temp; // BC speed } when ( nv_update_occurs(pctobc_setpt_in) ) { // BC to PC number bc_data.setpoint = pctobc_setpt_in.temp; // BC number } when ( nv_update_occurs(NVcomp_state_in) ) { if (NVcomp_state_in == TRUE) { compress_state = TRUE; } else { compress_state = FALSE; } } when ( nv_update_occurs(NVfan_state_in) ) { if (NVfan_state_in == TRUE; fan_state = TRUE; } else { fan_state = FALSE; } } when ( nv_update_fails(NVcomp_state_in) ) { // datchik not responding compress_state = FALSE; // assume off } when( timer_expires(get_data_from_bc) ) { // every 100 ms send data to PC and poll fan and compressor for status poll(NVcomp_state_in); // compressor state get_data_from_bc = 100; // 100 ms repetitive timer // packet consists of: out_char[0] = ‘B’; // Beginning of packet character io_out(TXD, out_char, 1); // send out 232 port // output time (hours only) bin2bcd( (long) bc_data.hours, &digits); out_char[0] = digits.d5 + 0x30; // high time BCD digit converted to ASCII io_out( TXD, out_char, 1); out_char[0] = digits.d6 + 0x30; // low time BCD digit converted to ASCII io_out( TXD, out_char, 1); // output time (minutes only) bin2bcd( (long) bc_data.minutes, &digits); out_char[0] = digits.d5 + 0x30; // high time BDC digit converted to ASCII io_out( TXD, out_char, 1); out_char[0] = digits.d6 + 0x30; // low time BCD digit converted to ASCII io_out( TXD, out_char, 1); // output time (speed) bin2bcd( (long) bc_data.speed, &digits); out_char[0] = digits.d5 + 0x30; // high speed. BCD digit converted to ASCII io_out( TXD, out_char, 1); out_char[0] = digits.d5 + 0x30; // low speed. BCD digit converted to ASCII io_out( TXD, out_char, 1); // output time (number) bin2bcd( (long) bc_data.number, &digits); out_char[0] = digits.d5 + 0x30; // high stpt BCD digit converted to ASCII io_out( TXD, out_char, 1); out_char[0] = digits.d6 + 0x30; // low stpt BCD digit converted to ASCII io_out( TXD, out_char, 1); // output datchik on/off if ( compress_state == TRUE ) { // datchik is on // (i.e. LEDs scrolling) io_out(TXD, “1”, 1); // output to PC datchik is on } else {// datchik is off (i.e. LEDs not flashing) io_out(TXD, “0”, 1); // output to PC datchik is off } // a ends the packet io_out(TXD, “\r”, 1); // } Министерство общего и специального образования РФ Московский Энергетический Институт (Технический Университет) Филиал в городе Смоленске Кафедра вычислительной техникиХарактеристики
Список файлов реферата