Страница 65 из 421

Добавлено: Пт фев 19, 2010 15:57:14
ValBag
ssvd писал(а):вот не могу понять где косяк! может кто увидит...
В реальности, если к схеме подключен 1датчик, то все нормально, а если 2 датчика, то показывается всякая фигня....
Если массив определен под один датчик, то так и будет:
unsigned char rom_codes[1][9];
Измените, в соответствии с кол-вом датчиков.

Добавлено: Пт фев 19, 2010 18:50:04
ssvd
ValBag писал(а):
ssvd писал(а):вот не могу понять где косяк! может кто увидит...
В реальности, если к схеме подключен 1датчик, то все нормально, а если 2 датчика, то показывается всякая фигня....
Если массив определен под один датчик, то так и будет:
unsigned char rom_codes[1][9];
Измените, в соответствии с кол-вом датчиков.
точно, спасибо, а то я как то по привычек нулевой то же посчитал )))

Добавлено: Пт фев 19, 2010 19:17:31
ValBag
ssvd писал(а): точно, спасибо, а то я как то по привычек нулевой то же посчитал )))
Так в данном случае "1" - это размер, а не индекс.

Добавлено: Пн фев 22, 2010 11:17:47
ssvd
понял! все заработало! )))

вот еще такая просьба, еще не собирал проект только накидал в протеусе и CodeVision. Это самые простые бинарные часы.
Скажите все ли правильно в схеме и коде?!

Добавлено: Пн фев 22, 2010 11:35:35
Александр 2677
Всем привет. Вот пытаюсь разобраться с CodeVisionAVR Evaluation . Смущает то что у меня нет плавной регулировки частоты во вкладке где выставляются фьюзы, на выбор вываливается только 5 вариантов . Хотя на скриншотах других участниках форума видно что присутствует плавная регулировка.

Добавлено: Пн фев 22, 2010 11:42:38
ssvd
Александр 2677 писал(а):Всем привет. Вот пытаюсь разобраться с CodeVisionAVR Evaluation . Смущает то что у меня нет плавной регулировки частоты во вкладке где выставляются фьюзы, на выбор вываливается только 5 вариантов . Хотя на скриншотах других участниках форума видно что присутствует плавная регулировка.
может у других не Evaluation?

Добавлено: Пн фев 22, 2010 11:59:37
Александр 2677
Программа такая же, отличие только в этом маленьком окошке. Единственное предположение что это глюк windovs 7.
А на что влияет эта настройка?

Добавлено: Пн фев 22, 2010 19:37:32
ValBag
ssvd писал(а):вот еще такая просьба, еще не собирал проект только накидал в протеусе и CodeVision. Это самые простые бинарные часы.
Скажите все ли правильно в схеме и коде?!
1. Могут выгореть разряды порта, где стоят индикаторы, т. к. нет балластных резисторов. Может это в Proteus-е не нарисовано (ему это до "лампочки"), тогда это полбеды.
2. Разряды PORTB с анодами идикаторов инициализированы в "1" (должны быть в "0"), а PORTD с катодами - в "0" (должны быть в "1"). Т. е. все светодиоды включаться сразу.
3. Затем, когда определится на первом switch нужный разряд катода, останутся включенными катоды 2-х линеек светодиодов. т. к. в программе не бегущий "0" по катодам на PORTD, а бегущая "1", т. е. получиться чёрт-те что.
4. Если часы двоичные, то для часовой линейки на 24 часа, нужен еще один разряд (светодиод). Для 12 часовой шкалы - хватит.
5. Частота кварца не указана. Таймер 1 должен "тикать" через секунду, для отсчета времени, а Таймер 0 - для динамической индикации, не менее, чем с частотой 75 Гц. Оба таймера работают по переполнению, не знаю как решена эта задача.
6. Такое выражение в операторе if(cur_dig++==3){cur_dig=0;}, скорее всего, не должно изменять переменную cur_dig. Оно служит только для логической операции (в данном случае проверке на равенство). Для реинициализации цикла switch, оно пойдет, но конкретный вид выражения будет зависеть от того, где будет изменяться переменная. Либо городить другой цикл, где сразу будет и изменение переменной, и переход на начало цикла.
Далее есть похожие выражения...
P.S. По п. 6 беру свои слова обратно - переменная изменяется. Только нужно инкремент переменной записать в префиксной форме if(++cur_dig==3){cur_dig=0;}
7. Зачем 2 блока switch ? Если определен нужный разряд (катод), то в этом же case: можно вывести нужную цифру и в PORTB.

Для того, чтобы обойтись одним таймером и одним источником прерывания, можно сделать так:
Выбрать режим СТС для Таймер1. Это сброс по совпадению. Исходя из частоты кварца, посчитать какое число нужно записать в регистр сравнения, чтобы прерывание происходило, допустим через 10 ms. Затем, по прерыванию через 10 ms индицировать цифры, переключая разряды, а счет времени вести, накапливая секунду в дополнительной переменной на 100.

Добавлено: Пн фев 22, 2010 20:25:12
ssvd
Александр 2677 писал(а):Программа такая же, отличие только в этом маленьком окошке. Единственное предположение что это глюк windovs 7.
А на что влияет эта настройка?
частота внутреннего генератора.

Добавлено: Пн фев 22, 2010 23:02:29
Bugger81
Прошу помочь начинающему!
Форум читать начал раньше, зарегистрировался только сейчас, когда буря в голове начала успокаиваться :)

Начал тут разбираться с DS3231 (часы), там получаю, например, байт секунд: первый 4 бита - единицы секунд, следующие 3 бита - десятки секунд, и старший бит - 0.
Как правильнее выделить десятки и единицы? Я делаю только так, но мне это кажется слишком громоздким решением:

Код: Выделить всё

    Tmp=read(0x0);     
    SecH=(Tmp<<1>>5);  
    Tmp=read(0x0);     
    SecL=(Tmp<<4>>4);  

После чего у меня остаётся SecH с десятками секунд и SecL - с единицами. И так приходится делать для каждого параметра (минуты, часы, день, месяц и т.д.) и после выводить наборную строку с десятком переменных через sprintf, плюс куча переменных.
Наверняка, есть быстрое и элегантное решение обработки и выдачи подобных данных.

Добавлено: Вт фев 23, 2010 07:26:35
ARV
Bugger81 писал(а):Начал тут разбираться с DS3231 (часы), там получаю, например, байт секунд: первый 4 бита - единицы секунд, следующие 3 бита - десятки секунд, и старший бит - 0.
вы получаете секунды в BCD-формате. если есть готовые функции для работы с BCD - пользуйтесь ими. но конкретно по вашему вопросу о "красивом выделении цифр" могу посоветовать структуру с битовыми полями:

Код: Выделить всё

typedef struct{
   unsigned char d1 : 4; // единицы
   unsigned char d10 : 3; // десятки 
   unsigned char reserved : 1; // резерв
} TIME;

unsigned char t = get_time(); // получаете время из часов
TIME *tptr = (void*)&t;

// выделение единиц секунд
int ed_sec = tptr->d1;
// выделение десятков
int dc_sec = tptr->d10;
// получение нормального числа секунд
int sec = tptr->d10 * 10 + tptr->d1; 
P.S. если вы считаете все данные из часов в массив байтов, а структуру с полями распишите для всех элементов даты/времени и "совместите" ее с этим массивом при помощи указателя или union, получится вполне красиво

Добавлено: Вт фев 23, 2010 08:12:24
ssvd
ValBag писал(а):
ssvd писал(а):вот еще такая просьба, еще не собирал проект только накидал в протеусе и CodeVision. Это самые простые бинарные часы.
Скажите все ли правильно в схеме и коде?!
1. Могут выгореть разряды порта, где стоят индикаторы, т. к. нет балластных резисторов. Может это в Proteus-е не нарисовано (ему это до "лампочки"), тогда это полбеды.
2. Разряды PORTB с анодами идикаторов инициализированы в "1" (должны быть в "0"), а PORTD с катодами - в "0" (должны быть в "1"). Т. е. все светодиоды включаться сразу.
3. Затем, когда определится на первом switch нужный разряд катода, останутся включенными катоды 2-х линеек светодиодов. т. к. в программе не бегущий "0" по катодам на PORTD, а бегущая "1", т. е. получиться чёрт-те что.
4. Если часы двоичные, то для часовой линейки на 24 часа, нужен еще один разряд (светодиод). Для 12 часовой шкалы - хватит.
5. Частота кварца не указана. Таймер 1 должен "тикать" через секунду, для отсчета времени, а Таймер 0 - для динамической индикации, не менее, чем с частотой 75 Гц. Оба таймера работают по переполнению, не знаю как решена эта задача.
6. Такое выражение в операторе if(cur_dig++==3){cur_dig=0;}, скорее всего, не должно изменять переменную cur_dig. Оно служит только для логической операции (в данном случае проверке на равенство). Для реинициализации цикла switch, оно пойдет, но конкретный вид выражения будет зависеть от того, где будет изменяться переменная. Либо городить другой цикл, где сразу будет и изменение переменной, и переход на начало цикла.
Далее есть похожие выражения...
7. Зачем 2 блока switch ? Если определен нужный разряд (катод), то в этом же case: можно вывести нужную цифру и в PORTB.

Для того, чтобы обойтись одним таймером и одним источником прерывания, можно сделать так:
Выбрать режим СТС для Таймер1. Это сброс по совпадению. Исходя из частоты кварца, посчитать какое число нужно записать в регистр сравнения, чтобы прерывание происходило, допустим через 10 ms. Затем, по прерыванию через 10 ms индицировать цифры, переключая разряды, а счет времени вести, накапливая секунду в дополнительной переменной на 100.
1. Микруха будет стоять ATiny2313v питание будет подаваться 3в, светодиоды которые 3,2в будут без резюков, а которые 1,8в будут с резюками 150Ом. Так будет нормально?
2,3 Исправил, так? или я что то не понял?
4. Здесь что то ступил! Исправил!
5. По кварцу как раз и есть вопросы, насколько реально сделать на встроенном? Если не реально, то какой кварц брать? Читал по форумам, что подходит 4Mhz? А что за часовой кварц? -маленький такой цилиндрик, может на нем?
6. Думал, что в операторе сравнения можно использовать ++, переделал! понял с ++cur_dig!
7. Исправил!

Спасибо за ответ!!!

Добавлено: Вт фев 23, 2010 11:16:39
ValBag
ssvd писал(а):1. Микруха будет стоять ATiny2313v питание будет подаваться 3в, светодиоды которые 3,2в будут без резюков, а которые 1,8в будут с резюками 150Ом. Так будет нормально?
У светодиодов рабочее напряжение указывается при определенном токе и каким-то допуском на разброс. Для тех, которые на 3,2 В, выходного напряжения порта может и не хватить для зажигания от 3 В, придется искать с допустимым минусовым отклонением. И может, при отсутствии дополнительного резистора, подпалить выходы порта. Балласт всегда нужен, т. к. незначительное изменение напряжения, приводит к большим колебаниям тока при отсутствии ограничения. Вообщем, см. datasheet, или справочник. Там есть вольтамперные характеристики, где все наглядно видно. Для второго на 1,8 в, ток будет I=[3-1.8]/150=8 mA. Это в номинале, без учета разброса, а может быть и другой.
2,3 Исправил, так? или я что то не понял?
Да. Осталось поправить:
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
TCNT0=0x00;
PORTB=0x00;
А знаки инверсии ~ в PORTB - убрать.
...
5. По кварцу как раз и есть вопросы, насколько реально сделать на встроенном? Если не реально, то какой кварц брать? Читал по форумам, что подходит 4Mhz? А что за часовой кварц? -маленький такой цилиндрик, может на нем?
В принципе, если не нужна большая точность, можно использовать внутренний калиброванный генератор tiny2313, выставив фьюзами 4 MHz (ячейками CKSELx). Убрать заводское программное деление частоты тактового генератора на 8, т. е. при программировании в ячейке CKDIV8 выставить "1" - незапрограммированна. В TCCR1B биты CSхх выставить в значения без аппаратного деления для таймеров, т. е. на частоту тактового генератора - коэффициент 1. В регистр сравнения записать 40000 (вернее 39999, из-за особенности возникновения момента прерывания). При режиме СТС получатся прерывания таймера 1 через 10 ms.
Можно и кварцы использовать. Принцип подсчета значения, загружаемого в регистр сравнения, прост: (тактовая частота таймера*небходимый период прерывания)-1=в регистр сравнения.

Добавлено: Вт фев 23, 2010 11:39:04
ssvd
ValBag писал(а):
ssvd писал(а):1. Микруха будет стоять ATiny2313v питание будет подаваться 3в, светодиоды которые 3,2в будут без резюков, а которые 1,8в будут с резюками 150Ом. Так будет нормально?
У светодиодов рабочее напряжение указывается при определенном токе и каким-то допуском на разброс. Для тех, которые на 3,2 В, выходного напряжения порта может и не хватить для зажигания от 3 В, придется искать с допустимым минусовым отклонением. И может, при отсутствии дополнительного резистора, подпалить выходы порта. Балласт всегда нужен, т. к. незначительное изменение напряжения, приводит к большим колебаниям тока при отсутствии ограничения. Вообщем, см. datasheet, или справочник. Там есть вольтамперные характеристики, где все наглядно видно. Для второго на 1,8 в, ток будет I=[3-1.8]/150=8 mA. Это в номинале, без учета разброса, а может быть и другой.
2,3 Исправил, так? или я что то не понял?
Да. Осталось поправить:
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
TCNT0=0x00;
PORTB=0x00;
...
5. По кварцу как раз и есть вопросы, насколько реально сделать на встроенном? Если не реально, то какой кварц брать? Читал по форумам, что подходит 4Mhz? А что за часовой кварц? -маленький такой цилиндрик, может на нем?
В принципе, если не нужна большая точность, можно использовать внутренний калиброванный генератор tiny2313, выставив фьюзами 4 MHz (ячейками CKSELx). Убрать заводское программное деление частоты тактового генератора на 8, т. е. при программировании в ячейке CKDIV8 выставить "1" - незапрограммированна. В TCCR1B биты CSхх выставить в значения без аппаратного деления для таймеров, т. е. на частоту тактового генератора - коэффициент 1. В регистр сравнения записать 40000 (вернее 39999, из-за особенности возникновения момента прерывания). При режиме СТС получатся прерывания таймера 1 через 10 ms.
Можно и кварцы использовать. Принцип подсчета значения, загружаемого в регистр сравнения, прост: (тактовая частота таймера*небходимый период прерывания)-1=в регистр сравнения.
По битам поправил, просто не обратил внимания на эту команду....
Все делать в одном прерывании и выводить индикацию и подсчитывать время? то есть за 100 запусков прерывания получается 1 сек?!
На сколько примерно будет отставать при внутреннем кварце и таком подходе к реализации?

В идеале лучше поставить транзисторы?

Добавлено: Вт фев 23, 2010 14:50:22
ValBag
ssvd писал(а):Все делать в одном прерывании и выводить индикацию и подсчитывать время? то есть за 100 запусков прерывания получается 1 сек?!
Да.
На сколько примерно будет отставать при внутреннем кварце и таком подходе к реализации?
Не знаю. Надо знать стабильность частоты генератора. Затем можно посчитать временную нестабильность часов. Смотрите datasheet, если там есть этот параметр.
В идеале лучше поставить транзисторы?
Максимальный ток одного вывода порта 40 mA. Суммарное ограничение по всем выводам - не более 200 mA. По анодам (PORTB) этого будет достаточно, если светодиод нагружать не более. А вот по катодам (POTRD), транзисторы понадобятся, т. к. на каждый разряд порта, подключенного к катодам, может приходится до 6 светодиодов и соответственно суммарный их ток. Можно поставить в качестве ключей NPN транзисторы, по схеме с общим эмиттером. Тогда надо выводить на базы сигналы такие, какие были в самом начале, т. е. еденичные.

Добавлено: Вт фев 23, 2010 16:39:34
ssvd
ValBag писал(а):
ssvd писал(а):Все делать в одном прерывании и выводить индикацию и подсчитывать время? то есть за 100 запусков прерывания получается 1 сек?!
Да.
На сколько примерно будет отставать при внутреннем кварце и таком подходе к реализации?
Не знаю. Надо знать стабильность частоты генератора. Затем можно посчитать временную нестабильность часов. Смотрите datasheet, если там есть этот параметр.
В идеале лучше поставить транзисторы?
Максимальный ток одного вывода порта 40 mA. Суммарное ограничение по всем выводам - не более 200 mA. По анодам (PORTB) этого будет достаточно, если светодиод нагружать не более. А вот по катодам (POTRD), транзисторы понадобятся, т. к. на каждый разряд порта, подключенного к катодам, может приходится до 6 светодиодов и соответственно суммарный их ток. Можно поставить в качестве ключей NPN транзисторы, по схеме с общим эмиттером. Тогда надо выводить на базы сигналы такие, какие были в самом начале, т. е. еденичные.
может посоветуете транзисторы? желательно маленькие и дешевые...
а если подключить внешний кварц 4mhz, часы будут идти точнее?

Добавлено: Вт фев 23, 2010 17:45:58
ValBag
ssvd писал(а):может посоветуете транзисторы? желательно маленькие и дешевые...
Из отечественных можно КТ503 с любой буквой, ток до 300 мА, а из импортных ВС637. Если уложиться в суммарный ток 100 мА, то соответственно КТ315 или ВС548, 549
а если подключить внешний кварц 4mhz, часы будут идти точнее?
Да, конечно. Дополнительно, в схеме включения, применить термостабильные конденсаторы. Схему с кварцем монтировать вблизи выводов подключения процессора.
Стабильность частоты кварцевого генератора, конечно высокая. Но если она отличается от номинала на какую-то величину, то будет присутствовать долговременная ошибка "ухода" часов. Раньше это решали изменением частоты кварцевого генератора подстроечным конденсатором, при корректировке времени. В принципе, на МК можно это решить программно, и управлять дополнительными кнопками. Все зависит от того - нужны "атомные" часы или попроще. :)

Добавлено: Вт фев 23, 2010 18:20:33
ssvd
ValBag писал(а):
ssvd писал(а):может посоветуете транзисторы? желательно маленькие и дешевые...
Из отечественных можно КТ503 с любой буквой, ток до 300 мА, а из импортных ВС637. Если уложиться в суммарный ток 100 мА, то соответственно КТ315 или ВС548, 549
а если подключить внешний кварц 4mhz, часы будут идти точнее?
Да, конечно. Дополнительно, в схеме включения, применить термостабильные конденсаторы. Схему с кварцем монтировать вблизи выводов подключения процессора.
Стабильность частоты кварцевого генератора, конечно высокая. Но если она отличается от номинала на какую-то величину, то будет присутствовать долговременная ошибка "ухода" часов. Раньше это решали изменением частоты кварцевого генератора подстроечным конденсатором, при корректировке времени. В принципе, на МК можно это решить программно, и управлять дополнительными кнопками корректировки.
А чем отличается кварцевый генератор от кварцевого резонатора?
Термостабильные конденсаторы это какие? Простые керамические на 22пФ пойдут?
Посмотрите пожалуйста схему, так подключил транзисторы? Вообще решил, что будут светодиоlы только на 3,2v 15mA


Вообще, Вы сильно помогаете, спасибо, а то в схемотехнике я слаб, программист я ))))
А разобраться помаленьку охота ))
С меня пиво )))

Добавлено: Вт фев 23, 2010 19:14:28
ValBag
ssvd писал(а):А чем отличается кварцевый генератор от кварцевого резонатора?
Кстати, внутренний генератор не кварцевый а RC, т. е. с конденсаторами и резисторами в качестве времязадающей цепи. Кварцевый резонатор - это кристалл кварца, помещенный в корпус, с выводами. А кварцевый генератор - это схема с применением этого резонатора, усилительного элемента (в данном случае внутри процессора) и обратной связи - внешние конденсаторы.
Термостабильные конденсаторы это какие? Простые керамические на 22пФ пойдут?
В принципе пойдут. Если уж сильно нужно "упереться" в стабильность, то нужно приобрести их с минимальным температурным коэффициентом, который на таких конденсаторах нормируется при изготовлении. В магазине просто спросите, что вам нужны именно термостабильные (если ответят менеджеры, в чем я вообще-то сомневаюсь :)) )
Посмотрите пожалуйста схему, так подключил транзисторы?
Схемы не вижу.
Вообще решил, что будут светодиоlы только на 3,2v 15mA
Три вольта от питания, может не хватить.

Добавлено: Вт фев 23, 2010 19:25:07
ssvd
ValBag писал(а):
ssvd писал(а):А чем отличается кварцевый генератор от кварцевого резонатора?
Кстати, внутренний генератор не кварцевый а RC, т. е. с конденсаторами и резисторами в качестве времязадающей цепи. Кварцевый резонатор - это кристалл кварца, помещенный в корпус, с выводами. А кварцевый генератор - это схема с применением этого резонатора, усилительного элемента (в данном случае внутри процессора) и обратной связи - внешние конденсаторы.
Термостабильные конденсаторы это какие? Простые керамические на 22пФ пойдут?
В принципе пойдут. Если уж сильно нужно "упереться" в стабильность, то нужно приобрести их с минимальным температурным коэффициентом, который на таких конденсаторах нормируется при изготовлении. В магазине просто спросите, что вам нужны именно термостабильные (если ответят менеджеры, в чем я вообще-то сомневаюсь :)) )
Посмотрите пожалуйста схему, так подключил транзисторы?
Схемы не вижу.
Вообще решил, что будут светодиоlы только на 3,2v 15mA
Три вольта от питания, может не хватить.
ну вот кто бы ее еще прикрепил )))
буду думать, может на 5в перейду или поставлю все на 1,8в 10мА