Доброго времени суток. Только начинаю изучать микроконтроллеры. Выбрал 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 таймере я могу реализовать ШИМ. Стал искать как вообще запустить, и так как я ничего почти не понял в скорости этих таймеров( точнее понял, но зачем столько настроек, каких то зависимостей между ними). Реализовал вот так:
Не знаю, на сколько, это правильно, но импульсы дает в зависимости от величины 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
Опять просьбы проверить и подсказать все ли так. Кнопка подключена к PB0. В обработчике TIMER0_OVF_vect прерывания, считаю, сколько циклов нажата кнопка если больше 3 и меньше 60 то короткое нажатие, если больше 60 длинное. Длинные нажатия меняют режимы редактирования: часы, минуты, день, месяц, год, день недели, вкл будильника, часы будильник, минуты будильник. Короткие нажатия увеличивают значения этих величин. В случае с вкл будильника, вкл или выкл. Так же применил микросхему DS18B20 датчик температуры. Очень как мне показалось дорогое удовольствие. Стоит больше 100руб. дороже мк. Работает по шине 1-Wire. На этой шине может быть много этих датчиков ( 125 по-моему), но чтобы не искать их на шине и не писать код я использовал 1 и пропустил его идентификацию. Сам ход часов реализован на DS1307ZN. Думаю статей про нее предостаточно поэтому особенно распыляться не буду, проблем с ней не возникло.
Очень прошу опытных проверить код и подсказать, как его можно улучшить. Начал подбирать компоненты, возникла проблема с индикатором. Не могу найти индикатор с точками и двоеточием одновременно. Чтобы показывать время нужно двоеточие, для даты точка под двоеточием, и для температуры у меня нужна точка в предпоследнем знаке. Везде либо двоеточие для времени, либо точки под знаками, а надо и то и то. Подскажите какой можно найти в Москве. Какие лучше транзисторы использовать для управления индикаторами? Мне желательно маленькие клеящиеся, чтобы не сверлить дырок.
Под большим вопросом, но мысли не отпускают связь с интернетом. Я понимаю что часы со временем будут либо убегать либо отставать, и это будет зависеть от окружающей среды кварца. Чем теплее скорее всего тем часы сильнее будут убегать вперед ( это я предполагаю) , чем холоднее наоборот. Поэтому хотелось бы связаться с интернетом, но постоянная связь мне не нужна, а это значит можно и блютус например, подключится и подправить время ( думаю что такое решение тоже удобное ). Вся проблема в том что нету железа пробовать и возможности такой, а в протеусе такое не смоделировать. ( боюсь не потяну).
Я понимаю что часы со временем будут либо убегать либо отставать, и это будет зависеть от окружающей среды кварца. Чем теплее скорее всего тем часы сильнее будут убегать вперед ( это я предполагаю) , чем холоднее наоборот. Поэтому хотелось бы связаться с интернетом, но...
если б я не был таким ленивым, я бы задействовал для подстройки часов FM-радио, а именно RDS. чип приемника FM c поддержкой RDS стоит вообще смешные копейки, FM радиостанций сейчас в любом городе больше, чем блох на Тузике... в RDS есть сообщения с датой и временем. точность, конечно, будет не как у атомных часов в Цюрихе, но для бытовых применений более, чем достаточная - никогда не будет отклонения больше, чем 1 минута. и, опять же, можно радио-будильник сделать
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Выбрал AVR, только потому, что Atmel studio базируется на visual studio
Про VisualGDB не слышали? https://visualgdb.com/?features=embedded Поддерживает более современные и мощные МК чем AVR, а некоторые из них дешевле чем AVR при большей производительности и лучшей периферии.
Клеящихся транзисторов, как и микросхем не бывает. Откуда вы это взяли? Поверхностный монтаж это называется. Но они не клеятся, а припаиваются.
По индикаторам, используйте точки. Мигающая для времени, а постоянно светящаяся для даты. Либо берите отдельные цифры и ставьте между ними маленькие круглые светодиоды. 2 для двоеточия и 1 для точки.
Транзисторы можно купить полевые. Но смотря что коммутировать. "Минусы" коммутировать IRLML2502 для "плюсов" IRLML6402. Для 2502 затвор подтягивается к минусу через резистор 10к, на затвор ставится резистор 100Ом и идёт на микросхему(для открытия транзистора подаём плюс). Для 6402 затвор подтягивается к плюсу через резистор 10к, на затвор ставится резистор 100Ом и идёт на микросхему(для открытия транзистора подаём минус).
Интернет для часов? Приехали... РДС и ЖПС отттуда же... К доктору обращайтесь, это если не лечится, то достичь ремиссии думаю удастся. И вы снова будете воспринимать часы как часы. Для повышения точности возьмите не ds1307, а ds3231. Будет точнее. Впрочем температура в помещении меняется не очень сильно и можно просто ввести автоматическую коррекцию.
_________________ Глупый не задает вопросы. Глупый и так все знает.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
ну а аргументы будут посерьезнее, чем сказано? GPS - вообще хорошая штука, но габаритная, требует антенны специальной, да и стоит относительно дорого. RDS - стоит копейки, антенны практически не требует (не считать же проводок за это?!), габарит мелкий, функцию обеспечивает, да и вторую функцию позволяет реализовать (я о радиобудильнике).
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
РДС для часов интересная штука. Посмотрел я RDA5807M. Нашел библиотеку под нее https://github.com/csdexter/RDA5807M/tr ... 7M_Example К сожалению, библиотека под андруино (почему то у меня к коду андруино какой то негатив, не понимаю, откуда он). Решил переписать (так сказать подправить). Общаемся мы с RDA5807M по I2C (TWI) поэтом стандартные функции должны подойти.
Код:
void I2C_Init(void) { TWBR=0x20; //скорость передачи (при 8 мГц получается 100 кГц) надо настроить ? }
Тут вроде ничего сложного, обращаемся пишем 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 Спойлер
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 кГц) надо настроить ? }
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[]) {
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; }
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;
//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);
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; } } }
Для повышения точности возьмите не ds1307, а ds3231. Будет точнее. Впрочем температура в помещении меняется не очень сильно и можно просто ввести автоматическую коррекцию.
То же склоняюсь к выбору DS3231 в место DS1307… их точность как раз и связана с внутренней корректировкой частоты кварца по температуре, так как датчик температуры и кварц встроены во внутрь корпуса. Ещё у DS3231 есть два независимых будильника, которых в DS1307 нет. Ну и ещё один не маловажный плюс, это расширенный диапазон питающего напряжения, может работа от напряжения 3,3 В, чем не может похвастаться DS1307.
FYQ-8041AUG-11 немного больше… Но можно взять большие одиночные индикаторы, например FYS-15013BS-21 или ещё больше FYS-23011BUG-21 http://chip-nn.ru/73.php
FYQ-8041AUG-11 немного больше… Но можно взять большие одиночные индикаторы, например FYS-15013BS-21 или ещё больше FYS-23011BUG-21 http://chip-nn.ru/73.php
Но это дисплей без двух точек в центре, так не пойдет. Если этой фирмы тогда уж FYQ-4041A, но что то их очень трудно найти.
Поддерживает более современные и мощные МК чем AVR, а некоторые из них дешевле чем AVR при большей производительности и лучшей периферии.
Мурик, извините, но уже начинаете подбешивать. Что не тема - так в ней Вы со своими "дешёвыми" и "крутыми" чипами. Может уже хватит ? Пока прошу Вам самому остановиться.
Что не тема - так в ней Вы со своими "дешёвыми" и "крутыми" чипами. Может уже хватит ?
В этой теме я написал что для VisualStudio есть расширение для разработки под другие МК, а не только AVR. Возможно ТС об этом не знал, ведь он написал что выбрал AVR только из-за поддержки VisualStudio. В чем я не прав? А по поводу дешевых и крутых МК, это не нужно писать в кавычках, т. к. это действительно так и с этим не поспоришь. Чтобы это понять нужно сделать несколько проектов используя AVR и МК о которых я писал (ну вы поняли какие) и сравнить.
Индикаторов крупнее 0,56" с двоеточием нет, когда мне, лет 10 назад, "приспичило" сделать индикатор для часов: то двоеточие я сделал вот так:
зы.. А примерно 40 лет назад я КРУПНЫЙ индикатор для часов (цифры высотой около 5-ти сантиметров) я вообще сделал из картона, а вместо светодиодов поставил миниатюрные лампочки- использовал 56 штук лампочек- Спойлер
Было бы желание, а вам всё "готовенькое" подавай..
АлександрЛ Вы правы, придется сделать самому. У меня нет требования к реализации огромных часов. Я делаю их на стол, а так же чтобы когда ночью просыпался, видел сколько времени. Хотел единый дисплей, потому что боюсь, что не подберу по яркости светодиоды к индикатору (но думаю что можно с помощью резистора решить проблему) . Сделать аналогично вашей картинке мне не хотелось бы, т.к. получается, что расстояние между вторым и третьим разрядом не совпадает с расстоянием между 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
Сделать расстояние между всеми цифрами может оказаться некрасиво.
Кто сказал что нужен биполярный? Полевой транзистор советовал, потому что для работы в качестве ключа по напряжению он подходит лучше. Меньше нагрузка на выходы микросхем, малое сопротивление перехода. С биполярными, можно получить разную яркость в зависимости от числа включённых сегментов.
bc817/bc807 подойдут, но полевые лучше.
_________________ Глупый не задает вопросы. Глупый и так все знает.
Сделать аналогично вашей картинке мне не хотелось бы, т.к. получается, что расстояние между вторым и третьим разрядом не совпадает с расстоянием между 1 и 2 или 3 и 4. Придется делать между всеми разрядами расстояние одинаковое, равное расстоянию под светодиоды.
Кстати расстояние между цифрами часов и минут смотрится лучше когда они разные чем когда одинаковые… вот как пример экран заводских часов…
Можно использовать дисплей от таких-же радиочасов. Только заменить платку с смд светодиодами на обычные 3 мм. Этот дисплей размерами 140х45мм. Дисплеи бывают разного размера и цвета свечения красного или зеленого. Более подробно наверное в другой теме.
Решил изобразить все элементы подключения и номиналы. Не уверен в SPI, прошу проверить, правильно ли все указал. Программировать собираюсь через такой программатор программатор. Питать планирую от обычной зарядки для телефона по микро usb. Сомнение так же вызывает подключение кварца. Для микросхемы часов он подключается без обвязки к мк с обвязкой конденсаторов. Опять же их номиналы. Буду рад советам и предложениям.
SPI подключено правильно. Поставьте ёмкость на входе ADC0. Выводы DS1307 (SDA; SCL; QSW) необходимо подтянуть резисторами к плюсу питания. Так как данные выводы с открытым коллектором (стоком). ИМХО, аналоговое питание лучше подавать через дроссель. «Пищалка» с внутренним генератором? Светики между разрядами я бы сделал мигающими 1 Гц, изменив при этом их подключение.
SPI подключено правильно. Поставьте ёмкость на входе ADC0. Выводы DS1307 (SDA; SCL; QSW) необходимо подтянуть резисторами к плюсу питания. Так как данные выводы с открытым коллектором (стоком). ИМХО, аналоговое питание лучше подавать через дроссель. «Пищалка» с внутренним генератором? Светики между разрядами я бы сделал мигающими 1 Гц, изменив при этом их подключение.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 54
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения