CS_0; //отправим «0» на вывод CS микросхемы MAX7219, чтобы начать процесс передачи адреса и данных asm("nop"); //пауза в 1 такт
for(I=0;I<8;I++) //цикл от 0 до 7 с шагом 1, для побитной отправки байта адреса в микросхему MAX7219 { if((Adres_Reg & 0x80)==0x80) //если 7 бит переменной Adres_reg=1 { DIN_1; //отправим 1 на вывод Din микросхемы MAX7219 } else //если 7 бит переменной Adres_reg=0 { DIN_0; //отправим 0 на вывод Din микросхемы MAX7219 }
//создадим тактовый импульс на выводе CLK микросхемы MAX7219 asm("nop"); //пауза в 1 такт CLK_1; //отправим 1 на вывод Clk микросхемы MAX7219 asm("nop"); //пауза в 1 такт CLK_0; //отправим 0 на вывод Clk микросхемы MAX7219 Adres_Reg <<= 1; //сдвинем значение переменной Adres_reg на 1 бит влево } //выйдем из цикла когда i станет равной 7, т.е. когда отправка байта адреса в микросхему MAX7219 будет окончена
for(I=0;I<8;I++) //цикл от 0 до 7 с шагом 1, для побитной отправки байта данных в микросхему MAX7219 { if((Data_In[Adres_Reg_Copy] & 0x80)==0x80) //если 7 бит переменной Data_in=1 { DIN_1; //отправим 1 на вывод Din микросхемы MAX7219 } else //если 7 бит переменной Data_in=0 { DIN_0; //отправим 0 на вывод Din микросхемы MAX7219 }
//создадим тактовый импульс на выводе CLK микросхемы MAX7219 asm("nop"); //пауза в 1 такт CLK_1; //отправим 1 на вывод Clk микросхемы MAX7219 asm("nop"); //пауза в 1 такт CLK_0; //отправим 0 на вывод Clk микросхемы MAX7219 Data_In[Adres_Reg_Copy] <<= 1; //сдвинем значение переменной Data_in на 1 бит влево } //выйдем из цикла когда i станет равной 7, т.е. когда отправка байта данных в микросхему MAX7219 будет окончена CS_1; //отправим «1» на вывод CS микросхемы MAX7219, чтобы завершить процесс передачи адреса и данных }
//********************* Инициализация MAX7219 ***************** void Init_MAX7219() { Write_MAX7219(0x09,127); //включаем режим BCD code B, для 7 разрядов Write_MAX7219(0x0A,10); //яркость свечения сегментов 10 (от 0 до 15) Write_MAX7219(0x0B,7); //число используемых разрядов (7 разрядов) Write_MAX7219(0x0C,1); //отключаем режим энергосбережения (Shutdown) }
//******** Функция вывода значений на 7 сегм.индикатор №1 ****** void Out_Display_1(unsigned int Display_Ust) { Digit[7]=Display_Ust/100; //сотни Digit[6]=Display_Ust%100/10; //десятки Digit[6]=Digit[6]|128; //вкл децимальную точку в разряде Cifra_6 Digit[5]=Display_Ust%10; //единицы
//*************************** Функция измерения напряжения на входах АЦП ***************************
unsigned long ADC_Convert (unsigned char Chan_ADC) { uint32_t sum = 0; //ADMUX = ADMUX&224|Chan_ADC;//выберем канал АЦП (обнулим биты MUX4-MUX0 в регистре ADMUX, не изменяя при этом биты 5,6,7, после этого заменим значение битов MUX4-MUX0 на номер(код) канала) ADMUX = ADMUX & 224; //выберем канал АЦП (сначала обнулим биты MUX4-MUX0 в регистре ADMUX, не изменяя при этом биты 5,6,7) ADMUX = ADMUX | Chan_ADC; //выберем канал АЦП (затем заменим значение битов MUX4-MUX0 на номер(код) канала) for(uint8_t i = 0; i < measure; ++i) { ADCSRA |= (1<<ADSC); //Начинаем аналого-цифровое преобразование (для этого запишем 1 в бит ADSC регистра ADCSRA) while((ADCSRA & (1<<ADSC))); //Ждём когда закончиться аналого-цифровое преобразование (преобразование закончится, когда бит ADSC регистра ADCSRA станет равным 0) sum += ADCW; } sum += measure >> 1; sum /= measure; return (unsigned long) sum; //Выйдем из функции и вернём (запишем) полученное значение (из регистров результата ADCL и ADCH) в переменную типа unsigned int }
//************************** Основная функция с бесконечным циклом ******************************* int main(void) { DDRC = 7; //биты PC0-PC2 порта PC на вывод
//---------- port_ini(); //инициализация порта PB1 init_PWM_timer(); //вызов функции таймер 1 OCR1AH = 0x00; //запись в регистр число dec85 OCR1AL = 0x55; //---------- while(1) { Display1_ADC = ADC_Convert(4); //Считаем значение с 4 канала АЦП Out_Display_1(Display1_ADC); //Отправим считанное значение в функцию вывода на индикатор №1 _delay_ms(200);
Display2_ADC = ADC_Convert(3); //Считаем значение с 3 канала АЦП Out_Display_2(Display2_ADC); //Отправим считанное значение в функцию вывода на индикатор №2 _delay_ms(200); } } вот с таким кондом заработала платка без мигалова этого раздражающего. второй канал тоже работает, но проверить его полноценно смогу только в мастерской. надо запустить в шунт 75мВ сотку амперов с источника лбп. пока только от омметра подавал на второй вход ацп - канал работает. и второй вариант собрать на линейном дадчеге Холла ss-495a. Спойлер
_________________ душа человеческая темна и с легкостью обращается ко злу
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
slav0n, недостаток Вашего метода в том, что остаток при делении теряется, т.е. если ADC стабилен и прирос на число меньшее делителя, то показания дисплея не изменятся...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ладно, "достаточно стабилен" в смысле не дёргается... поставишь такой сглаживатель на дисплей вольтметра и будешь всё время напряжение завышать.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
или вдруг надо сильно сглаживать (делитель = 100) так вообще показаний не дождёшься..
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
вчера было 400, сегодня 401, и завтра 401, и послезавтра... а ты об этом и не узнаешь...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
В машинных кодах для сдвига вправо есть специальная команда с сохранением знака - ASR Reg. Может С компилер это учитывает? (это предположение, а не утверждение)
Это стандартная коррекция при инвертировании знака числа. Как видно, при использовании операции сдвига, эта коррекция не выполняется. Т.о. в данном случае правильно делить, а не сдвигать.
Это стандартная коррекция при инвертировании знака числа.
какая еще коррекция? возьмем простой пример: 03 - 05 = FE. а FE - это и есть -2, то есть правильный результат. а после прибавления 1 получим -1, то есть неправильный результат.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
алгоритм slav0n'а, ещё плох тем, что дисплей 0 показывать будет только при включении, а потом как не опускай напряжение - нуля на дисплее уже не добиться... я помню гдето тоже пытался применить такой код - не понравилось... с накопителем лучше.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения