Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: Помогите найти в коде чтение адреса с шины 1-wire. |
Цитата |
|
Тоже не однократно читал об этом, но у самого не появлялись проблемы при использовании "первой" ячейки EEPROM. Но лучше подстраховаться в таких устройствах.
Тоже не однократно читал об этом, но у самого не появлялись проблемы при использовании "первой" ячейки EEPROM. Но лучше подстраховаться в таких устройствах.
|
|
|
|
Добавлено: 06 июн 2013, 22:16 |
|
|
|
|
|
Заголовок сообщения: |
Re: Помогите найти в коде чтение адреса с шины 1-wire. |
Цитата |
|
А никаких команд не надо. Компилятор сам все сделает, что надо. Для пользователя С чтение/запись "просто переменной" и "еепром переменной" ничем не отличаются В ассемблере наверняка чуть похитрее
Единственное, встречал сообщения о проблемах с 0й ячейкой памяти - иногда сбиваются данные.
Поэтому у меня дополнительно такой костыль: [code]eeprom char zero @0x00;[/code] Он забивает за переменной "зеро" эту ячейку и далее нигде она уже не используется
|
|
|
|
Добавлено: 06 июн 2013, 21:13 |
|
|
|
|
|
Заголовок сообщения: |
Re: Помогите найти в коде чтение адреса с шины 1-wire. |
Цитата |
|
Спасибо, у меня еще один вопрос возник. Разве можно работать так с eeprom в коде, приведенном мною выше. Я там не вижу никаких специальных команд для работы с памятью Мк tiny45.(по крайнее мере при записи ключа должны присутствовать какие-то специальные команды). Или я что недопонимаю?
Спасибо, у меня еще один вопрос возник. Разве можно работать так с eeprom в коде, приведенном мною выше. Я там не вижу никаких специальных команд для работы с памятью Мк tiny45.(по крайнее мере при записи ключа должны присутствовать какие-то специальные команды). Или я что недопонимаю?
|
|
|
|
Добавлено: 06 июн 2013, 20:58 |
|
|
|
|
|
Заголовок сообщения: |
Re: Помогите найти в коде чтение адреса с шины 1-wire. |
Цитата |
|
А это рабочий код замка ??
Обратите внимание на функцию w1_search Первым параметром у нее задается код семейства slave устройства. 0xF0 соответствует температурным датчикам ds18b20, в то время как у таблеток 1990 он должен быть равен 0x01;
И именно эта функция считывает адреса всех подключенных 1wire устройств в массив.
Для такого замка считывание кода (w1_init() + w1_search()) можно заменить на:
[code]if (w1_init()) { ; если есть таблетка w1_write(0x33); ; требуем код for (j=0; j<8; j++) {read_rom_code[j]=w1_read();} ;записываем по байту в массив } [/code]
w1_search() получается компактнее, но 0xF0 для таблетки надо поменять на 0x01
|
|
|
|
Добавлено: 06 июн 2013, 01:53 |
|
|
|
|
|
Заголовок сообщения: |
Помогите найти в коде чтение адреса с шины 1-wire. |
Цитата |
|
[code]/***************************************************** This program was produced by the CodeWizardAVR V2.03.3 Evaluation Project : Замок iButton Chip type : ATtiny45 Clock frequency : 8,000000 MHz Memory model : Tiny External RAM size : 0 Data Stack size : 32 Фюзы: Low: 11100010 , High: 11011111 , Ext: *******1 Это значит: Частота 8 MHz без деления на 8 *****************************************************/ #include <tiny45.h> #include <delay.h> #define out PORTB.2 #define led PORTB.0 #define button1 PINB.3 #define button2 PINB.4 // 1 Wire Bus functions #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=1 #endasm #include <1wire.h> // Задаем глобальные переменные #pragma warn- /* eeprom unsigned char zero=255; */ eeprom unsigned char rom_code[15][8];/*31 -это max количество ключей.Для tiny-45 это 31*/ eeprom unsigned char m=0; #pragma warn+ unsigned char read_rom_code[8];
void main(void) { // Задаем докальные переменные unsigned char i,j,n; // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Инициализация портов ввода/вывода // Func5=In Func4=In Func3=In Func2=Out Func1=In Func0=Out // State5=P State4=P State3=P State2=0 State1=T State0=0 PORTB=0x38; DDRB=0x05; while (1) { if(w1_init()) // инициализация 1-Wire {w1_search(0xF0,&read_rom_code[0]); for(i=0;i<m;i++) // сравнение побайтно считанного и сохраненного кодов { n=0; for(j=0;j<8;j++) {if(read_rom_code[j]==rom_code[i][j]) n++;} if(n==8) goto zamok;} } if(button1==0) // проверка нажатия кнопки { while(button1==0) {} // ожидание отпускания кнопки led=1; // мигание светодиода delay_ms(500); led=0; // режим программирования и стирания в EEPROM while(w1_init()==0) {if(button1==0) goto end; if(button2==0) break;} if(button2==0) { while(button2==0) {} for(i=0;i<m;i++) // стереть все ключи {for(j=0;j<8;j++) {rom_code[i][j]=0;} m=0;} goto led_end;} w1_search(0xF0,&read_rom_code[0]); //записать в EEPROM if(m==31) goto end; /* m это максимальное количество ключей */ else {for(j=0;j<8;j++) {rom_code[m][j]=read_rom_code[j];} m++; led_end: led=1; // подтверждение записи и стирания delay_ms(2000); led=0;} end: while(button1==0) {} // ожидание отпускания кнопки for(i=0;i<2;i++) {led=1; delay_ms(500); led=0; delay_ms(200);} } if(button2==0) delay_ms(200); if(button2==0) zamok: { out=1; // процедура открытия замка delay_ms(200); out=0; } }; } [/code]
Имеется следующий несложный код для кодового замка с ключами i-button(ds1990a). Ну никак не могу найти команду чтения уникального номера с ключа таблетки. В мануалах про DS1990A команда считывания адреса - 0x33. Здесь не могу найти ничего подобного. Помогите пожалуйста разобраться.
|
|
|
|
Добавлено: 05 июн 2013, 23:58 |
|
|
|