Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 09.11.2022, 14:18  
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию Re: Последовательная активация выходных сигналов(лампочек) с одинаковой задержкой в PROTEUS

Вот так попробуйте.
Миниатюры:
Нажмите на изображение для увеличения
Название: Схема.jpg
Просмотров: 0
Размер:	403.2 Кб
ID:	173524  
Вложения:
Тип файла: zip Proteus.zip (202.7 Кб, 0 просмотров)
Реклама:
Signalshik2 вне форума  
Сказали "Спасибо" Signalshik2
pashamem7894 (09.11.2022)
Непрочитано 09.11.2022, 16:04  
pashamem7894
Частый гость
 
Регистрация: 08.11.2022
Сообщений: 22
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
pashamem7894 на пути к лучшему
По умолчанию Re: Последовательная активация выходных сигналов(лампочек) с одинаковой задержкой в PROTEUS

Сообщение от Signalshik2 Посмотреть сообщение
Вот так попробуйте.
Спасибо большое) сижу сейчас и пытаюсь вникнуть или понять, как работает U2:A и U3, а также сигналы, которые на них идут
pashamem7894 вне форума  
Непрочитано 09.11.2022, 16:04  
ProtAS-13
Прописка
 
Регистрация: 17.03.2015
Сообщений: 287
Сказал спасибо: 0
Сказали Спасибо 209 раз(а) в 121 сообщении(ях)
ProtAS-13 на пути к лучшему
По умолчанию Re: Последовательная активация выходных сигналов(лампочек) с одинаковой задержкой в PROTEUS

Сообщение от pashamem7894 Посмотреть сообщение
Вот весь текст задания:...
Теперь хоть что-то стало понятно - ничего сложного тут не вижу (см. pic1).
Note: Позволил себе вольность увеличить частоты в 10 раз.
Миниатюры:
Нажмите на изображение для увеличения
Название: pic1.jpg
Просмотров: 0
Размер:	436.9 Кб
ID:	173527  
ProtAS-13 вне форума  
Сказали "Спасибо" ProtAS-13
pashamem7894 (09.11.2022)
Непрочитано 09.11.2022, 18:07  
pashamem7894
Частый гость
 
Регистрация: 08.11.2022
Сообщений: 22
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
pashamem7894 на пути к лучшему
По умолчанию

Сообщение от ProtAS-13 Посмотреть сообщение
Теперь хоть что-то стало понятно - ничего сложного тут не вижу (см. pic1).
Note: Позволил себе вольность увеличить частоты в 10 раз.
Спасибо огромное, уже помогает от части) ибо забыл про сложение по модулю вообще. Пытаюсь сейчас разобраться в dtff и decoder'e.

"На вход схемы поступает 8 сигналов x1...x8
Вы выход схемы поступает 8 сигналов y1...y8
В системе имеется 4 таймера
T1 = 2с, T2 = 3с, T3 = 7с, T4 = 11c
y1..y4 загораются последовательно с задержкой T1 друг относительно доруга после поступления x1&x2&x3&x4
y5 = x1&T1|x2'&T2|x3'&T3|x4&T4
y6 = x1|x3'|x5
y7 = 1, когда количество входов четно x1-x3. 0 - когда количество входов x1-x3 не четно."
Есть тз, ранее данное задание было сделано чисто на Proteus'e, без использования микроконтроллеров, теперь же необходимо сделать её с микроконтроллером семейства AVR. Был выбран Atmega 8, создан код на C Atml Studio , связан с Proteus'ом. По итогу проблема в следующем: при запуске программы в протеусе, лампочки 1-4 загораются не последовательно. По какой-то причине, работает лишь 1-ая лампочка. Перепробовали многое, убирали else, делали переменную stat глобальной, ничего не помогло.Вся работа находится в calculateOutputs . именно он в бесконечном цикле запускается...
Код на С:
Код:
/**
 * \file
 *
 * \brief Empty user application template
 *
 */

/**
 * \mainpage User Application template doxygen documentation
 *
 * \par Empty user application template
 *
 * Bare minimum empty user application template
 *
 * \par Content
 *
 * -# Include the ASF header files (through asf.h)
 * -# "Insert system clock initialization code here" comment
 * -# Minimal main function that starts with a call to board_init()
 * -# "Insert application code here" comment
 *
 */

/*
 * Include header files for all drivers that have been imported from
 * Atmel Software Framework (ASF).
 */
 /**
 * Support and FAQ: visit ‹a href="http://www.atmel.com/design-support/"›Atmel Support‹/a›
 */
#include ‹asf.h›
#include ‹avr/io.h›
#include ‹avr/interrupt.h›


#define t 0.1
#define n (int)(t / (6.4 * 0.00001) - 1)
#define k (int)(1 / t)

void initPorts() {
	// Setting port to read
	DDRB = 0x00;
	PORTB = 0x00;
	
	// Setting port to write
	DDRD = 0xFF;
	PORTD = 0x00;
}

void initTimer() {
	// Setting waveform generator to CTC
	TCCR1B |= (1 ‹‹ WGM12);
	OCR1A = n;
	// Enabling interrupt mask register to interrupt on OCIE1A
	TIMSK |= (1 ‹‹ OCIE1A);
	
	// Setting divider
	TCCR1B |= (1 ‹‹ CS10);
	TCCR1B |= (1 ‹‹ CS12);
	
	sei();
}

unsigned int interruptCount = 0;
int interruptFlags[4] = {0, 0, 0, 0};

// Periods in seconds
const int t1Period = 3;
const int t2Period = 5;
const int t3Period = 7;
const int t4Period = 11;

// Handling timer interrupt
ISR (TIMER1_COMPA_vect) {
	interruptCount++;
	
	if (interruptCount == (t1Period * k - 1)){
		interruptFlags[0] = 1;
	}
	else if ((interruptCount + 1) % (t1Period * k) == 0){
		interruptFlags[0] = 1;
	}
	else if ((interruptCount) % (t1Period * k) == 0){
		interruptFlags[0] = 0;
	}
	
	if (interruptCount == (t2Period * k - 1)){
		interruptFlags[1] = 1;
	}
	else if ((interruptCount + 1) % (t2Period * k) == 0){
		interruptFlags[1] = 1;
	}
	else if ((interruptCount) % (t2Period * k) == 0){
		interruptFlags[1] = 0;
	}
	
	
	if (interruptCount == (t3Period * k - 1)){
		interruptFlags[2] = 1;
	}
	else if ((interruptCount + 1) % (t3Period * k) == 0){
		interruptFlags[2] = 1;
	}
	else if ((interruptCount) % (t3Period * k) == 0){
		interruptFlags[2] = 0;
	}
	
	if (interruptCount == (t4Period * k - 1)){
		interruptFlags[3] = 1;
	}
	else if ((interruptCount + 1) % (t4Period * k) == 0){
		interruptFlags[3] = 1;
	}
	else if ((interruptCount) % (t4Period * k) == 0){
		interruptFlags[3] = 0;
	}
	
}

int inputs[5];
int outputs[7];

void readInputs() {
	for (int bit = 0; bit ‹ 5; bit++) {
		inputs[bit] = (PINB & (1 ‹‹ bit)) ›› bit;
	}
}

void calculateOutputs(int* x) {
	int y1=0;
	int y2=0;
	int y3=0;
	int y4=0;
	int stat = 0;
	if (x[0] && x[1] &&  x[2] && x[3]){
		if (interruptFlags[0]){
			if (stat == 0){
				y1 = 1;
				stat = 1;
			}
			else if (stat == 1){
				y2 = 1;
				stat = 2;
			}
			else if (stat == 2){
				y3 = 1;
				stat = 3;
			}
			else if (stat == 3){
				y4 = 1;
				stat = 0;
			}
		}
		
	}
	
	int y5 = (x[0] && interruptFlags[0])
	|| (!x[1]&& interruptFlags[1])
	|| (!x[2]&& interruptFlags[2])
	|| (!x[3]&& interruptFlags[3]);
	
	int y6 = (x[0] || !x[2] || x[4]);

	int y7 = !(x[0]&&x[1]&&x[2]) && x[0] && x[1]
	|| !(x[0]&&x[1]&&x[2]) && x[1] && x[2]
	|| !(x[0]&&x[1]&&x[2]) && x[0] && x[2];
	
	outputs[0] = y1;
	outputs[1] = y2;
	outputs[2] = y3;
	outputs[3] = y4;
	outputs[4] = y5;
	outputs[5] = y6;
	outputs[6] = y7;
}

int main(void) {
	initPorts();
	initTimer();
	
	while(1) {
		readInputs();
		calculateOutputs(inputs);
		
		for (int i = 0; i ‹ 7; i++) {
			PORTD &= ~(1 ‹‹ i);
			PORTD |= outputs[i] ‹‹ i;
		}
	}
}
Изображения:


Последний раз редактировалось mike-y-k; 17.11.2022 в 15:02. Причина: 6.6
pashamem7894 вне форума  
Непрочитано 17.11.2022, 14:48  
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию

Я исправил синтаксические ошибки в задании, неужели Вы не могли этого сделать. С преподавателем. Тэги кода надо нормально прикладывать, а не по идиотски. Форматирование кода также нужно делать. В чем вопрос?

А что такое t, n и k?

Fuze-биты на втором скриншоте: WDTON поставить Unprogrammed.

Последний раз редактировалось mike-y-k; 17.11.2022 в 16:16. Причина: 6.6
Signalshik2 вне форума  
Непрочитано 17.11.2022, 15:32  
pashamem7894
Частый гость
 
Регистрация: 08.11.2022
Сообщений: 22
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
pashamem7894 на пути к лучшему
По умолчанию Re: Последовательная активация выходных сигналов(лампочек) с одинаковой задержкой в PROTEUS

Signalshik2
Как я понял, t, n и k служат для подсчёта времени, имитируют таймеры. Сейчас уже вроде более или менее разобрался и отредактировал.

Последний раз редактировалось mike-y-k; 17.11.2022 в 16:15. Причина: 7.15
pashamem7894 вне форума  
Непрочитано 17.11.2022, 19:32  
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию

Boot Loader Size: (11) 128 words - нужно установить.

Сообщение от pashamem7894 Посмотреть сообщение
y7 = 1, когда количество входов четно x1-x3.
- как Вы понимаете вот эту фразу? Количество входов всегда нечетно и =3.

Последний раз редактировалось mike-y-k; 17.11.2022 в 20:21. Причина: 6.6
Signalshik2 вне форума  
Непрочитано 17.11.2022, 20:49  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Последовательная активация выходных сигналов(лампочек) с одинаковой задержкой в PROTEUS

pashamem7894, есть нормальные записи нулевой алгебры для выражения состояний
Y1=1 для X1|X2|X3 или Y1=1 для X1&X2&X3
тогда все и всем понятно

Signalshik2
Код:
	if (x[0] && x[1] &&  x[2] && x[3]){
ТС с нумерацией и/или формулировками путает - у него 4И
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Непрочитано 18.11.2022, 07:42  
ProtAS-13
Прописка
 
Регистрация: 17.03.2015
Сообщений: 287
Сказал спасибо: 0
Сказали Спасибо 209 раз(а) в 121 сообщении(ях)
ProtAS-13 на пути к лучшему
По умолчанию Re: Последовательная активация выходных сигналов(лампочек) с одинаковой задержкой в PROTEUS

Сообщение от pashamem7894 Посмотреть сообщение
Код на С:
Что-то сильно перемудрили - ведь простейшее же задание.
С формированием интервалов T1...T4 вообще какая-то абракадабра.
Настроили же прерывание на интервал 0.1, так вместо того, чтобы просто посчитать до 2, 3, 7 и 11, а затем переключать формируемые таймеры - зачем то наворотили ...
Вместо того, чтобы обрабатывать один байт входного/выходного портов, зачем то завели по байту на каждый бит - отсюда лишние издержки (циклы) по преобразованию байтов в биты и обратно.
При формировании Y7 забыли про то, что все нули - четное значение, и кроме того, скобки стоило бы указать между || (как для Y5), иначе компилятор должен ругаться.
ProtAS-13 вне форума  
Непрочитано 22.11.2022, 18:59  
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию

Что-то асмовский код вообще какой-то гонимый генерирует Atmel Studio 7 с родным Си-компилятором. Посмотрел его и выкидывает куски кода. Почему так?

Код:
#define F_CPU 16000000
//#include ‹asf.h›
#include ‹avr/io.h›
#include ‹avr/interrupt.h›
#include ‹util/delay.h›
#include ‹stdbool.h›

#define Tclk 1.0/F_CPU  //62,5(нс)
#define n_taktov 0.5/(Tclk)  //8 000 000
#define n_taktov_prsc (int)(n_taktov/1024)

unsigned char inputs[8];
unsigned char outputs[8];
unsigned char s;
//bool Enabled = false;
unsigned char volatile Enabled = 0;
unsigned char state = 0;

void initPorts()
{
	//Setting port to read
	DDRB = 0x00;
	PORTB = 0x00;
	
	//Setting port to write
	DDRD = 0xFF;
	PORTD = 0x00;
}

void initTimer()
{
	//Setting waveform generator to CTC
	TCCR1B |= (1 ‹‹ WGM12);
	OCR1A = n_taktov_prsc;
	//Enabling interrupt mask register to interrupt on OCIE1A
	TIMSK |= (1 ‹‹ OCIE1A);
	
	//Setting divider
	TCCR1B |= (1 ‹‹ CS10);
	TCCR1B |= (1 ‹‹ CS12);  //1024
	
	sei();
}

unsigned char TimersCounters[4] = {0, 0, 0, 0};
unsigned char TimersStates[4] = {0, 0, 0, 0};

//Periods in seconds
#define Tim1Period 2
#define Tim2Period 3
#define Tim3Period 7
#define Tim4Period 11

//Handling timer interrupt
ISR(TIMER1_COMPA_vect)
{
	//1
	TimersCounters[0]++;
	if(TimersCounters[0] == Tim1Period)
	{
		TimersStates[0] ^= 1;
		TimersCounters[0] = 0;	
	}
	
	//2
	TimersCounters[1]++;
	if(TimersCounters[1] == Tim2Period)
	{
		TimersStates[1] ^= 1;
		TimersCounters[1] = 0;
	}
	
	//3
	TimersCounters[2]++;
	if(TimersCounters[2] == Tim3Period)
	{
		TimersStates[2] ^= 1;
		TimersCounters[2] = 0;
	}
	
	//4
	TimersCounters[3]++;
	if(TimersCounters[3] == Tim4Period)
	{
		TimersStates[3] ^= 1;
		TimersCounters[3] = 0;
	}
}



void readInputs()
{
	for(unsigned char bit = 0; bit ‹ 8; bit++)
	{
		inputs[bit] = (PINB & (1 ‹‹ bit)) ›› bit;
	}
	if(inputs[0] && inputs[1] && inputs[2] && inputs[3])
		Enabled = 1;
}

void calculateOutputs(unsigned char* x)
{
	volatile unsigned char y1=0;
	volatile unsigned char y2=0;
	volatile unsigned char y3=0;
	volatile unsigned char y4=0;
	
	if(Enabled == 1)
	{
		if(state == 0)
		{
			y4 = 0;
			y1 = 1;
			state = 1;
		}
		else if(state == 1)
			 {
				  y1 = 0;
				  y2 = 1;
				  state = 2;
			 }
			 else if(state == 2)
				  {
					  y2 = 0;
					  y3 = 1;
					  state = 3;
				  }
				  else if(state == 3)
					   {
					       y3 = 0;
						   y4 = 1;
					  	   state = 0;
					   }
	}
	
	unsigned char y5 = (x[0] && TimersStates[0])
	               || (!x[1] && TimersStates[1])
		           || (!x[2] && TimersStates[2])
		           || (x[3] && TimersStates[3]);
	
	unsigned char y6 = (x[0] || !x[2] || x[4]);

	unsigned char y7 = !(x[0]&&x[1]&&x[2]) && x[0] && x[1]
	      || !(x[0]&&x[1]&&x[2]) && x[1] && x[2]
	      || !(x[0]&&x[1]&&x[2]) && x[0] && x[2];
	
	s = y1 & 0x01;
	s |= (y2 & 0x01) ‹‹ 1;
	s |= (y3 & 0x01) ‹‹ 2;
	s |= (y4 & 0x01) ‹‹ 3;
	s |= (y5 & 0x01) ‹‹ 4;
	s |= (y6 & 0x01) ‹‹ 5;
	s |= (y7 & 0x01) ‹‹ 6;
	
}

int main(void)
{
	initPorts();
	initTimer();
	
	while(1)
	{
		readInputs();
		calculateOutputs(inputs);
		PORTD = s;			
		_delay_ms(220);
	}
}

Последний раз редактировалось mike-y-k; 22.11.2022 в 20:07. Причина: 6.6
Signalshik2 вне форума  
 

Закладки

Метки
led, logicstate, proteus
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 16:46.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot