09.11.2022, 14:18
|
#11
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: Последовательная активация выходных сигналов(лампочек) с одинаковой задержкой в PROTEUS
Вот так попробуйте.
|
|
|
Сказали "Спасибо" Signalshik2
|
|
|
09.11.2022, 16:04
|
#12
|
Частый гость
Регистрация: 08.11.2022
Сообщений: 22
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Последовательная активация выходных сигналов(лампочек) с одинаковой задержкой в PROTEUS
Сообщение от Signalshik2
|
Вот так попробуйте.
|
Спасибо большое) сижу сейчас и пытаюсь вникнуть или понять, как работает U2:A и U3, а также сигналы, которые на них идут
|
|
|
|
09.11.2022, 16:04
|
#13
|
Прописка
Регистрация: 17.03.2015
Сообщений: 293
Сказал спасибо: 0
Сказали Спасибо 219 раз(а) в 125 сообщении(ях)
|
Re: Последовательная активация выходных сигналов(лампочек) с одинаковой задержкой в PROTEUS
Сообщение от pashamem7894
|
Вот весь текст задания:...
|
Теперь хоть что-то стало понятно - ничего сложного тут не вижу (см. pic1).
Note: Позволил себе вольность увеличить частоты в 10 раз.
|
|
|
Сказали "Спасибо" ProtAS-13
|
|
|
09.11.2022, 18:07
|
#14
|
Частый гость
Регистрация: 08.11.2022
Сообщений: 22
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от 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
|
|
|
|
17.11.2022, 14:48
|
#15
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Я исправил синтаксические ошибки в задании, неужели Вы не могли этого сделать. С преподавателем. Тэги кода надо нормально прикладывать, а не по идиотски. Форматирование кода также нужно делать. В чем вопрос?
А что такое t, n и k?
Fuze-биты на втором скриншоте: WDTON поставить Unprogrammed.
Последний раз редактировалось mike-y-k; 17.11.2022 в 16:16.
Причина: 6.6
|
|
|
|
17.11.2022, 15:32
|
#16
|
Частый гость
Регистрация: 08.11.2022
Сообщений: 22
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Последовательная активация выходных сигналов(лампочек) с одинаковой задержкой в PROTEUS
Signalshik2
Как я понял, t, n и k служат для подсчёта времени, имитируют таймеры. Сейчас уже вроде более или менее разобрался и отредактировал.
Последний раз редактировалось mike-y-k; 17.11.2022 в 16:15.
Причина: 7.15
|
|
|
|
17.11.2022, 19:32
|
#17
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Boot Loader Size: (11) 128 words - нужно установить.
Сообщение от pashamem7894
|
y7 = 1, когда количество входов четно x1-x3.
|
- как Вы понимаете вот эту фразу? Количество входов всегда нечетно и =3.
Последний раз редактировалось mike-y-k; 17.11.2022 в 20:21.
Причина: 6.6
|
|
|
|
17.11.2022, 20:49
|
#18
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,254
Сказал спасибо: 11,168
Сказали Спасибо 3,857 раз(а) в 2,928 сообщении(ях)
|
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 должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
18.11.2022, 07:42
|
#19
|
Прописка
Регистрация: 17.03.2015
Сообщений: 293
Сказал спасибо: 0
Сказали Спасибо 219 раз(а) в 125 сообщении(ях)
|
Re: Последовательная активация выходных сигналов(лампочек) с одинаковой задержкой в PROTEUS
Сообщение от pashamem7894
|
Код на С:
|
Что-то сильно перемудрили - ведь простейшее же задание.
С формированием интервалов T1...T4 вообще какая-то абракадабра.
Настроили же прерывание на интервал 0.1, так вместо того, чтобы просто посчитать до 2, 3, 7 и 11, а затем переключать формируемые таймеры - зачем то наворотили ...
Вместо того, чтобы обрабатывать один байт входного/выходного портов, зачем то завели по байту на каждый бит - отсюда лишние издержки (циклы) по преобразованию байтов в биты и обратно.
При формировании Y7 забыли про то, что все нули - четное значение, и кроме того, скобки стоило бы указать между || (как для Y5), иначе компилятор должен ругаться.
|
|
|
|
22.11.2022, 18:59
|
#20
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Что-то асмовский код вообще какой-то гонимый генерирует 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
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:18.
|
|