Электронный замок с управлением от таблеток iBUTTON
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Электронный замок с управлением от таблеток iBUTTON
Хелп откройте, там всё есть, даже с примерами...
-
invisible86
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт сен 11, 2012 07:09:52
Re: Электронный замок с управлением от таблеток iBUTTON
Уже открыл, просто 64 бита я считаю, но ячейка памяти eeprom 8 бит, если я просто отправлю все 64 как мне кажется все ячейки памяти заполнятся автоматически и по порядку. а как указать в какой диапазон ячеек памяти поместить значение переменой что бы потом, занести несколько таблеток в разные ячейки, и вызывать их значения из EEPROM по очереди для сравнения
temp = Ow_Read(&PORTE,2); //прочитали значение ключа 64 бит и записали в переменную temp
EEprom_Write(temp); //записали их в EEPROM с 1 по 8 ячейку памяти (если конечно он запишет именно с 1, а если нет)
ход мысли у меня правильный?
temp = Ow_Read(&PORTE,2); //прочитали значение ключа 64 бит и записали в переменную temp
EEprom_Write(temp); //записали их в EEPROM с 1 по 8 ячейку памяти (если конечно он запишет именно с 1, а если нет)
ход мысли у меня правильный?
-
invisible86
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт сен 11, 2012 07:09:52
Re: Электронный замок с управлением от таблеток iBUTTON
то есть я тоже начинаю кажется через ж.... 
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Электронный замок с управлением от таблеток iBUTTON
temp = Ow_Read(&PORTE,2); //прочитали значение ключа 64 бит и записали в переменную temp
- Вложения
-
- microc.JPG
- (128.08 КБ) 1161 скачивание
-
invisible86
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт сен 11, 2012 07:09:52
Re: Электронный замок с управлением от таблеток iBUTTON
согласен незаметил 
-
invisible86
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт сен 11, 2012 07:09:52
Re: Электронный замок с управлением от таблеток iBUTTON
интересно как же они тогда в примере все 64 прочитали
do { // главный цикл
Ow_Reset(&PORTE,2); // Сигнал сброса по шине Onewire
Ow_Write(&PORTE,2,0xCC); // Выдача команды SKIP_ROM
Ow_Write(&PORTE,2,0x44); // Выдача команды CONVERT_T
Delay_us(120);
Ow_Reset(&PORTE,2);
Ow_Write(&PORTE,2,0xCC); // Выдача команды SKIP_ROM
Ow_Write(&PORTE,2,0xBE); // Выдача команды READ_SCRATCHPAD
Delay_ms(400);
j = Ow_Read(&PORTE,2); // Получить LSB температуры
temp = Ow_Read(&PORTE,2); // Получить MSB температуры
temp <<= 8; temp += j; // Формирование результата
Display_Temperature(temp); // Форматирование и вывод результатов на LCD
Delay_ms(500);
} while (1);
или я что то не понял?
do { // главный цикл
Ow_Reset(&PORTE,2); // Сигнал сброса по шине Onewire
Ow_Write(&PORTE,2,0xCC); // Выдача команды SKIP_ROM
Ow_Write(&PORTE,2,0x44); // Выдача команды CONVERT_T
Delay_us(120);
Ow_Reset(&PORTE,2);
Ow_Write(&PORTE,2,0xCC); // Выдача команды SKIP_ROM
Ow_Write(&PORTE,2,0xBE); // Выдача команды READ_SCRATCHPAD
Delay_ms(400);
j = Ow_Read(&PORTE,2); // Получить LSB температуры
temp = Ow_Read(&PORTE,2); // Получить MSB температуры
temp <<= 8; temp += j; // Формирование результата
Display_Temperature(temp); // Форматирование и вывод результатов на LCD
Delay_ms(500);
} while (1);
или я что то не понял?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Электронный замок с управлением от таблеток iBUTTON
Где Вы тут увидели чтение 64 бит ? Тут вообще температура читается. 
Re: Электронный замок с управлением от таблеток iBUTTON
Вы каж-ся сильно тормозите.....
Я тут как раз занимаюсь переводом своей игрушки с асма на С, как закончу, могу поделится, как я работаю c 1WIRE и с EEPRPOM.....
http://asis-kbr.ru/forum/viewtopic.php?f=9&t=117
Тут читается только 8 бит.... чтобы прочитать 64, надо 8 раз вызвать данную фкнкцию.invisible86 писал(а):temp = Ow_Read(&PORTE,2); //прочитали значение ключа 64 бит и записали в переменную temp
Здесь тоже происходит запись только одного байта, чтобы записать 8 байт, надо соответственно 8 раз вызвать данную ф-цию.invisible86 писал(а):EEprom_Write(temp); //записали их в EEPROM с 1 по 8 ячейку памяти (если конечно он запишет именно с 1, а если нет)
Ничего автоматически заполнятся не будет, все надо прописать, в цикле, читать байт 1wire, потом сохранять в EEPROM, и так 8 раз.....invisible86 писал(а):Уже открыл, просто 64 бита я считаю, но ячейка памяти eeprom 8 бит, если я просто отправлю все 64 как мне кажется все ячейки памяти заполнятся автоматически и по порядку. а как указать в какой диапазон ячеек памяти поместить значение переменой что бы потом, занести несколько таблеток в разные ячейки, и вызывать их значения из EEPROM по очереди для сравнения
Я тут как раз занимаюсь переводом своей игрушки с асма на С, как закончу, могу поделится, как я работаю c 1WIRE и с EEPRPOM.....
http://asis-kbr.ru/forum/viewtopic.php?f=9&t=117
-
invisible86
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт сен 11, 2012 07:09:52
Re: Электронный замок с управлением от таблеток iBUTTON
shads, спасибо, буду рад если поделитесь.
А разве если я восемь раз буду в читать данные не считаются ли все 8 раз одни и те же младшие 8 бит? разве не нужно указывать как то что и откуда читать? знаешь уже крыша едет
А разве если я восемь раз буду в читать данные не считаются ли все 8 раз одни и те же младшие 8 бит? разве не нужно указывать как то что и откуда читать? знаешь уже крыша едет
-
invisible86
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт сен 11, 2012 07:09:52
Re: Электронный замок с управлением от таблеток iBUTTON
не думал что так трудно будет найти исходник написанный на mikroC for PIC для того что бы разобраться на примере уже почти месяц рою интернет 
-
invisible86
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт сен 11, 2012 07:09:52
Re: Электронный замок с управлением от таблеток iBUTTON
shads, а ты не мог бы мне подробнее расписать что и где происходит в том отрезке кода который я привел и для чего что делается, раз уж ты в 20 раз дольше программированием занимаешься, чем я 
Последний раз редактировалось invisible86 Вс сен 16, 2012 18:49:55, всего редактировалось 1 раз.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Электронный замок с управлением от таблеток iBUTTON
Потому, что на нём никто ничего не делает нормального, т.к. это игрушка, у которой глобальные проблемы с оптимизацией.invisible86 писал(а):не думал что так трудно будет найти исходник написанный на mikroC for PIC для того что бы разобраться на примере уже почти месяц рою интернет
Я Вам уже посоветовал плюнуть на этот микроси и перейти на нормальный компилятор, пока не поздно.
-
invisible86
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт сен 11, 2012 07:09:52
Re: Электронный замок с управлением от таблеток iBUTTON
Аlex, у меня с ним проблем раньше не было
-
invisible86
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт сен 11, 2012 07:09:52
Re: Электронный замок с управлением от таблеток iBUTTON
Alex, для пробы дай ссылку на хороший компилятор
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Электронный замок с управлением от таблеток iBUTTON
Ищи HI-TECH PICC , только не PRO, лучше ставь STD.
Где скачать - не знаю...
Где скачать - не знаю...

Re: Электронный замок с управлением от таблеток iBUTTON
Во первых, я ни в MicroC ни в PIC-ах ни шарю вообще.....
Во вторых на C я тоже делаю первые шаги, это на асме я пишу лет 20, а вот C для меня тоже новое, но потихоньку дело идет, по крайней мере и с EEPROM и с 1WIRE уже получается. На С могу скинуть функции которые я использую, скажи если надо. Правда я их для AVR использую, для PIC низнаю пойдут ли в таком виде, хотя C он и в африке C.....
Ow_Write(&PORTE,2,0xCC); - передает байт 0xCC 1wire устройству подключенному к порту PORTE и линии 2.
Ow_Read(&PORTE,2); - читает байт с 1wire устройства.
Чтобы прочитать 64 бита (8 байт) надо сделать както так:
Если пишеш (или читаеш) с EEPROM, то надо при чтении\записи каждого байта указывать что, куда.....
В листинге первого сообщения нашел такой вариант EEPROM_WRITE ( EEPROMSIZE , kol ); это уже более похоже на рабочий вариант, тут два параметра.
А вообще, чтобы мозгодробилкой (с незнакомыми контроллерами да компиляторами) не заниматься, мне легче написать прошивку для AVR, если устраивает AVR, могу состряпать.....
Во вторых на C я тоже делаю первые шаги, это на асме я пишу лет 20, а вот C для меня тоже новое, но потихоньку дело идет, по крайней мере и с EEPROM и с 1WIRE уже получается. На С могу скинуть функции которые я использую, скажи если надо. Правда я их для AVR использую, для PIC низнаю пойдут ли в таком виде, хотя C он и в африке C.....
Ну смотря откуда читаеш. Если читаеш 1wire то в коде который ты приводил, как раз показана работа с 1wire датчиком температуры DS1820. Я тут в скобках, еще свои коменты добавил, вроде все простоinvisible86 писал(а):А разве если я восемь раз буду в читать данные не считаются ли все 8 раз одни и те же младшие 8 бит? разве не нужно указывать как то что и откуда читать? знаешь уже крыша едет
Ow_Write(&PORTE,2,0xCC); - передает байт 0xCC 1wire устройству подключенному к порту PORTE и линии 2.
Ow_Read(&PORTE,2); - читает байт с 1wire устройства.
Спойлер
Код: Выделить всё
do { // главный цикл
Ow_Reset(&PORTE,2); // Сигнал сброса по шине Onewire (любое обращение к 1wire устройствам начинается со сброса)
Ow_Write(&PORTE,2,0xCC); // Выдача команды SKIP_ROM (исп-ся только когда подключено одно устройство на линии)
Ow_Write(&PORTE,2,0x44); // Выдача команды CONVERT_T (начать преобразование температуры, потом надо подождать ок 0,6 сек)
Delay_us(120); // (Вот тут как раз надо бы подождать 600мс а стоит почему то задержка 120мс ???)
Ow_Reset(&PORTE,2); // опять сброс (любое обращение к 1wire устройствам начинается со сброса)
Ow_Write(&PORTE,2,0xCC); // Выдача команды SKIP_ROM (опять обращаемся к одному устройству на линии)
Ow_Write(&PORTE,2,0xBE); // Выдача команды READ_SCRATCHPAD (читать данные устройства)
Delay_ms(400); // (Здесь вообще не нужна задержка, не знаю зачем тут влепили 400мс ???)
j = Ow_Read(&PORTE,2); // Получить LSB температуры (температура занимает 2 байта, читаем младший)
temp = Ow_Read(&PORTE,2); // Получить MSB температуры (читаем старший)
temp <<= 8; temp += j; // Формирование результата (ну и дальше уже чтото делаем с данными температуры.....)
Display_Temperature(temp); // Форматирование и вывод результатов на LCD
Delay_ms(500);
} while (1); Соответственно тут читается всего 1 байт.....invisible86 писал(а):temp = Ow_Read(&PORTE,2); //прочитали значение ключа 64 бит и записали в переменную temp
Чтобы прочитать 64 бита (8 байт) надо сделать както так:
Спойлер
Код: Выделить всё
char Ow_Data [8]; //в объявлениях, объявить массив, под чтение 8 байт по линии 1wire
void Ow_Read_Data (*char); //прототип функции чтения 8 байт данных по линии 1wire
Ow_Read_Data (Ow_Data); //так вызывать ф-цию. данные запишутся последовательно в массив Ow_Data[]
void Ow_Read_Data (*Addr) //функция чтения 8 байт данных с устройства 1wire
{
for (char i=0; i<8; i++)
*Addr++ = Ow_Read (&PORTE,2);//читаем с 1wire, записываем в массив, инкрементируем указатель, и так 8 раз
} Если пишеш (или читаеш) с EEPROM, то надо при чтении\записи каждого байта указывать что, куда.....
Тут тоже запишется только 1 байт. Чтобы записать 8 байт, надо впихнуть ее в цикл наподобие того что я описывал ранее. Хотя не совсем понятная для меня ф-ция, по идее ей должны передаваться 2 значения, адрес и байт для записи, а тут передается одно значение. Мож еще есть функции которые инициализируют указатель, а уже потом с помощью EEprom_Write(temp); последовательно записываются передаваемые байты данных..... вот тут не знаю.invisible86 писал(а):EEprom_Write(temp); //записали их в EEPROM с 1 по 8 ячейку памяти (если конечно он запишет именно с 1, а если нет)
В листинге первого сообщения нашел такой вариант EEPROM_WRITE ( EEPROMSIZE , kol ); это уже более похоже на рабочий вариант, тут два параметра.
А вообще, чтобы мозгодробилкой (с незнакомыми контроллерами да компиляторами) не заниматься, мне легче написать прошивку для AVR, если устраивает AVR, могу состряпать.....
-
invisible86
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт сен 11, 2012 07:09:52
Re: Электронный замок с управлением от таблеток iBUTTON
shads, Не поверишь до многого из этого я сам вчера допер, но все равно огромное спасибо, сегодня на работе опробую запись чтение EEPROM если успею еще и одно проводной опробую 
-
invisible86
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт сен 11, 2012 07:09:52
Re: Электронный замок с управлением от таблеток iBUTTON
shads, с EEPROM все получилось написал вот такой код
unsigned int a, b, e;
void main() {
trisd = 0b00000000;
portd=0b00011000;
delay_ms(1000);
// читаем eeprom ячейки 0, 1 и так для интереса 255, но так как они еще пустые как я понял выводятся все единицы
PORTd = Eeprom_Read(0);
delay_ms(1000);
PORTd = Eeprom_Read(1);
delay_ms(1000);
PORTd = Eeprom_Read(255);
delay_ms(1000);
// после чтения записываем данные в eeprom в те же ячейки
e=0b10000001;
b=0b01000010;
a=0b00100100;
EEprom_Write(0, a);
EEprom_Write(1, b);
EEprom_Write(255, e);
}
зашил, запустил, выждал 6 секунд, выключил
а потом изменил код
unsigned int a, b, e;
void main() {
trisd = 0b00000000;
while(1){
portd=0b00011000;
delay_ms(1000);
// читаем eeprom ячейки 0, 1 и так для интереса 255, но так как они еще пустые как я понял выводятся все единицы
PORTd = Eeprom_Read(0);
delay_ms(1000);
PORTd = Eeprom_Read(1);
delay_ms(1000);
PORTd = Eeprom_Read(255);
delay_ms(1000);
}
}
и зашил в мк сняв галочку с записи eeprom при прошивании, включил данные из eeprom читаются, получилось что-то вроде гирлянды
заодно выяснил опытным путем что если в мк 256 байт eeprom (адреса от 0 до 255) то если указать адрес 256 он запишется в 0 ячейку, те если до того как я подал команду записи в ячейку 256 я записал в 0, а потом в коде попытался записать в 256 то то что записано в 0 затрется командой записи в 256. тоже и при чтении
unsigned int a, b, e;
void main() {
trisd = 0b00000000;
portd=0b00011000;
delay_ms(1000);
// читаем eeprom ячейки 0, 1 и так для интереса 255, но так как они еще пустые как я понял выводятся все единицы
PORTd = Eeprom_Read(0);
delay_ms(1000);
PORTd = Eeprom_Read(1);
delay_ms(1000);
PORTd = Eeprom_Read(255);
delay_ms(1000);
// после чтения записываем данные в eeprom в те же ячейки
e=0b10000001;
b=0b01000010;
a=0b00100100;
EEprom_Write(0, a);
EEprom_Write(1, b);
EEprom_Write(255, e);
}
зашил, запустил, выждал 6 секунд, выключил
а потом изменил код
unsigned int a, b, e;
void main() {
trisd = 0b00000000;
while(1){
portd=0b00011000;
delay_ms(1000);
// читаем eeprom ячейки 0, 1 и так для интереса 255, но так как они еще пустые как я понял выводятся все единицы
PORTd = Eeprom_Read(0);
delay_ms(1000);
PORTd = Eeprom_Read(1);
delay_ms(1000);
PORTd = Eeprom_Read(255);
delay_ms(1000);
}
}
и зашил в мк сняв галочку с записи eeprom при прошивании, включил данные из eeprom читаются, получилось что-то вроде гирлянды
заодно выяснил опытным путем что если в мк 256 байт eeprom (адреса от 0 до 255) то если указать адрес 256 он запишется в 0 ячейку, те если до того как я подал команду записи в ячейку 256 я записал в 0, а потом в коде попытался записать в 256 то то что записано в 0 затрется командой записи в 256. тоже и при чтении
-
invisible86
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт сен 11, 2012 07:09:52
Re: Электронный замок с управлением от таблеток iBUTTON
shads, а еще мне интересно если я прочитаю данные ну к примеру с еепром и запишу их переменные a, b ,e, те a = 00011100, b = 00001111, e = 01110000 как мне их объединить в одно значение что бы вышло к примеру rez = 00011100 00001111 01110000, думаю нужно использовать сдвиг влево сдвинуть а влево чтобы получилось а = 00011100 00000000 и тд
правильно мыслю?
правильно мыслю?
Re: Электронный замок с управлением от таблеток iBUTTON
Я совсем недавно тоже выяснял эти вопросы в ветке про C. Использовал примерно так:invisible86 писал(а):shads, а еще мне интересно если я прочитаю данные ну к примеру с еепром и запишу их переменные a, b ,e, те a = 00011100, b = 00001111, e = 01110000 как мне их объединить в одно значение что бы вышло к примеру rez = 00011100 00001111 01110000, думаю нужно использовать сдвиг влево сдвинуть а влево чтобы получилось а = 00011100 00000000 и тд
правильно мыслю?
Спойлер
Код: Выделить всё
unsigned long abc; //переменная в 4 байта
unsigned char a; //обычные байты, которые надо объединить
unsigned char b;
unsigned char c;
abc <<= 8UL; //как то так помещаем байты в длинную переменную
abc |= c; //может и короче как получится, это я сейчас придумал
abc <<= 8UL; //именно так на практике не прменял
abc |= b; //я только вдвигал побитно как ниже.....
abc <<= 8UL;
abc |= a;
abc <<= 1UL; //побитное формирование длинной переменной, сдвиг влево
if (условие)
abc |=1; //в зависимости от условия устанавливаем младший бит
//и так в цикле, сколько надо бит задвинуть.....
a = (unsigned char) (abc >> 0); //как то так читаем из длинной переменной
b = (unsigned char) (abc >> 8);
c = (unsigned char) (abc >> 16);