|
Сравнение больших чисел, 64 бита и больше, на языке С, сильно не пинать:) |
|
|
|
May 26 2006, 04:34
|

Профессионал
    
Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360

|
#include <mega8535.h> // 1 Wire Bus functions #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=0 #endasm #include <1wire.h> #include <stdio.h> // Standard Input/Output functions #define MAX_DEVICES 1 //определяем максимальное количество устройств на шине unsigned char rom_codes[MAX_DEVICES][9]; //выделяет память (9 бит умноженное на кол-во устройств) void main(void) { unsigned char i=0; unsigned char j; unsigned char devices; // USART initialization UCSRA=0x00; UCSRB=0x08; UCSRC=0x86; UBRRH=0x00; UBRRL=0x03; // Analog Comparator: Off ACSR=0x80; w1_init(); // 1 Wire Bus initialization // Watchdog Timer initialization #pragma optsize- WDTCR=0x1F; WDTCR=0x0F; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif //ищем устройство командой 0xf0, в rom_codes ложится 9 байт (family-1,serial-6,CRC8-1,некоторые устройства возвращают 9 байт) devices=w1_search(0xf0,rom_codes); /* display the ROM codes for each detected device */ printf("%-u DEVICE(S) DETECTED\n\r",devices); // выводим количество подключенных устройств for (j=0;j<9;j++) // задаем, какую часть кода выводить { printf("%-X",rom_codes[i][j]); } printf("\n\r"); } На основе примера из CVAVR програмка, которая в сом-порт сбрасывает номер подключенного 1-wire устройства (DS1990). Эта часть кода работает. Подскажите, как сравнить номер "таблетки" с неким заданным значением, которое можно будет определить в начале программы, или с несколькими значениями. Вот собственно вопрос мой... Еще приветствуются указание моих косяков в программе и в комментариях
--------------------
Андрей Смирнов
|
|
|
|
|
May 26 2006, 06:57
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(Pyku_He_oTTyda @ May 26 2006, 08:34)  .... На основе примера из CVAVR програмка, которая в сом-порт сбрасывает номер подключенного 1-wire устройства (DS1990). Эта часть кода работает. Подскажите, как сравнить номер "таблетки" с неким заданным значением, которое можно будет определить в начале программы, или с несколькими значениями. Вот собственно вопрос мой... Еще приветствуются указание моих косяков в программе и в комментариях При считывании номера переведите его в строку ASCII символов (s1) и делайте сравнение с шаблонной строкой (s2) оператором - strcmp(s1, s2), где char *s1, s2; Можно написать свою функцию для сравнения строк, если нехотите или не т возможности использовать библиотчную.
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
May 26 2006, 07:04
|

Профессионал
    
Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360

|
Цитата GetSmart Простите за назойливость, а не могли бы черкнуть пример на моем частном случае, определить вот это значение: 11E6CAC00701 а то я плыву
--------------------
Андрей Смирнов
|
|
|
|
|
May 26 2006, 07:34
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Pyku_He_oTTyda @ May 26 2006, 10:04)  Цитата GetSmart Простите за назойливость, а не могли бы черкнуть пример на моем частном случае, определить вот это значение: 11E6CAC00701 а то я плыву  Код flash char pattern[] = {0x11, 0xe6, 0xca, 0xc0, 0x07, 0x01}; // Код "таблетки" char buffer[9];
char Match(char flash *pat, char *bp, char n) { while (n--) { if (*pat++ != *bp++) // байты не совпали return FAIL; // - выход по ошибке } return OK; // Успешный выход } ................... // -- Вызов if (Match(pattern, buffer, sizeof pattern) == OK) // Наш код! Smile(); // :-) else // Ерунда какая-то Cry(); // :-(
Сообщение отредактировал _Bill - May 26 2006, 07:35
|
|
|
|
|
May 26 2006, 08:07
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Pyku_He_oTTyda @ May 26 2006, 10:49)  Вообще запутался  , сосвоим кодом было не разобратся, а тут еще новый "То ли еще будет..., то ли еще будет... Ой ёй ёй..."
|
|
|
|
|
May 26 2006, 08:31
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
2 Pyku_He_oTTyda
По-моему _Bill написал хороший код. Без использования каких-либо библиотек. Он точно будет самым компактным. Советую. Если его чуть-чуть подправить. (уточнить) ____________________
Но если не нравится, то может этот:
unsigned char my_code[6] = {0x01,0x07,0xc0,0xca,0xe6,0x11};
for (j=0;j<9;j++) { if (memcmp(rom_codes[j][1], my_code, sizeof(my_code))==0) { // выполнить что-то и выйти из цикла break; } }
Я написал в обратном порядке байты (как в Интел-формате). Если подразумевалось не так, то переставьте их наоборот. Сам идентификатор как я понял содержит только 6 байт.
Сообщение отредактировал GetSmart - May 26 2006, 08:52
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|