Например TDA7294

Форум РадиоКот • Просмотр темы - Часы на 74HC595
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 13:02:26

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 181 ]  1, , , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Часы на 74HC595
СообщениеДобавлено: Вт окт 30, 2018 06:10:12 
Открыл глаза

Зарегистрирован: Чт июн 07, 2018 08:46:46
Сообщений: 49
Рейтинг сообщения: 0
Доброго времени суток.
Только начинаю изучать микроконтроллеры. Выбрал AVR, только потому, что Atmel studio базируется на visual studio, а его я большой поклонник (привык в ней работать). Программатора у меня нету, делал тему пытался понять какой лучше, да и деталей ( мк, датчиков, дисплеев резисторов) тоже нету. https://www.radiokot.ru/forum/viewtopic ... 7&t=158041
Но есть желание поэтому немного поискав наткнулся на протеус . Очень мне понравилась данная программа (тогда я еще не знал, что в жизни все не так как на экране). Поэтому Atmel studio + proteus 7. (качал с рутрекера крякнутый).
Так как в программировании мк не силен, нашел уроки и по ним стал учится. Попались уроки по датчикам и дисплеям, решил все знания уроков объединить и сделать часы.
МК выбрал ATmega 8A что значит буква А так и не понимаю, но она в клеящемся корпусе и дырок под нее сверлить не продеться. https://www.chipdip.ru/product/atmega8a-au
Создал проект в студии и первым делом, что мне понадобилось это определится с дисплеем, а так же организацией вывода на него информации. В протеусе к сожалению только семи сегментные или LCD дисплеи. LCD как по мне, для часов не очень круто. Поэтому решено было использовать 4 разряда семи сегментных. Для их управления мне нехотелось тратить много ножек МК и я нашел решение по управлению на базе микросхемы МАХ7219. Очень хорошая микросхема, позволяет очень легко управлять сразу 8разрядами индикатора. Мне конечно столько не нужно. Посмотрел на ее цену и ахнул, за эти деньги можно второй мк купить и им управлять индикатором, не выгодно и растратно получается очень. Наткнулся на другое решение с использованием 74HC595. Стоит это удовольствие всего 10руб. https://www.chipdip.ru/product/74hc595d
Но для реализации управления надо 2ш. что в целом всего 20руб. Соответственно одна 74HC595 для выставления уровней на одном индикаторе, а вторая 74HC595 для переключения между индикаторами (динамическая индикация), правда останется лишних 4 ножки, но при низкой цене не жалко. Так же при таком использовании придётся использовать круговую схему передачи информации, что немного снизит скорость работы, но ее все равно должно хватить.
Передача информации происходит по SPI поэтому задействуется всего 3 ножки МК. Но тут встала другая проблема. Я хотел изменять яркость свечения индикаторов. Прочитал и понял что для этого нужен ШИМ. Просто то подавать, то нет высокий уровень для питания индикатора. Как оказалось все не так просто. SPI в Atmega8 занимает выходы почти всех таймеров, остается только одна свободная доступная ножка, это PB1/OC1A. Это значит, что только на 1 таймере я могу реализовать ШИМ. Стал искать как вообще запустить, и так как я ничего почти не понял в скорости этих таймеров( точнее понял, но зачем столько настроек, каких то зависимостей между ними). Реализовал вот так:
Код:
   DDRB |= (1<<PINB1); //ножка fast шим
   PORTB = 0;
   TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<WGM11) | (0<<WGM10);
   TCCR1B = (1<<WGM13) | (1<<WGM12) | (0<<CS11) | (0<<CS12) | (1<<CS10);
   ICR1 = 0xFFFF; // модуль счета - максимум

Не знаю, на сколько, это правильно, но импульсы дает в зависимости от величины OCR1A.
Очень прошу проверить и подсказать правильно ли я его настроил.
Для изменения яркости я подсмотрел хитрое решение на АЦП с использованием фоторезистора. Когда меняется сопротивление на резисторе от освещенности, изменятся величина напряжения на резисторном делителе, которую я снимаю АЦП реализованном на ножке PC0\ADC0.
Для запуска написал следующее :
Код:
   ADCSRA |= (1<<ADEN) // Разрешение использования АЦП
   |(1<<ADSC)//Запуск преобразования
   |(1<<ADFR)//Непрерывный режим работы АЦП
   |(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)//Делитель 128 = 64 кГц
   |(1<<ADIE);//Разрешение прерывания от АЦП
   ADMUX |= (1<<REFS1)|(1<<REFS0); //Внутренний Источник ОН 2,56в, вход ADC0

В прерывании как раз использовал значение OCR1A
Код:
ISR(ADC_vect)
{
   low_adc = ADCL;
   high_adc = ADCH;//Верхняя часть регистра ADC должна быть считана последней, иначе не продолжится преобразование
   adc_value= (high_adc<<8)|low_adc;    
   OCR1A = 0xFFFF - (adc_value*64);
}

Число 64 просто экспериментальное, я его взял исходя из того что OCR1A максимум 0xFFFF, а adc_value максимум 1024, значит 0xFFFF/1024 = 64. На деле конечно придется подобрать минимальное значение при котором индикатор будет светится и ограничить его.
Осталось всего два таймера. Если честно мне таймеры очень понравились, и я старался использовать их по максимум. Почитав я понял, что нулевой таймер очень слабенький и не быстрый, поэтому для индикации, т.е. подачу сигнала на индикацию использовал таймер 2.
Включил его вот так, если кто может, подскажите как правильно, про регистры вроде прочитал, но хз чет сомневаюсь:
Код:
   TIMSK |= (1<<TOIE2); // Разрешаем прерывание по переполнению
   TCCR2 |= (1<<CS22)|(1<<CS20); // Предделитель на 128

В прерывании ISR (TIMER2_OVF_vect) код получился сложный, не в один заход написанный, все зависит от режима, от того что показываю и т.д.
Ну а последний нулевой таймер решил использовать для обработки нажатия кнопки. В принципе кнопок можно сделать больше чем одну, свободные ножки позволяют, но для корпуса проще одну кнопку выводить и с ее помощью вроде все должно получиться.
Запустил таймер и ножку настроил
Код:
   DDRB&=~(1<<DDRB0); //Настраиваем ножку PB0 в режим входа
   PORTB|=(1<<PORTB0); //Устанавливаем pull-up режим ножки PB0

   TCCR0 |= (1<<CS02)|(1<<CS00);    
   TIMSK |= (1<<TOIE0);

Опять просьбы проверить и подсказать все ли так. Кнопка подключена к PB0.
В обработчике TIMER0_OVF_vect прерывания, считаю, сколько циклов нажата кнопка если больше 3 и меньше 60 то короткое нажатие, если больше 60 длинное. Длинные нажатия меняют режимы редактирования: часы, минуты, день, месяц, год, день недели, вкл будильника, часы будильник, минуты будильник. Короткие нажатия увеличивают значения этих величин. В случае с вкл будильника, вкл или выкл.
Так же применил микросхему DS18B20 датчик температуры. Очень как мне показалось дорогое удовольствие. Стоит больше 100руб. дороже мк. Работает по шине 1-Wire. На этой шине может быть много этих датчиков ( 125 по-моему), но чтобы не искать их на шине и не писать код я использовал 1 и пропустил его идентификацию.
Сам ход часов реализован на DS1307ZN. Думаю статей про нее предостаточно поэтому особенно распыляться не буду, проблем с ней не возникло.

Очень прошу опытных проверить код и подсказать, как его можно улучшить.
Начал подбирать компоненты, возникла проблема с индикатором. Не могу найти индикатор с точками и двоеточием одновременно. Чтобы показывать время нужно двоеточие, для даты точка под двоеточием, и для температуры у меня нужна точка в предпоследнем знаке. Везде либо двоеточие для времени, либо точки под знаками, а надо и то и то. Подскажите какой можно найти в Москве.
Какие лучше транзисторы использовать для управления индикаторами? Мне желательно маленькие клеящиеся, чтобы не сверлить дырок.

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


Вложения:
clock 74HC595.7z [77.17 KiB]
Скачиваний: 402
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вт окт 30, 2018 08:36:17 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
MrJunior писал(а):
Я понимаю что часы со временем будут либо убегать либо отставать, и это будет зависеть от окружающей среды кварца. Чем теплее скорее всего тем часы сильнее будут убегать вперед ( это я предполагаю) , чем холоднее наоборот. Поэтому хотелось бы связаться с интернетом, но...
если б я не был таким ленивым, я бы задействовал для подстройки часов FM-радио, а именно RDS.
чип приемника FM c поддержкой RDS стоит вообще смешные копейки, FM радиостанций сейчас в любом городе больше, чем блох на Тузике... в RDS есть сообщения с датой и временем. точность, конечно, будет не как у атомных часов в Цюрихе, но для бытовых применений более, чем достаточная - никогда не будет отклонения больше, чем 1 минута.
и, опять же, можно радио-будильник сделать :)))

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вт окт 30, 2018 10:36:17 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 157
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3328
Рейтинг сообщения: -5
MrJunior писал(а):
Выбрал AVR, только потому, что Atmel studio базируется на visual studio
Про VisualGDB не слышали? https://visualgdb.com/?features=embedded
Поддерживает более современные и мощные МК чем AVR, а некоторые из них дешевле чем AVR при большей производительности и лучшей периферии.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вт окт 30, 2018 11:35:07 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 41
Рейтинг сообщений: 1209
Зарегистрирован: Ср фев 23, 2011 12:12:31
Сообщений: 2352
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Клеящихся транзисторов, как и микросхем не бывает. Откуда вы это взяли?
Поверхностный монтаж это называется.
Но они не клеятся, а припаиваются.

По индикаторам, используйте точки. Мигающая для времени, а постоянно светящаяся для даты.
Либо берите отдельные цифры и ставьте между ними маленькие круглые светодиоды. 2 для двоеточия и 1 для точки.

Транзисторы можно купить полевые. Но смотря что коммутировать. "Минусы" коммутировать IRLML2502 для "плюсов" IRLML6402. Для 2502 затвор подтягивается к минусу через резистор 10к, на затвор ставится резистор 100Ом и идёт на микросхему(для открытия транзистора подаём плюс). Для 6402 затвор подтягивается к плюсу через резистор 10к, на затвор ставится резистор 100Ом и идёт на микросхему(для открытия транзистора подаём минус).

Интернет для часов? Приехали... РДС и ЖПС отттуда же... К доктору обращайтесь, это если не лечится, то достичь ремиссии думаю удастся. И вы снова будете воспринимать часы как часы.
Для повышения точности возьмите не ds1307, а ds3231. Будет точнее.
Впрочем температура в помещении меняется не очень сильно и можно просто ввести автоматическую коррекцию.

_________________
Глупый не задает вопросы. Глупый и так все знает.


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вт окт 30, 2018 12:14:59 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
AndTer писал(а):
Приехали... РДС и ЖПС отттуда же...
ну а аргументы будут посерьезнее, чем сказано?
GPS - вообще хорошая штука, но габаритная, требует антенны специальной, да и стоит относительно дорого.
RDS - стоит копейки, антенны практически не требует (не считать же проводок за это?!), габарит мелкий, функцию обеспечивает, да и вторую функцию позволяет реализовать (я о радиобудильнике).

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вт окт 30, 2018 13:16:15 
Открыл глаза

Зарегистрирован: Чт июн 07, 2018 08:46:46
Сообщений: 49
Рейтинг сообщения: 0
РДС для часов интересная штука. Посмотрел я RDA5807M. Нашел библиотеку под нее https://github.com/csdexter/RDA5807M/tr ... 7M_Example
К сожалению, библиотека под андруино (почему то у меня к коду андруино какой то негатив, не понимаю, откуда он).
Решил переписать (так сказать подправить). Общаемся мы с RDA5807M по I2C (TWI) поэтом стандартные функции должны подойти.
Код:
void I2C_Init(void)
{
   TWBR=0x20; //скорость передачи (при 8 мГц получается 100 кГц)  надо настроить ?
}

void I2C_Start(void)
{
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
   while(!(TWCR&(1<<TWINT)));//подождем пока установится TWIN
}

void I2C_Stop(void)
{
   TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}

int I2C_WriteByte(unsigned char c)
{
   TWDR=c;//запишем байт в регистр данных
   TWCR = (1<<TWINT)|(1<<TWEN);//включим передачу данных
   while(!(TWCR&(1<<TWINT)));//подождем пока установится TWIN
   //if ((TWSR & 0xF8) != I2C_MT_DATA_ASK) return 1; else
   return 0;
}

unsigned char I2C_ReadByte(void)
{
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);//включим прием данных
   while(!(TWCR & (1<<TWINT)));//подождем пока установится TWIN
   //if ((TWSR & 0xF8) != I2C_MR_DATA_ASK) return 1; else
   return TWDR;
}

unsigned char I2C_ReadLastByte(void)
{
   TWCR = (1<<TWINT)|(1<<TWEN);//включим прием данных
   while(!(TWCR&(1<<TWINT)));//подождем пока установится TWIN
   //if ((TWSR & 0xF8) != I2C_MR_DATA_NASK) return 1; else
   return TWDR;
}


Основные функции необходимо подправить:
Код:
void setRegister(byte reg, const word value) {
   I2C_Start();
   I2C_WriteByte(RDA5807M_I2C_ADDR_RANDOM);   //Wire.beginTransmission(RDA5807M_I2C_ADDR_RANDOM);
   I2C_WriteByte(reg);                     //Wire.write(reg);
   I2C_WriteByte(value >> 8);               //Wire.write(highByte(value));
   I2C_WriteByte(value & 0xFF);            //Wire.write(lowByte(value));
   I2C_Stop();                           //Wire.endTransmission(true);
}

Тут вроде ничего сложного, обращаемся пишем RDA5807M_I2C_ADDR_RANDOM по адресу reg и значение бьем на старший и младший байт.
А вот с функцией чтения у меня вопросы:
Код:
word getRegister(byte reg) {
   word result;
   I2C_Start();
   I2C_WriteByte(RDA5807M_I2C_ADDR_RANDOM); //Wire.beginTransmission(RDA5807M_I2C_ADDR_RANDOM);
   I2C_WriteByte(reg);       ///Wire.write(reg);
   //Wire.endTransmission(false);
   //Wire.requestFrom(RDA5807M_I2C_ADDR_RANDOM, 2, true);
   //Don't let gcc play games on us, enforce order of execution.
   result = (word)I2C_ReadByte() << 8;//result = (word)Wire.read() << 8;
   result |= I2C_ReadLastByte();//result |= Wire.read();
   I2C_Stop();
   return result;
}

Очень сомневаюсь Wire.requestFrom где можно задать число возвращаемых параметров, каких то 2. Не понимаю, как можно это регулировать, но изменил на такое.
Немного изменил и h файл, добавив в него неизвестные типы
Код:
typedef unsigned int word;
typedef unsigned char byte;


Затея конечно хорошая, но я хз как ее тестировать и проверять работоспособность. Вот вроде все написал, а работает или нет, не знаю.
RDA5807M.h
Спойлер
Код:


#include "main.h"


#ifndef RDA5807M_H_
#define RDA5807M_H_

//Define RDA5807M I2C Addresses
#define RDA5807M_I2C_ADDR_SEQRDA (0x20 >> 1)
#define RDA5807M_I2C_ADDR_RANDOM (0x22 >> 1)
#define RDA5807M_I2C_ADDR_SEQTEA (0xC0 >> 1)

typedef unsigned int word;
typedef unsigned char byte;

//Register file origins for sequential mode
#define RDA5807M_FIRST_REGISTER_WRITE 0x02
#define RDA5807M_FIRST_REGISTER_READ 0x0A
#define RDA5807M_LAST_REGISTER 0x3A

//Register addresses
#define RDA5807M_REG_CHIPID 0x00
#define RDA5807M_REG_CONFIG 0x02
#define RDA5807M_REG_TUNING 0x03
#define RDA5807M_REG_GPIO 0x04
#define RDA5807M_REG_VOLUME 0x05
#define RDA5807M_REG_I2S 0x06
#define RDA5807M_REG_BLEND 0x07
#define RDA5807M_REG_FREQ 0x08
#define RDA5807M_REG_STATUS 0x0A
#define RDA5807M_REG_RSSI 0x0B
#define RDA5807M_REG_RDSA 0x0C
#define RDA5807M_REG_RDSB 0x0D
#define RDA5807M_REG_RDSC 0x0E
#define RDA5807M_REG_RDSD 0x0F
#define RDA5800_REG_LNA 0x10
#define RDA5807M_REG_SEEK 0x20

//Status bits (from the chip)
#define RDA5807M_STATUS_RDSR 0x8000
#define RDA5807M_STATUS_STC 0x4000
#define RDA5807M_STATUS_SF 0x2000
#define RDA5807M_STATUS_RDSS 0x1000
#define RDA5807M_STATUS_BLKE 0x0800
#define RDA5807M_STATUS_ST 0x0400
#define RDA5800_STATUS_ST 0x0100

//Flag bits (to the chip)
#define RDA5807M_FLG_DHIZ 0x8000
#define RDA5807M_FLG_DMUTE 0x4000
#define RDA5807M_FLG_MONO 0x2000
#define RDA5807M_FLG_BASS 0x1000
#define RDA5807M_FLG_RCLKNOCAL 0x0800
#define RDA5807M_FLG_RCLKDIRECT 0x0400
#define RDA5807M_FLG_SEEKUP 0x0200
#define RDA5807M_FLG_SEEK 0x0100
#define RDA5807M_FLG_SKMODE 0x0080
#define RDA5807M_FLG_RDS 0x0008
#define RDA5807M_FLG_NEW 0x0004
#define RDA5807M_FLG_RESET 0x0002
#define RDA5807M_FLG_ENABLE 0x0001
#define RDA5807M_FLG_DIRECT 0x0020
#define RDA5807M_FLG_TUNE 0x0010
#define RDA5807M_FLG_DE 0x0800
#define RDA5807M_FLG_SOFTMUTE 0x0200
#define RDA5807M_FLG_AFCD 0x0100
#define RDA5807P_FLG_INTMODE 0x8000
#define RDA5807M_FLG_EASTBAND65M 0x0200
#define RDA5807M_FLG_SOFTBLEND 0x0002
#define RDA5807M_FLG_FREQMODE 0x0001
#define RDA5807M_FLG_FMTRUE 0x0100
#define RDA5807M_FLG_FMREADY 0x0080
#define RDA5807M_FLG_BLOCKE 0x0010
#define RDA5807P_FLG_STCIEN 0x4000
#define RDA5807P_FLG_I2S 0x0040
#define RDA5807P_FLG_I2SSLAVE 0x1000
#define RDA5807P_FLG_SWLR 0x0800
#define RDA5807P_FLG_SCLKINVERT_I 0x0400
#define RDA5807P_FLG_SIGNED 0x0200
#define RDA5807P_FLG_WSINVERT_I 0x0100
#define RDA5807P_FLG_WSINVERT_O 0x0008
#define RDA5807P_FLG_SCLKINVERT_O 0x0004
#define RDA5807P_FLG_DELAY_L 0x0002
#define RDA5807P_FLG_DELAY_R 0x0001
#define RDA5800_FLG_SPACE_200K 0x0001
#define RDA5800_FLG_SPACE_50K 0x0004
#define RDA5800_FLG_BAND_JAPAN 0x0002

//Masks and constants for configuration parameters
//NOTE: the entire family, including the RDA5800, all report the same ChipID.
#define RDA5807M_CHIPID 0x58
#define RDA5807M_CLKMODE_MASK 0x0070
#define RDA5807M_CLKMODE_32K (0x0 << 4)
#define RDA5807M_CLKMODE_12M (0x1 << 4)
#define RDA5807M_CLKMODE_13M (0x2 << 4)
#define RDA5807M_CLKMODE_19M (0x3 << 4)
#define RDA5807M_CLKMODE_24M (0x5 << 4)
#define RDA5807M_CLKMODE_26M (0x6 << 4)
#define RDA5807M_CLKMODE_38M (0x7 << 4)
#define RDA5807M_CHAN_MASK 0xFFC0
#define RDA5807M_CHAN_SHIFT 6
#define RDA5807M_BAND_MASK 0x000C
#define RDA5807M_BAND_SHIFT 2
#define RDA5807M_BAND_WEST (0x0 << 2)
#define RDA5807M_BAND_JAPAN (0x1 << 2)
#define RDA5807M_BAND_WORLD (0x2 << 2)
#define RDA5807M_BAND_EAST (0x3 << 2)
#define RDA5807M_SPACE_MASK 0x0003
#define RDA5807M_SPACE_100K 0x0
#define RDA5807M_SPACE_200K 0x1
#define RDA5807M_SPACE_50K 0x2
#define RDA5807M_SPACE_25K 0x3
#define RDA5807M_SEEKTH_MASK 0x7F00
#define RDA5807M_SEEKTH_SHIFT 8
#define RDA5807M_VOLUME_MASK 0x000F
#define RDA5807M_VOLUME_SHIFT 0
#define RDA5807M_OPENMODE_MASK 0x6000
#define RDA5807M_OPENMODE_WRITE (0x3 << 13)
#define RDA5807M_SOFTBLENDTH_MASK 0x7C00
#define RDA5807M_SOFTBLENDTH_SHIFT 10
#define RDA5807M_SEEKTHOLD_MASK 0x00FC
#define RDA5807M_SEEKTHOLD_SHIFT 2
#define RDA5807M_SEEKMODE_MASK 0x7000
#define RDA5807M_SEEKMODE_OLD (0x1 << 12)
#define RDA5807M_READCHAN_MASK 0x03FF
#define RDA5807M_RSSI_MASK 0xFE00
#define RDA5807M_RSSI_SHIFT 9
#define RDA5807M_BLERA_MASK 0x000C
#define RDA5807M_BLERA_0 (0x0 << 2)
#define RDA5807M_BLERA_12 (0x1 << 2)
#define RDA5807M_BLERA_35 (0x2 << 2)
#define RDA5807M_BLERA_U (RDA5807M_BLERA_12 | RDA5807M_BLERA_35)
#define RDA5807M_BLERB_MASK 0x0003
#define RDA5807M_BLERB_0 0x0
#define RDA5807M_BLERB_12 0x1
#define RDA5807M_BLERB_35 0x2
#define RDA5807M_BLERB_U (RDA5807M_BLERB_12 | RDA5807M_BLERB_35)
#define RDA5807P_GPIO3_MASK 0x0030
#define RDA5807P_GPIO3_HIZ (0x0 << 4)
#define RDA5807P_GPIO3_ST (0x1 << 4)
#define RDA5807P_GPIO3_L (0x2 << 4)
#define RDA5807P_GPIO3_H (0x3 << 4)
#define RDA5807P_GPIO2_MASK 0x000C
#define RDA5807P_GPIO2_HIZ (0x0 << 2)
#define RDA5807P_GPIO2_INT (0x1 << 2)
#define RDA5807P_GPIO2_L (0x2 << 2)
#define RDA5807P_GPIO2_H (0x3 << 2)
#define RDA5807P_GPIO1_MASK 0x0003
#define RDA5807P_GPIO1_HIZ 0x0
#define RDA5807P_GPIO1_L 0x2
#define RDA5807P_GPIO1_H 0x3
#define RDA5807P_LNAP_MASK 0x00C0
#define RDA5807P_LNAP_NONE (0x0 << 6)
#define RDA5807P_LNAP_N (0x1 << 6)
#define RDA5807P_LNAP_P (0x2 << 6)
#define RDA5807P_LNAP_BOTH (0x3 << 6)
#define RDA5807P_LNAI_MASK 0x0030
#define RDA5807P_LNAI_1_8M (0x0 << 4)
#define RDA5807P_LNAI_2_1M (0x1 << 4)
#define RDA5807P_LNAI_2_5M (0x2 << 4)
#define RDA5807P_LNAI_3_0M (0x3 << 4)
#define RDA5807P_I2SRATE_MASK 0x00F0
#define RDA5807P_I2SRATE_8K (0x0 << 4)
#define RDA5807P_I2SRATE_11_025K (0x1 << 4)
#define RDA5807P_I2SRATE_12K (0x2 << 4)
#define RDA5807P_I2SRATE_16K (0x3 << 4)
#define RDA5807P_I2SRATE_22_05K (0x4 << 4)
#define RDA5807P_I2SRATE_24K (0x5 << 4)
#define RDA5807P_I2SRATE_32K (0x6 << 4)
#define RDA5807P_I2SRATE_44_1K (0x7 << 4)
#define RDA5807P_I2SRATE_48K (0x8 << 4)
#define RDA5800_VOLUMEDSP_MASK 0x00F0
#define RDA5800_VOLUMEDSP_SHIFT 4
#define RDA5800_LNAP_MASK 0x6000
#define RDA5800_LNAP_N (0x1 << 13)
#define RDA5800_LNAP_P (0x2 << 13)
#define RDA5800_LNAP_BOTH (0x3 << 13)

//DO NOT USE (begin) ----------
//
//One day, avr-gcc will take its role seriously and allow a way to enforce
//struct packing order, because it's a very common idiom in the embedded world
//and because the standard allows the implementation to define it.
//Until then, the beautiful structs below are nothing but an exercise in C
//calligraphy.
typedef struct __attribute__ ((__packed__)) {
    uint8_t disableHiZ:1;
    uint8_t disableMute:1;
    uint8_t mono:1;
    uint8_t bass:1;
    uint8_t rClkNotAlways:1;
    uint8_t rClkInput:1;
    uint8_t seekUp:1;
    uint8_t seek:1;
    uint8_t seekMode:1;
    uint8_t clkMode:3;
    uint8_t rds:1;
    uint8_t newDemodulation:1;
    uint8_t softReset:1;
    uint8_t enable:1;
    union {
        uint16_t channel:10;
        struct {
            uint8_t channel5800;
            uint8_t reserved5800_1:2;
        };
    };
    uint8_t direct:1;
    uint8_t tune:1;
    union {
        struct {
            uint8_t band:2;
            uint8_t space:2;
        };
        struct {
            uint8_t reserved5800_2:1;
            uint8_t space50kHz:1;
            uint8_t band5800:1;
            uint8_t space5800:1;
        };
    };
    uint8_t reserved1:1;
    uint8_t stcInterruptEnable:1;
    uint8_t reserved2:2;
    uint8_t deEmphasis:1;
    uint8_t reserved3:1;
    uint8_t softMute:1;
    uint8_t afcDisable:1;
    uint8_t reserved4:1;
    uint8_t i2s:1;
    uint8_t gpio3:2;
    uint8_t gpio2:2;
    uint8_t gpio1:2;
    uint8_t interruptMode:1;
    uint8_t seekThreshold:7;
    union {
      struct {
          uint8_t lnaPort:2;
          uint8_t lnaCurrent:2;
      };
      uint8_t volumeDSP:4;
    };
    uint8_t volume:4;
    uint8_t reserved5:1;
    uint8_t openMode:2;
    uint8_t i2sMode:1;
    uint8_t wsIsRight:1;
    uint8_t invertSclkInput:1;
    uint8_t signedData:1;
    uint8_t invertWsInput:1;
    uint8_t i2sSampleRate:4;
    uint8_t invertWsOutput:1;
    uint8_t invertSclkOutput:1;
    uint8_t delayLeft:1;
    uint8_t delayRight:1;
    uint8_t reserved6:1;
    uint8_t softBlendThreshold:5;
    uint8_t bandLimit65M:1;
    uint8_t reserved7:1;
    uint8_t seekThresholdOld:6;
    uint8_t softBlend:1;
    uint8_t frequencyMode:1;
    uint16_t frequencyDirect;
} TRDA5807MRegisterFileWrite;

typedef struct __attribute__ ((__packed__)) {
    uint8_t rdsReady:1;
    uint8_t seekTuneComplete:1;
    uint8_t seekFail:1;
    uint8_t rdsSynchronized:1;
    uint8_t blockEFound:1;
    uint8_t stereo:1;
    union {
        uint16_t readChannel:10;
        struct {
            uint8_t reserved5800_3:1;
            uint8_t stereo5800:1;
            uint8_t readChannel5800;
        };
    };
    uint8_t rssi:7;
    uint8_t isStation:1;
    uint8_t ready:1;
    uint8_t reserved:2;
    uint8_t blockE:1;
    uint8_t blerA:2;
    uint8_t blerB:2;
    uint16_t rdsA;
    uint16_t rdsB;
    uint16_t rdsC;
    uint16_t rdsD;
} TRDA5807MRegisterFileRead;
//DO NOT USE (end)----------

extern const word RDA5807M_BandLowerLimits[];
extern const word RDA5807M_BandHigherLimits[];
extern const byte RDA5807M_ChannelSpacings[];


        /*
        * Description:
        *   This is the constructor, it initializes internal data structures.
        */
 

        /*
        * Description:
        *   This is the destructor, it delegates to end().
        */
        //~RDA5807M() { end(); };

        /*
        * Description:
        *   Mutes and disables the chip.
        */
        void end(void);

        /*
        * Description:
        *   Initializes the RDA5807M, starts the radio and configures band
        *   limits.
        * Parameters:
        *   band - The desired band limits, one of the RDA5807M_BAND_*
        *          constants.
        */
        void begin(byte band);

        /*
        * Description:
        *   Getter and setter for single random access to registers.
        * Parameters:
        *   reg   - register to get or set, one of the RDA5807M_REG_* constants.
        *   value - value to set the given register to.
        * Returns:
        *   current value of given register.
        */
        void setRegister(byte reg, word value);
        word getRegister(byte reg);

        /*
        * Description:
        *   Read-before-write setter for single random access to registers.
        * Parameters:
        *   reg   - register to update, one of the RDA5807M_REG_* constants.
        *   mask  - mask of the bits that are to be updated.
        *   value - value to set the given register and bits to.
        */
        void updateRegister(byte reg, word mask, word value) ;

        /*
        * Description:
        *   Getter and setter for bulk sequential access to registers. Gets
        *   always start at RDA5807M_FIRST_REGISTER_READ while sets always
        *   start at RDA5807M_FIRST_REGISTER_WRITE. The RDA5807M register file
        *   has exactly RDA5807M_LAST_REGISTER word-sized entries.
        * Parameters:
        *   count - how many sequential registers to get/set.
        *   regs  - will be filled with the values of the got registers or will
        *           be the source of the values for the set registers.
        */
        void setRegisterBulk(byte count, const word regs[]);
        void getRegisterBulk(byte count, word regs[]);

//DO NOT USE (begin) ----------
        /*
        * Description:
        *   Overloaded versions of the above, for use with the memory mapped
        *   register file structs. This is needed because Arduino and RDS5807M
        *   differ in endianness and so to maintain the correspondence between
        *   struct fields and the actual values transferred, you need to process
        *   the memory mapped struct byte-wise.
        */
        void setRegisterBulk_memory(const TRDA5807MRegisterFileWrite *regs);
        void getRegisterBulk_memory(TRDA5807MRegisterFileRead *regs);
//DO NOT USE (end) ----------

        /*
        * Description:
        *   Increase the volume by 1. If the maximum volume has been
        *   reached, no further increase will take place and returns false;
        *   otherwise true.
        */
        char volumeUp(void);

        /*
        * Description:
        *   Decrease the volume by 1. If the minimum volume has been
        *   reached, no further decrease will take place and returns false;
        *   otherwise true.
        * Parameters:
        *   alsoMute - mute the output when reaching minimum volume, in
        *              addition to returning false
        */
        char volumeDown(char alsoMute); //false

        /*
        * Description:
        *   Commands the radio to seek up to the next valid channel.
        * Parameters:
        *   wrap - set to true to allow the seek to wrap around the current
        *          band.
        */
        void seekUp(char wrap); // true

        /*
        * Description:
        *   Commands the radio to seek down to the next valid channel.
        * Parameters:
        *   wrap - set to true to allow the seek to wrap around the current
        *          band.
        */
        void seekDown(char wrap); // true

        /*
        * Description:
        *   Mutes the audio output.
        */
        void mute(void);

        /*
        * Description:
        *   Unmutes the audio output.
        * Parameters:
        *   minVolume - set the volume to minimum value before unmuting if true,
        *               otherwise leave it untouched causing the chip to blast
        *               audio out at whatever the previous volume level was.
        */
        void unMute(char minVolume); // false

        /*
        * Description:
        *   Gets the frequency the chip is currently tuned to.
        * Returns:
        *   frequency in 10kHz units.
        */
        word getFrequency(void);

        /*
        * Description:
        *   Tells the chip to tune to the given frequency if within the
        *   currently configured band limits and returns true, otherwise false.
        * Parameters:
        *   frequency - the frequency to tune to, in 10kHz units.
        */
        char setFrequency(word frequency);


        /*
        * Description:
        *   Retrieves the Received Signal Strength Indication measurement for
        *   the currently tuned station.
        */
        byte getRSSI(void);


        /*
        * Description:
        *   Returns the currently configured FM band and channel spacing.
        */
        word getBandAndSpacing(void);



#endif /* RDA5807M_H_ */

RDA5807M.c
Спойлер
Код:
#include "RDA5807M.h"


void I2C_Init(void)
{
   TWBR=0x20; //скорость передачи (при 8 мГц получается 100 кГц)  надо настроить ?
}

void I2C_Start(void)
{
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
   while(!(TWCR&(1<<TWINT)));//подождем пока установится TWIN
}

void I2C_Stop(void)
{
   TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}

int I2C_WriteByte(unsigned char c)
{
   TWDR=c;//запишем байт в регистр данных
   TWCR = (1<<TWINT)|(1<<TWEN);//включим передачу данных
   while(!(TWCR&(1<<TWINT)));//подождем пока установится TWIN
   //if ((TWSR & 0xF8) != I2C_MT_DATA_ASK) return 1; else
   return 0;
}

unsigned char I2C_ReadByte(void)
{
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);//включим прием данных
   while(!(TWCR & (1<<TWINT)));//подождем пока установится TWIN
   //if ((TWSR & 0xF8) != I2C_MR_DATA_ASK) return 1; else
   return TWDR;
}

unsigned char I2C_ReadLastByte(void)
{
   TWCR = (1<<TWINT)|(1<<TWEN);//включим прием данных
   while(!(TWCR&(1<<TWINT)));//подождем пока установится TWIN
   //if ((TWSR & 0xF8) != I2C_MR_DATA_NASK) return 1; else
   return TWDR;
}


void begin(byte band) {
   I2C_Init (); //Wire.begin();
   setRegister(RDA5807M_REG_CONFIG, RDA5807M_FLG_DHIZ | RDA5807M_FLG_DMUTE |
   RDA5807M_FLG_BASS | RDA5807M_FLG_SEEKUP | RDA5807M_FLG_RDS |
   RDA5807M_FLG_NEW | RDA5807M_FLG_ENABLE);
   updateRegister(RDA5807M_REG_TUNING, RDA5807M_BAND_MASK, band);
}

void end(void) {
   setRegister(RDA5807M_REG_CONFIG, 0x00);
}

void setRegister(byte reg, const word value) {
   I2C_Start();
   I2C_WriteByte(RDA5807M_I2C_ADDR_RANDOM);   //Wire.beginTransmission(RDA5807M_I2C_ADDR_RANDOM);
   I2C_WriteByte(reg);                     //Wire.write(reg);
   I2C_WriteByte(value >> 8);               //Wire.write(highByte(value));
   I2C_WriteByte(value & 0xFF);            //Wire.write(lowByte(value));
   I2C_Stop();                           //Wire.endTransmission(true);
}

word getRegister(byte reg) {
   word result;
   I2C_Start();
   I2C_WriteByte(RDA5807M_I2C_ADDR_RANDOM); //Wire.beginTransmission(RDA5807M_I2C_ADDR_RANDOM);
   I2C_WriteByte(reg);       ///Wire.write(reg);
   //Wire.endTransmission(false);
   //Wire.requestFrom(RDA5807M_I2C_ADDR_RANDOM, 2, true);
   //Don't let gcc play games on us, enforce order of execution.
   result = (word)I2C_ReadByte() << 8;//result = (word)Wire.read() << 8;
   result |= I2C_ReadLastByte();//result |= Wire.read();
   I2C_Stop();
   return result;
}

void setRegisterBulk(byte count, const word regs[]) {

   I2C_Start();
   I2C_WriteByte(RDA5807M_I2C_ADDR_SEQRDA); //Wire.beginTransmission(RDA5807M_I2C_ADDR_SEQRDA);
   for(byte i=0; i < count; i++) {
      I2C_WriteByte(regs[i] >> 8); //Wire.write(highByte(regs[i]));
      I2C_WriteByte(regs[i] & 0xFF);//Wire.write(lowByte(regs[i]));
   }   
   I2C_Stop();   
}

void getRegisterBulk(byte count, word regs[]) {
   I2C_Start();
   I2C_WriteByte(RDA5807M_I2C_ADDR_SEQRDA); //Wire.requestFrom(RDA5807M_I2C_ADDR_SEQRDA, count * 2, true);
   for(byte i=0; i < count; i++) {
      //Don't let gcc play games on us, enforce order of execution.
      regs[count] = (word)I2C_ReadByte() << 8;//regs[count] = (word)Wire.read() << 8;
      regs[count] |= I2C_ReadByte();//regs[count] |= Wire.read();
   }
   I2C_Stop();
}

void setRegisterBulk_memory(const TRDA5807MRegisterFileWrite *regs) {
   const uint8_t * const ptr = (uint8_t *)regs;
   I2C_Start();
   I2C_WriteByte(RDA5807M_I2C_ADDR_SEQRDA); //Wire.beginTransmission(RDA5807M_I2C_ADDR_SEQRDA);

   for(byte i=0; i < sizeof(TRDA5807MRegisterFileWrite); i++)
   I2C_WriteByte(ptr[i]);//Wire.write(ptr[i]);
   I2C_Stop(); //Wire.endTransmission(true);
}

void getRegisterBulk_memory(TRDA5807MRegisterFileRead *regs) {
   uint8_t * const ptr = (uint8_t *)regs;
   I2C_Start();
   I2C_WriteByte(RDA5807M_I2C_ADDR_SEQRDA);  //Wire.requestFrom(RDA5807M_I2C_ADDR_SEQRDA, sizeof(TRDA5807MRegisterFileRead), true);

   for(byte i=0; i < sizeof(TRDA5807MRegisterFileRead); i++)
   ptr[i] = I2C_ReadByte(); //ptr[i] = Wire.read();
   I2C_Stop();
}

char volumeUp(void) {
   const byte volume = getRegister(RDA5807M_REG_VOLUME) & RDA5807M_VOLUME_MASK;

   if (volume == RDA5807M_VOLUME_MASK)
   return 0;
   else {
      updateRegister(RDA5807M_REG_VOLUME, RDA5807M_VOLUME_MASK, volume + 1);
      return 1;
   }
}

char volumeDown(char alsoMute) {
   const byte volume = getRegister(RDA5807M_REG_VOLUME) & RDA5807M_VOLUME_MASK;

   if (volume) {
      updateRegister(RDA5807M_REG_VOLUME, RDA5807M_VOLUME_MASK, volume - 1);
      if(!(volume - 1) && alsoMute == 1)
      //If we are to trust the datasheet, this is superfluous as a volume
      //of zero triggers mute & HiZ on its own.
      mute();
      return 1;
   } else
   return 0;
}

void seekUp(char wrap) {
   updateRegister(RDA5807M_REG_CONFIG,
   (RDA5807M_FLG_SEEKUP | RDA5807M_FLG_SEEK |
   RDA5807M_FLG_SKMODE),
   (RDA5807M_FLG_SEEKUP | RDA5807M_FLG_SEEK |
   (wrap ? 0x00 : RDA5807M_FLG_SKMODE)));
}

void seekDown(char wrap) {
   updateRegister(RDA5807M_REG_CONFIG,
   (RDA5807M_FLG_SEEKUP | RDA5807M_FLG_SEEK |
   RDA5807M_FLG_SKMODE),
   (0x00 | RDA5807M_FLG_SEEK |
   (wrap ? 0x00 : RDA5807M_FLG_SKMODE)));
}

void mute(void) {
   updateRegister(RDA5807M_REG_CONFIG, RDA5807M_FLG_DMUTE, 0x00);
}

void unMute(char minVolume) {
   if (minVolume == 1)
   updateRegister(RDA5807M_REG_VOLUME, RDA5807M_VOLUME_MASK, 0x1);
   updateRegister(RDA5807M_REG_CONFIG, RDA5807M_FLG_DMUTE, RDA5807M_FLG_DMUTE);
}

const word RDA5807M_BandLowerLimits[5]  = { 8700, 7600, 7600, 6500, 5000 };
const word RDA5807M_BandHigherLimits[5]  = { 10800, 9100, 10800, 7600, 6500 };
const byte RDA5807M_ChannelSpacings[4]  = { 100, 200, 50, 25 };

word getBandAndSpacing(void) {
   byte band = getRegister(RDA5807M_REG_TUNING) & (RDA5807M_BAND_MASK |
   RDA5807M_SPACE_MASK);
   //Separate channel spacing
   const byte space = band & RDA5807M_SPACE_MASK;

   if ( ((band & RDA5807M_BAND_MASK) == RDA5807M_BAND_EAST) && !(getRegister(RDA5807M_REG_BLEND) & RDA5807M_FLG_EASTBAND65M))
   //Lower band limit is 50MHz
   band = (band >> RDA5807M_BAND_SHIFT) + 1;
   else
   band >>= RDA5807M_BAND_SHIFT;

   return ((space<<8)|band);
}

word getFrequency(void) {
   const word spaceandband = getBandAndSpacing();

   return RDA5807M_BandLowerLimits[spaceandband & 0xFF] + (getRegister(RDA5807M_REG_STATUS) & RDA5807M_READCHAN_MASK) * (RDA5807M_ChannelSpacings[spaceandband >> 8] / 10);
}

char setFrequency(word frequency) {
   const word spaceandband = getBandAndSpacing();
   const word origin = RDA5807M_BandLowerLimits[spaceandband & 0xFF];

   //Check that specified frequency falls within our current band limits
   if (frequency < origin ||
   frequency > RDA5807M_BandHigherLimits[spaceandband & 0xFF])
   return 0;

   //Adjust start offset
   frequency -= origin;

   const byte spacing = RDA5807M_ChannelSpacings[spaceandband >> 8];

   //Check that the given frequency can be tuned given current channel spacing
   if (frequency * 10 % spacing)
   return 0;

   //Attempt to tune to the requested frequency
   updateRegister(RDA5807M_REG_TUNING, RDA5807M_CHAN_MASK | RDA5807M_FLG_TUNE,
   ((frequency * 10 / spacing) << RDA5807M_CHAN_SHIFT) |
   RDA5807M_FLG_TUNE);

   return 1;
}

byte getRSSI(void) {
   return (getRegister(RDA5807M_REG_RSSI) & RDA5807M_RSSI_MASK) >> RDA5807M_RSSI_SHIFT;
}

void updateRegister(byte reg, word mask, word value)
{
   setRegister(reg, (getRegister(reg) & ~mask) | value);
};



main.h
Спойлер
Код:
#ifndef MAIN_H_
#define MAIN_H_

#include <avr/io.h>
#include "RDA5807M.h"


#endif /* MAIN_H_ */


main.c
Спойлер
Код:


#include "main.h"

word frequency,status;
byte RSS;
int main(void)
{

   begin(RDA5807M_BAND_WEST);
    /* Replace with your application code */
    while (1)
    {
         char command = 'm';//Serial.read();
         switch(command){
            case 'v': volumeDown(0); break;
            case 'V': volumeUp(); break;
            case 's': seekDown(1); break;
            case 'S': seekUp(1); break;
            case 'm': mute(); break;
            case 'M': unMute(0); break;
            case 'f': frequency = getFrequency(); break;
            case 'q': RSS = getRSSI(); break;
            case 't': status = getRegister(RDA5807M_REG_STATUS); break;
            case '?': break;
         }
    }
}




По поводу дисплея есть такие http://old.radiodetali.com/td/displ/gnq4041.htm
Но он маловат, по больше мне найти не удалось


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вт окт 30, 2018 13:35:26 
Друг Кота

Карма: 60
Рейтинг сообщений: 67
Зарегистрирован: Ср янв 02, 2013 08:37:35
Сообщений: 3342
Рейтинг сообщения: 0
Для повышения точности возьмите не ds1307, а ds3231. Будет точнее.
Впрочем температура в помещении меняется не очень сильно и можно просто ввести автоматическую коррекцию.

То же склоняюсь к выбору DS3231 в место DS1307… их точность как раз и связана с внутренней корректировкой частоты кварца по температуре, так как датчик температуры и кварц встроены во внутрь корпуса. Ещё у DS3231 есть два независимых будильника, которых в DS1307 нет. Ну и ещё один не маловажный плюс, это расширенный диапазон питающего напряжения, может работа от напряжения 3,3 В, чем не может похвастаться DS1307.

Добавлено after 8 minutes 57 seconds:
По поводу дисплея есть такие http://old.radiodetali.com/td/displ/gnq4041.htm
Но он маловат, по больше мне найти не удалось

FYQ-8041AUG-11 немного больше…
Но можно взять большие одиночные индикаторы, например FYS-15013BS-21 или ещё больше FYS-23011BUG-21
http://chip-nn.ru/73.php


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вт окт 30, 2018 13:41:17 
Открыл глаза

Зарегистрирован: Чт июн 07, 2018 08:46:46
Сообщений: 49
Рейтинг сообщения: 0
Добавлено after 8 minutes 57 seconds:
По поводу дисплея есть такие http://old.radiodetali.com/td/displ/gnq4041.htm
Но он маловат, по больше мне найти не удалось

FYQ-8041AUG-11 немного больше…
Но можно взять большие одиночные индикаторы, например FYS-15013BS-21 или ещё больше FYS-23011BUG-21
http://chip-nn.ru/73.php


Но это дисплей без двух точек в центре, так не пойдет.
Если этой фирмы тогда уж FYQ-4041A, но что то их очень трудно найти.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вт окт 30, 2018 13:42:48 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 41
Рейтинг сообщений: 1209
Зарегистрирован: Ср фев 23, 2011 12:12:31
Сообщений: 2352
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Но можно взять большие одиночные индикаторы

У него проблема в том что хочет двоеточие и точку между цифрами.

_________________
Глупый не задает вопросы. Глупый и так все знает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вт окт 30, 2018 13:57:39 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4510
Откуда: Планета Земля
Рейтинг сообщения: 3
Медали: 1
Получил миской по аватаре (1)
Поддерживает более современные и мощные МК чем AVR, а некоторые из них дешевле чем AVR при большей производительности и лучшей периферии.
Мурик, извините, но уже начинаете подбешивать. Что не тема - так в ней Вы со своими "дешёвыми" и "крутыми" чипами. Может уже хватит ? :facepalm:
Пока прошу Вам самому остановиться.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вт окт 30, 2018 14:08:31 
Друг Кота

Карма: 60
Рейтинг сообщений: 67
Зарегистрирован: Ср янв 02, 2013 08:37:35
Сообщений: 3342
Рейтинг сообщения: 4
хочет двоеточие и точку между цифрами.

Это можно сделать к примеру светодиодами или развернуть один индикатор на 180 градусов…
Изображение
Вложение:
20181030_171025.jpg [75.67 KiB]
Скачиваний: 654


Последний раз редактировалось АСУ Вт окт 30, 2018 15:32:43, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вт окт 30, 2018 14:24:16 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 157
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3328
Рейтинг сообщения: -6
Аlex писал(а):
Что не тема - так в ней Вы со своими "дешёвыми" и "крутыми" чипами. Может уже хватит ?
В этой теме я написал что для VisualStudio есть расширение для разработки под другие МК, а не только AVR. Возможно ТС об этом не знал, ведь он написал что выбрал AVR только из-за поддержки VisualStudio. В чем я не прав?
А по поводу дешевых и крутых МК, это не нужно писать в кавычках, т. к. это действительно так и с этим не поспоришь. Чтобы это понять нужно сделать несколько проектов используя AVR и МК о которых я писал (ну вы поняли какие) и сравнить.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вт окт 30, 2018 17:27:09 
Друг Кота
Аватар пользователя

Карма: 187
Рейтинг сообщений: 8255
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Сообщений: 39530
Откуда: Нерезиновая
Рейтинг сообщения: 0
хочет двоеточие и точку между цифрами.

Индикаторов крупнее 0,56" с двоеточием нет, когда мне, лет 10 назад, "приспичило" сделать индикатор для часов:
Изображение
то двоеточие я сделал вот так:
Изображение Изображение Изображение

зы.. А примерно 40 лет назад я КРУПНЫЙ индикатор для часов (цифры высотой около 5-ти сантиметров) я вообще сделал из картона, а вместо светодиодов поставил миниатюрные лампочки- использовал 56 штук лампочек-
СпойлерИзображение


Было бы желание, а вам всё "готовенькое" подавай.. :facepalm:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Ср окт 31, 2018 13:37:20 
Открыл глаза

Зарегистрирован: Чт июн 07, 2018 08:46:46
Сообщений: 49
Рейтинг сообщения: 0
АлександрЛ
Вы правы, придется сделать самому. У меня нет требования к реализации огромных часов. Я делаю их на стол, а так же чтобы когда ночью просыпался, видел сколько времени. Хотел единый дисплей, потому что боюсь, что не подберу по яркости светодиоды к индикатору (но думаю что можно с помощью резистора решить проблему) .
Сделать аналогично вашей картинке мне не хотелось бы, т.к. получается, что расстояние между вторым и третьим разрядом не совпадает с расстоянием между 1 и 2 или 3 и 4. Придется делать между всеми разрядами расстояние одинаковое, равное расстоянию под светодиоды. Отсюда имеем, что необходимо приобрести 4 дисплея раздельных. Я выбрал самые дешёвые по33р. https://www.chipdip.ru/product/tos-5161bmr-n
Высота знака в 14.2 мм вполне для стола приемлема, и ночью не будет фонарем.
Так как расстояние между индикаторами я хочу как можно меньше я искал самый мелкий светодиод. https://www.chipdip.ru/product/l-13id
2мм в диаметре и расстояние между индикаторами примерно 2.5мм. По характеристикам конечно не очень совпадает, боюсь будет разница.
AndTer

Почему посоветовал IRLML2502 и IRLML6402. Это же полевые транзисторы, а мне нужны биполярные. Я выбрал вот такие:
https://www.chipdip.ru/product/bc817-16-nxp
https://www.chipdip.ru/product/bc807-16-nxp

Подскажите, подойдут ли такие компоненты, возможно, есть, что то лучше.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Ср окт 31, 2018 13:54:09 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 41
Рейтинг сообщений: 1209
Зарегистрирован: Ср фев 23, 2011 12:12:31
Сообщений: 2352
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Сделать расстояние между всеми цифрами может оказаться некрасиво.

Кто сказал что нужен биполярный?
Полевой транзистор советовал, потому что для работы в качестве ключа по напряжению он подходит лучше.
Меньше нагрузка на выходы микросхем, малое сопротивление перехода.
С биполярными, можно получить разную яркость в зависимости от числа включённых сегментов.

bc817/bc807 подойдут, но полевые лучше.

_________________
Глупый не задает вопросы. Глупый и так все знает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Ср окт 31, 2018 15:04:40 
Друг Кота

Карма: 60
Рейтинг сообщений: 67
Зарегистрирован: Ср янв 02, 2013 08:37:35
Сообщений: 3342
Рейтинг сообщения: 0
Сделать аналогично вашей картинке мне не хотелось бы, т.к. получается, что расстояние между вторым и третьим разрядом не совпадает с расстоянием между 1 и 2 или 3 и 4. Придется делать между всеми разрядами расстояние одинаковое, равное расстоянию под светодиоды.

Кстати расстояние между цифрами часов и минут смотрится лучше когда они разные чем когда одинаковые… вот как пример экран заводских часов…
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Пт ноя 02, 2018 09:54:50 
Мудрый кот

Карма: 10
Рейтинг сообщений: 272
Зарегистрирован: Пт мар 26, 2010 17:16:52
Сообщений: 1769
Откуда: Kazan
Рейтинг сообщения: 0
Можно использовать дисплей от таких-же радиочасов.
Только заменить платку с смд светодиодами на обычные 3 мм.
Изображение
Этот дисплей размерами 140х45мм.
Дисплеи бывают разного размера и цвета свечения красного или зеленого.
Более подробно наверное в другой теме.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вс ноя 04, 2018 10:11:56 
Открыл глаза

Зарегистрирован: Чт июн 07, 2018 08:46:46
Сообщений: 49
Рейтинг сообщения: 0
Решил изобразить все элементы подключения и номиналы.
Не уверен в SPI, прошу проверить, правильно ли все указал. Программировать собираюсь через такой программатор программатор.
Питать планирую от обычной зарядки для телефона по микро usb.
Сомнение так же вызывает подключение кварца. Для микросхемы часов он подключается без обвязки к мк с обвязкой конденсаторов. Опять же их номиналы.
Буду рад советам и предложениям.
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вс ноя 04, 2018 11:36:19 
Друг Кота

Карма: 60
Рейтинг сообщений: 67
Зарегистрирован: Ср янв 02, 2013 08:37:35
Сообщений: 3342
Рейтинг сообщения: 0
SPI подключено правильно. Поставьте ёмкость на входе ADC0.
Выводы DS1307 (SDA; SCL; QSW) необходимо подтянуть резисторами к плюсу питания. Так как данные выводы с открытым коллектором (стоком). ИМХО, аналоговое питание лучше подавать через дроссель.
«Пищалка» с внутренним генератором?
Светики между разрядами я бы сделал мигающими 1 Гц, изменив при этом их подключение.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Часы на 74HC595
СообщениеДобавлено: Вс ноя 04, 2018 12:05:19 
Открыл глаза

Зарегистрирован: Чт июн 07, 2018 08:46:46
Сообщений: 49
Рейтинг сообщения: 0
SPI подключено правильно. Поставьте ёмкость на входе ADC0.
Выводы DS1307 (SDA; SCL; QSW) необходимо подтянуть резисторами к плюсу питания. Так как данные выводы с открытым коллектором (стоком). ИМХО, аналоговое питание лучше подавать через дроссель.
«Пищалка» с внутренним генератором?
Светики между разрядами я бы сделал мигающими 1 Гц, изменив при этом их подключение.


Спасибо большое.

Емкость 0.1 мкф на АЦП?

Подтяжка SDA; SCL; QSW резисторами номиналом 4.7ком?

Про аналоговое питание не понял. Какой дроссель, где на схеме поставить? После USB по питанию?

«Пищалка» например такая HCM1201X.

Двоеточие хотите подключить к 7 выводу DS1307?


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 181 ]  1, , , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Engineer_Keen и гости: 18


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y