AndTer писал(а):Ну как же, например просто нет места на индикаторе для 4 цифр + знак + символ температуры. Не делать же бегущей строкой)
Потому и не всегда.
ну так этот аспект к округлению имеет опосредствованное отношение, это скорее проблема форматирования вывода... лично я решал в одном из своих проектов эту проблему так: для положительных температур ниже 100 градусов выводил с десятыми без округления, для температур от 100 и выше - без десятых (считая, что при таких температурах десятые доли уже не особо что-либо решают... например, в бане). аналогично для отрицательных температур... т.е. пока место под десятые есть за счет старших разрядов - десятые выводил, а иначе ими жертвовал в пользу старших разрядов и знака.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Но вот никак не хочет работать таймер в Proteus и постоянно выдает сообщение "вне радиуса", хотя импульсы с датчика приходят как положено и никаких проблем с его моделированием нет. Но вот подсчет времени в прерывании не происходит и не могу понять почему.
// LCD module connections
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections
int a;
//Interrupt function will be automatically executed on Interrupt
void interrupt()
{
if(INTCON.RBIF == 1) //Makes sure that it is PORTB On-Change Interrupt
{
INTCON.RBIE = 0; //Disable On-Change Interrupt
if(PORTB.F4 == 1) //If ECHO is HIGH
T1CON.F0 = 1; //Start Timer
if(PORTB.F4 == 0) //If ECHO is LOW
{
T1CON.F0 = 0; //Stop Timer
a = (TMR1L | (TMR1H<<8))/58.82; //Calculate Distance
}
}
INTCON.RBIF = 0; //Clear PORTB On-Change Interrupt flag
INTCON.RBIE = 1; //Enable PORTB On-Change Interrupt
}
void main()
{
char txt[7];
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
TRISB = 0b00010000;
INTCON.GIE = 1; //Global Interrupt Enable
INTCON.RBIF = 0; //Clear PORTB On-Change Interrupt Flag
INTCON.RBIE = 1; //Enable PORTB On-Change Interrupt
Lcd_Out(1,1,"Developed By");
Lcd_Out(2,1,"electroSome");
Delay_ms(3000);
Lcd_Cmd(_LCD_CLEAR);
T1CON = 0x10; //Initializing Timer Module
while(1)
{
TMR1H = 0; //Setting Initial Value of Timer
TMR1L = 0; //Setting Initial Value of Timer
a = 0;
PORTB.F0 = 1; //TRIGGER HIGH
Delay_us(10); //10uS Delay
PORTB.F0 = 0; //TRIGGER LOW
Delay_ms(100); //Waiting for ECHO
a = a + 1; //Error Correction Constant
if(a>2 && a<400) //Check whether the result is valid or not
{
IntToStr(a,txt);
Ltrim(txt);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Distance = ");
Lcd_Out(1,12,txt);
Lcd_Out(1,15,"cm");
}
else
{
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Out of Range");
}
Delay_ms(400);
}
}
Схема:
Всё как на том сайте, частота МК 8 МГц. Но если использовать готовые скомпилированные прошивки, которые можно скатать там же, то происходит сброс мк watchdog'ом.
Прописав значение a = 10, выдает как положено расстояние в 11 см. А с датчиком ничего.
Где ошибка? В программе или протеусе?
Главный инженер проекта - человек, который как никто другой знает, что приближаться к спроектированной им хрени близко не стоит.
Скачал и установил Atollic для STM32F030. Попробовал создать примитивный пример для отладки STM32F0308-DISCO. Однако при попытке дебажить вываливает ошибку:
В ST-Link стоит та версия, которую попросил Atollic (V2.J31.S0), хотя есть новее (V2.J33.S0).
Что я делаю не так?
Спасибо.
Процессор стартует с адреса 0x08000000.
По этому адресу стоит переход на начало программы, так как вектор прерывания по старту процессора находится по этому же адресу 0x08000000.
За ним находится таблица прерываний процессора.
Следующая выполняемая команда как раз находится по адресу 0x08000ab0. Читайте устройство и работу процессора.
Это я знаю. Меня смутил "PC"
Причём адресация разная при разных пустых проектах созданных через мастер. Вот это и удивляет!
Проблема вроде решилась сносом Atollic 9.3.0 и установкой 9.0.0.
Печалька... На другой машине (чужой) всё работало "из коробки" с тем же дистрибутивом 9.3.0.
Точнее, после сброса процессора в указатель стека и программный счётчик грузятся данные, расположенные по адресу 0х08000000. Вот после сброса PC и указывает на этот адрес. А он в общем случае может быть любым, какой ему назначит компилятор.
Делаю GSM-контроллер для телеметрии и малой автоматизации. Использую микроконтроллер STM32F103C8T6 и GSM-модуль SIM800L.
Развел плату так, что кварцевые резонаторы оказались под GSM-модулем - с обратной стороны платы. GSM-модуль является источником электромагнитных излучений. Насколько критично такое расположение кварцевых резонаторов?
Плату уже вытравил и почти спаял (осталось запаять GSM-модуль). При разводке на это не обратил внимания. А переразводить плату очень муторно (для меня это одна из самых нудных работ) - и так при разводке все мозги сломал - плата делалась под готовый корпус - места мало.
Да, я могу запаять GSM-модуль и проверить, как будет работать (хотя я почти уверен, что будет работать - но вопрос помех, надежности и стабильности остается открытым). Для полной проверки необходимо много времени и проверять при разных условиях.
Соответственно вопрос: кто-то устанавливал кварцевые резонаторы под GSM-модулем? И как надежно, стабильно работал микроконтроллер?
Верхние по ссылке как раз подойдут… они даже немного длиннее 21 мм… пластмассу переместив на середину разъёма получиться то что надо.
Или искать у других продавцов готовые...
Как я понял, это что то типа межплатных разъъёмов. Буду искать.
Что интересно - на старых DISCOVERY они короче. В спецификации тишина (может не там смотрю?).
Уважаемые коты, может вы поможете разобраться с моим вопросом.
Сделал в программе установку пороговых значений через запись в EEPROM при прошивке МК.
Ячейка с адресом 0x00 - нижний порог (по умолчанию 91 или 0x5B в hex-формате), адрес 0x01 - верхний порог (по умолчанию 97 или 0x61 в hex-формате).
В архиве файлы EEPROM (два варианта - bin и eep). Вы можете открыть их перед прошивкой в программе-прошивалке, отредактировать и залить в EEPROM микроконтроллера.
По не понятным причинам, автор этого проекта, заблокировал меня на своем сайте. Видимо за то, что я живу в Луганске, а он считает нас террористами.
В общем, мне нужно изменить температуру с 91 на 94 градуса, а с 97 на 100 и получить файл HEX, для заливки в контроллер. Если не сложно, хоть в 2х словах расскажите как и в каких программах это делать.
Я редактировал bin файл, в программе HxD. Там-же экспортировал его как HEX. Но получалась какая то фигня.