Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

Re: Электронный замок с управлением от таблеток iBUTTON

Чт сен 13, 2012 11:35:03

Хелп откройте, там всё есть, даже с примерами...

Re: Электронный замок с управлением от таблеток iBUTTON

Чт сен 13, 2012 12:10:42

Уже открыл, просто 64 бита я считаю, но ячейка памяти eeprom 8 бит, если я просто отправлю все 64 как мне кажется все ячейки памяти заполнятся автоматически и по порядку. а как указать в какой диапазон ячеек памяти поместить значение переменой что бы потом, занести несколько таблеток в разные ячейки, и вызывать их значения из EEPROM по очереди для сравнения


temp = Ow_Read(&PORTE,2); //прочитали значение ключа 64 бит и записали в переменную temp

EEprom_Write(temp); //записали их в EEPROM с 1 по 8 ячейку памяти (если конечно он запишет именно с 1, а если нет)

ход мысли у меня правильный?

Re: Электронный замок с управлением от таблеток iBUTTON

Чт сен 13, 2012 12:14:38

то есть я тоже начинаю кажется через ж.... :)

Re: Электронный замок с управлением от таблеток iBUTTON

Чт сен 13, 2012 12:28:01

temp = Ow_Read(&PORTE,2); //прочитали значение ключа 64 бит и записали в переменную temp
Изображение
:)
Вложения
microc.JPG
(128.08 KiB) Скачиваний: 1127

Re: Электронный замок с управлением от таблеток iBUTTON

Пт сен 14, 2012 04:36:55

согласен незаметил :)

Re: Электронный замок с управлением от таблеток iBUTTON

Пт сен 14, 2012 11:22:48

интересно как же они тогда в примере все 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);

или я что то не понял?

Re: Электронный замок с управлением от таблеток iBUTTON

Пт сен 14, 2012 13:04:13

Где Вы тут увидели чтение 64 бит ? Тут вообще температура читается. :)

Re: Электронный замок с управлением от таблеток iBUTTON

Пт сен 14, 2012 17:08:17

Вы каж-ся сильно тормозите.....

invisible86 писал(а):temp = Ow_Read(&PORTE,2); //прочитали значение ключа 64 бит и записали в переменную temp
Тут читается только 8 бит.... чтобы прочитать 64, надо 8 раз вызвать данную фкнкцию.

invisible86 писал(а):EEprom_Write(temp); //записали их в EEPROM с 1 по 8 ячейку памяти (если конечно он запишет именно с 1, а если нет)
Здесь тоже происходит запись только одного байта, чтобы записать 8 байт, надо соответственно 8 раз вызвать данную ф-цию.

invisible86 писал(а):Уже открыл, просто 64 бита я считаю, но ячейка памяти eeprom 8 бит, если я просто отправлю все 64 как мне кажется все ячейки памяти заполнятся автоматически и по порядку. а как указать в какой диапазон ячеек памяти поместить значение переменой что бы потом, занести несколько таблеток в разные ячейки, и вызывать их значения из EEPROM по очереди для сравнения
Ничего автоматически заполнятся не будет, все надо прописать, в цикле, читать байт 1wire, потом сохранять в EEPROM, и так 8 раз.....

Я тут как раз занимаюсь переводом своей игрушки с асма на С, как закончу, могу поделится, как я работаю c 1WIRE и с EEPRPOM.....
http://asis-kbr.ru/forum/viewtopic.php?f=9&t=117

Re: Электронный замок с управлением от таблеток iBUTTON

Вс сен 16, 2012 17:20:25

shads, спасибо, буду рад если поделитесь.

А разве если я восемь раз буду в читать данные не считаются ли все 8 раз одни и те же младшие 8 бит? разве не нужно указывать как то что и откуда читать? знаешь уже крыша едет :)

Re: Электронный замок с управлением от таблеток iBUTTON

Вс сен 16, 2012 17:27:08

не думал что так трудно будет найти исходник написанный на mikroC for PIC для того что бы разобраться на примере уже почти месяц рою интернет :)

Re: Электронный замок с управлением от таблеток iBUTTON

Вс сен 16, 2012 17:32:37

shads, а ты не мог бы мне подробнее расписать что и где происходит в том отрезке кода который я привел и для чего что делается, раз уж ты в 20 раз дольше программированием занимаешься, чем я :wink:
Последний раз редактировалось invisible86 Вс сен 16, 2012 18:49:55, всего редактировалось 1 раз.

Re: Электронный замок с управлением от таблеток iBUTTON

Вс сен 16, 2012 18:22:00

invisible86 писал(а):не думал что так трудно будет найти исходник написанный на mikroC for PIC для того что бы разобраться на примере уже почти месяц рою интернет :)
Потому, что на нём никто ничего не делает нормального, т.к. это игрушка, у которой глобальные проблемы с оптимизацией.
Я Вам уже посоветовал плюнуть на этот микроси и перейти на нормальный компилятор, пока не поздно.

Re: Электронный замок с управлением от таблеток iBUTTON

Вс сен 16, 2012 18:48:47

Аlex, у меня с ним проблем раньше не было

Re: Электронный замок с управлением от таблеток iBUTTON

Вс сен 16, 2012 19:13:39

Alex, для пробы дай ссылку на хороший компилятор

Re: Электронный замок с управлением от таблеток iBUTTON

Вс сен 16, 2012 21:01:31

Ищи HI-TECH PICC , только не PRO, лучше ставь STD.
Где скачать - не знаю... :dont_know:

Re: Электронный замок с управлением от таблеток iBUTTON

Вс сен 16, 2012 22:56:54

Во первых, я ни в MicroC ни в PIC-ах ни шарю вообще.....
Во вторых на C я тоже делаю первые шаги, это на асме я пишу лет 20, а вот C для меня тоже новое, но потихоньку дело идет, по крайней мере и с EEPROM и с 1WIRE уже получается. На С могу скинуть функции которые я использую, скажи если надо. Правда я их для AVR использую, для PIC низнаю пойдут ли в таком виде, хотя C он и в африке C.....


invisible86 писал(а):А разве если я восемь раз буду в читать данные не считаются ли все 8 раз одни и те же младшие 8 бит? разве не нужно указывать как то что и откуда читать? знаешь уже крыша едет :)
Ну смотря откуда читаеш. Если читаеш 1wire то в коде который ты приводил, как раз показана работа с 1wire датчиком температуры DS1820. Я тут в скобках, еще свои коменты добавил, вроде все просто
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); 

invisible86 писал(а):temp = Ow_Read(&PORTE,2); //прочитали значение ключа 64 бит и записали в переменную temp
Соответственно тут читается всего 1 байт.....
Чтобы прочитать 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, то надо при чтении\записи каждого байта указывать что, куда.....
invisible86 писал(а):EEprom_Write(temp); //записали их в EEPROM с 1 по 8 ячейку памяти (если конечно он запишет именно с 1, а если нет)
Тут тоже запишется только 1 байт. Чтобы записать 8 байт, надо впихнуть ее в цикл наподобие того что я описывал ранее. Хотя не совсем понятная для меня ф-ция, по идее ей должны передаваться 2 значения, адрес и байт для записи, а тут передается одно значение. Мож еще есть функции которые инициализируют указатель, а уже потом с помощью EEprom_Write(temp); последовательно записываются передаваемые байты данных..... вот тут не знаю.
В листинге первого сообщения нашел такой вариант EEPROM_WRITE ( EEPROMSIZE , kol ); это уже более похоже на рабочий вариант, тут два параметра.

А вообще, чтобы мозгодробилкой (с незнакомыми контроллерами да компиляторами) не заниматься, мне легче написать прошивку для AVR, если устраивает AVR, могу состряпать.....

Re: Электронный замок с управлением от таблеток iBUTTON

Пн сен 17, 2012 05:18:05

shads, Не поверишь до многого из этого я сам вчера допер, но все равно огромное спасибо, сегодня на работе опробую запись чтение EEPROM если успею еще и одно проводной опробую :)

Re: Электронный замок с управлением от таблеток iBUTTON

Пн сен 17, 2012 06:37:16

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. тоже и при чтении :)

Re: Электронный замок с управлением от таблеток iBUTTON

Пн сен 17, 2012 06:46:19

shads, а еще мне интересно если я прочитаю данные ну к примеру с еепром и запишу их переменные a, b ,e, те a = 00011100, b = 00001111, e = 01110000 как мне их объединить в одно значение что бы вышло к примеру rez = 00011100 00001111 01110000, думаю нужно использовать сдвиг влево сдвинуть а влево чтобы получилось а = 00011100 00000000 и тд

правильно мыслю?

Re: Электронный замок с управлением от таблеток iBUTTON

Пн сен 17, 2012 09:30:07

invisible86 писал(а):shads, а еще мне интересно если я прочитаю данные ну к примеру с еепром и запишу их переменные a, b ,e, те a = 00011100, b = 00001111, e = 01110000 как мне их объединить в одно значение что бы вышло к примеру rez = 00011100 00001111 01110000, думаю нужно использовать сдвиг влево сдвинуть а влево чтобы получилось а = 00011100 00000000 и тд

правильно мыслю?
Я совсем недавно тоже выяснял эти вопросы в ветке про C. Использовал примерно так:
Спойлер
Код:
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;                        //в зависимости от условия устанавливаем младший бит
                                    //и так в цикле, сколько надо бит задвинуть.....

= (unsigned char) (abc >> 0);        //как то так читаем из длинной переменной
= (unsigned char) (abc >> 8);
= (unsigned char) (abc >> 16); 
Ответить