Перейти к содержанию

Вопросы от начинающих по МК


Рекомендуемые сообщения

кроме прерывания от таймера для отсчета времени и управления симистором
Да ему и таймера то, по большому счёту, никакого не нужно. Всё можно на делеях сделать.

Опросы вывода (кнопки), делеи, управление выводами. Это всё, что нужно.

DmitryS, почитайте про автоматы состояний.

ЗЫ: Если у Вас сейчас всё работает, и все уже привыкли к этому, зачем Вы взялись переделывать эту систему ?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

Поэтому и говорю что надо с нуля начинать. Вы зашли в тупик, выбираться из которого порой труднее и затратнее чем начинать с чистого листа.

К сожалению, и на ассемблере и вообще на PIC16F628. К тому же реализовано плавное включение лампочек и вентиляторов(устройство обслуживает так же и ванну).

Первичным должен быть АЛГОРИТМ работы устройства, это очень важная часть разрабатываемого проекта которая позволяет не блуждать по лабиринтам программы. К сожалению, многие думают что в голове его прекрасно удержат и это лишняя работа но это не так. Может это не очевидно, но даже простейший план на бумаге в итоге сокращает общее время разработки.

Так же очень сильно помогает разделить программу на две части - HAL, где описано все функции взаимодействия с железом и логическая часть где нет прямой работы с портами а находится только логика работы.

Попробуйте, как уже выше посоветовали, нарисовать вашу программу в виде графа состояний, причем с каждого состояния может быть несколько выходов. И если вы реализуете алгоритмы каждого состояния отдельно, то сама программа станет довольно таки очевидной и наглядной.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Конечный автомат

Автоматное программирование

Цитата оттуда :

Кроме того, мышление в терминах конечных автоматов (то есть разбиение исполнения программы на шаги автомата и передача информации от шага к шагу через состояние) необходимо при построении событийно-ориентированных приложений. В этом случае программирование в стиле конечных автоматов оказывается единственной альтернативой порождению множества процессов или потоков управления (тредов).
Так что, не изобретайте велосипед и не путайте себя, придумывая новые алгоритмы подобным задачам. Всё уже давно придумано, осталось только применить...
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

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

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Спасибо Большое за пожелания ! Вы что то сильно меня грузить начали общими положениями и совершенно ни чего не сказали конкретно по мной заданному вопросу . Все что вы сказали , это замечательно , но меня интересует почему не работает конкретный кусок кода . Почему разрешение прерывания INT0 , именно разрешение , а не само прерывание , не дает работать счетчику .

Может я не в той теме вопрос задал ?

Ссылка на комментарий
Поделиться на другие сайты

Чтобы ответить на ваш вопрос нужно проанализировать работу всей программы, вникнуть в неё так сказать вплоть до того что разобрать сгенерированный ассемблерный код и прокрутить в голове всю программу, или в отладчике. Это всё время и ресурсы причем значительные(считай заново разработать программу). Максимум что можно дать так это советы.

И поэтому, в таких случаях всегда советуют начать с чистого листа - старый код слишком оброс костылями за которыми не видно очевидных ошибок, исправлять такой код слишком накладно.

Все-таки, попробуйте соединить студию с протеусом и пройтись отладкой пошагово. Да и в самом

.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Есть трудность. Получая значения от компаратора и пытаясь занести их в регистр методом сдвига. Заполнить переменную не получается. Проверяю в Протеусе. Под скажите что не так?

Chip type		   : ATtiny2313
Clock frequency	 : 8,000000 MHz
Memory model	    : Tiny
External RAM size   : 0
Data Stack size	 : 32
*****************************************************/
#include <tiny2313.h>
char n=0;
int xc=0x00;


// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
n++;
ACSR=0x48;

}
// Analog Comparator interrupt service routine
interrupt [ANA_COMP] void ana_comp_isr(void)
{

if ((ACSR&0x20)==0x20) {

	 PORTB.0=0;
	  }

	 else {

	 xc=1<<1;     //Здесь регистр не заполняется

	 PORTB.0=1;
	 ACSR=0x40;
	 }

}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x07;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x08;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x41;
// Analog Comparator initialization
// Analog Comparator: On
// Digital input buffers on AIN0: On, AIN1: On
DIDR=0x00;
// The Analog Comparator's positive input is
// connected to the Bandgap Voltage Reference
// Interrupt on Output Toggle
// Analog Comparator Input Capture by Timer/Counter 1: Off
//ACSR=0x48;
// Global enable interrupts
#asm("sei")
while (1)
  {

   #asm("cli")



   if(n==16){
  if (xc&1){

 PORTB.2=1;
 }

 else{


 PORTB.2=0;
 }
 xc>>=1;

  }

  #asm("sei")
  };
}

Ссылка на комментарий
Поделиться на другие сайты

А что говорит отладчик? Переменная там может быть соптимизирована. Все её изменения остаются только внутре процедуры обработки прерывания.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Много мусорных комментариев, а где комментарии нужны, их нет. Вот мне, например, лень лезть в даташит ради фразы if ((ACSR&0x20)==0x20) . 0x20 в данном случае это что?

Код не отформатирован. Частично вина движка форума, но надо же иметь уважение к тем, кто хочет помочь!

Переменные n и xc меняются в прерываниях, но не объявлены соответствующим образом.

Сдвиг есть в main'e, но запись именно 0b00000010 в переменную довольно странна.
xc>>=1;

Кстати, что за регистр хотите заполнять? В программе ни один РОН не указан, а заполнять сдвигами регистры переферии - довольно опасное и нелогичное занятие. Может, имелась в виду переменная а не регистр?

Изменено пользователем COKPOWEHEU

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Приветствую всех!

На рисовалась у меня проблемка.У меня есть прошивка на мегу 8 , она на кварц 15мГц, я не смог найти такой у нас в магазинах,а из-за одного кварца делать заказ в инет магазине не сурьёзно.И теперь мне нужно перекомпилировать прошивку на другой кварц, на 12 мГц.Сам я не силён в этом.

Может кто нибудь мне помочь ?

Ссылка на комментарий
Поделиться на другие сайты

Да. Ставите Студию, cvavr или что-то подобное (не знаю в чем написана прошивка), открываете проект и выставляете в настройках частоту кварца 12 МГц. Возможно, придется менять настройки таймеров и прочей переферии. В частности, для avr-gcc это ключ -DF_CPU=12000000. По имеющейся информации ИМХО максимально развернутый ответ.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

COKPOWEHEU. Спасибо за ответ,только я думаю у меня это не получится сделать, так как я даже не представляю как это сделать

открываете проект и выставляете в настройках частоту кварца 12 МГц. Возможно, придется менять настройки таймеров и прочей переферии. В частности, для avr-gcc это ключ -DF_CPU=12000000.

Поэтому и пишу, может кто нибудь сделает это ?

Ссылка на комментарий
Поделиться на другие сайты

Если у вас только прошивка то сделать это чрезвычайно трудно.

Изменить рабочую частоту можно только имея исходник, и то не факт что получится. Может в критических местах банально не хватить скорости выполнения программы и будет нештатное поведение.

А может, тактовая частота там не критична, ну задержки увеличатся на 25%, если это не часы(а если часы но с внешним счетчиком времени и отдельным кварцем под часовую функцию) то никакой особой проблемы быть не должно.

Что за устройство? Какая функция прошивки? Может ничего и менять не надо...

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Вот это устройство. http://cxem.net/mc/mc61.php .

Вот архив .Там схема .прошивка с исходник.

BASCOM_8x8.rar

Изменено пользователем Серёгин1975
Ссылка на комментарий
Поделиться на другие сайты

xc=1<<1; По мойму это команда на сдвиг по регистру. 0x20 (b100000) в регистре ACSR

Да не регистр а переменная имелась в виду.

а заполнять сдвигами регистры переферии - довольно опасное и нелогичное занятие.

И как лучше написать?

Ссылка на комментарий
Поделиться на другие сайты

Цена Atmega162 у нас в городе дошла до 500 руб с лишком. Не дешевле ли перейти на PIC? И хорошо бы получить ответ именно от того, кто много поработал с АВР, а затем уже, попробовал PIC.

Ссылка на комментарий
Поделиться на другие сайты

Стоимость перехода тоже учитываешь? собственно PIC тоже подоражают если еще не подорожали. Собственно это и есть законы рынка на которых спекулянты наживаются - повышается спрос, они сразу цену ломят. А что, ведь все равно берут.

Если в местных магазинах цену ломят, бери в зарубежных магазинах с бесплатной доставкой.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

бери в зарубежных магазинах с бесплатной доставкой.

Ну там на стольник подешевше, овкос... Но все равно немало. И желание есть попробовать на зуб что-то паралелльно лежащее. Да и шоппинг - все же пложительно засасывает))) Но ежели покупать - так нечто что можно потом применить. Вот и подумал о PIC... STM сложно... Rasberry - или как его пишут, не помню можно еще..

Ссылка на комментарий
Поделиться на другие сайты

Странно ни кто не знает как лучше сохранить данные по битно в переменную чем плох сдвиг и правильно ли я думаю использовать массив. И как массив сравнивают с переменной.

Ссылка на комментарий
Поделиться на другие сайты

Странно ни кто не знает как лучше сохранить данные по битно в переменную чем плох сдвиг и правильно ли я думаю использовать массив. И как массив сравнивают с переменной.

элементарно структура для обращения к битам , + объединение если нужно обращение к самой переменной

volatile struct flag_type {
 unsigned rty	 : 1;
 unsigned		  : 1;
 unsigned		  : 1;
 unsigned		  : 1;
 unsigned		  : 1;
 unsigned		  : 1;
 unsigned		  : 1;
 unsigned rec_line : 1;			   // флаг готовности данных!!!!
} flag;
struct temp_type {				    // Создаем 16 битное поле
unsigned bit0	 : 1;			    // Для доступа к 0 и 15 биту
unsigned		  : 7;
unsigned		  : 7; 
unsigned bit15    : 1;
}
volatile union{					  // объединяем(совмещаем в памяти)
struct temp_type    Frames_bit;	  // 16 битное поле
unsigned int		    Frames;		  // и 16 битную переменную  
} Result;

// работа с битами
flag.rty=1;
Result.Frames_bit.bit0=1;
//работа с переменной
Result.Frames=0xFFFF;

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...