http://www.cqham.ru/forum/showthread...Si5340A/page15
147 пост. Можете посмотреть. Хотя, профессионалы и в моей программе нашли бы десятки замечаний.
http://www.cqham.ru/forum/showthread...Si5340A/page15
147 пост. Можете посмотреть. Хотя, профессионалы и в моей программе нашли бы десятки замечаний.
Спасибо от ewgen75
Друзья, всё вы правильно говорите. Но мы (папа и сын) на той неделе в первый раз в жизни взяли в руки МК и программатор, и стали разбираться. Речь ведь не идёт о законченном изделии. "Светофор" - это практическое задание, на котором мы разбираемся, что и как. Выше - код который написал сын с образца за сорок минут. А здесь, например - мой код, с записью числа, битовой маской и логическими операциями, который я написал за 4 часа... За то въехал. Жевал каждую строчку, раз 50 перешивал МК - написал, посмотрел, переписал, посмотрел и "for(uint8_t i=0; i<50; i++" :-) пока не заработало. Кстати, это самая ценная подсказка на данный момент по организации конечного цикла. Перепишу свой код с такой организацией цикла, посмотрим что получится. Просьба не подсказывать!
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
while(1)
{
int redlong = 5000;
int greenlong = 5000;
int yellow = 1500;
int redshot = 1000;
int greenshot = 1000;
int pause = 500;
DDRD |= (1 << PD0);
DDRD |= (1 << PD1);
DDRD |= (1 << PD2);
DDRD |= (1 << PD3);
PORTD = PORTD | 3 | (1 << 3);
_delay_ms(greenlong) ;
PORTD |= (1 << 2);
_delay_ms(pause);
PORTD = PORTD & ~(1 << 2);
_delay_ms(greenshot) ;
PORTD |= (1 << 2);
_delay_ms(pause);
PORTD = PORTD & ~(1 << 2);
_delay_ms(greenshot) ;
PORTD |= (1 << 2);
_delay_ms(pause);
PORTD = PORTD & ~(1 << 2);
_delay_ms(greenshot) ;
PORTD |= (1 << 2);
PORTD &= ~(1 << PD1);
_delay_ms(yellow);
PORTD |= (1 << PD1);
//PORTD = ~PORTD;
PORTD = ~1;
_delay_ms(redlong);
PORTD = PORTD | 7 | (1 << 3);
_delay_ms(pause);
PORTD = ~1;
_delay_ms(redshot);
PORTD = PORTD | 7 | (1 << 3);
_delay_ms(pause);
PORTD = ~1;
_delay_ms(redshot);
PORTD = PORTD | 7 | (1 << 3);
_delay_ms(pause);
PORTD = ~1;
_delay_ms(redshot);
PORTD = PORTD | 7 | (1 << 3);
PORTD &= ~(1 << PD1);
_delay_ms(yellow);
PORTD |= (1 << PD1);
PORTD = ~PORTD;
}
}
Вижу, с самого начала, стараетесь, чтобы не только другим, но и самому, через день, ничего не понятно было. Пишите хотя бы комментарии к строкам.
У меня вопрос, откуда вы такие примеры (образцы) берете?
Скачайте книжку, например - Шпак Ю.А. " Программирование на языке С для AVR и PIC микроконтроллеров ". Немного устарела книжка, но в основном нормально.
Владимир да - сложно, не рационально... Но я столько не "светофор" писал, сколько разбирался с применёнными в итоге операциями. А правильно по итогу работающий светофор, это как доказательство, что понял и правильно использовал. Следующие шаги, по мере вкуривания - делаем правильнее и рациональнее.
Насчёт примеров, малой свой код писал по этой подсказке:
https://ph0en1x.net/80-simple-progra...-language.html
Я всегда читаю комментарии. "Учитель" обосновал свою точку зрения. Я с ним согласился. Всё разжёвано по пальцам. Повторюсь, первичным было разобраться с логическими операциями, и потом уже на чём нибудь отработать. И это "что нибудь" в данный момент лежит на столе, перед клавой и моргает мне своими тремя диодиками. Я доволен.
Переписали код по выше приведённому примеру. В следующий раз выразим ч/з функции.
Активизация вывода PD3 сделана для увеличения наглядности при отладке . А так, он не нужен.
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#define port(){DDRD |= (1 << PD0); DDRD |= (1 << PD1); DDRD |= (1 << PD2); DDRD |= (1 << PD3); }
#define greenlong(){ PORTD = PORTD | 3 | (1 << 3); _delay_ms(5000); }
#define greenshot(){ for(uint8_t i=0; i<3; i++) {PORTD |= (1 << 2); _delay_ms(300);PORTD = PORTD & ~(1 << 2);_delay_ms(500);PO RTD |= (1 << 2); } }
#define yellow(){ PORTD &= ~(1 << PD1);_delay_ms(1000) ;PORTD |= (1 << PD1); PORTD = ~PORTD; }
#define red(){ PORTD = ~1; _delay_ms(5000); }
#define redshot(){ for(uint8_t u=0; u<3; u++) {PORTD = PORTD | 7 | (1 << 3); _delay_ms(500); PORTD = ~1; _delay_ms(300);PORTD = PORTD | 7 | (1 << 3); } }
int main(void)
{
port();
while(1){
greenlong(); greenshot(); yellow(); red(); redshot(); yellow(); }
}
Здравствуйте. Хотели по другому переписать код, через функции, с заданием цикла с изменяемой переменной. Но не запускается цикл по переменной i. Работа начинается не с i=0, а сразу с i=2, отрабатывается по кругу цикл: горит 3с PD2 - моргает 3 раза PD2 - горит 2с PD1. Нет такого же цикла с PD0. Самостоятельно найти ошибку не получается. Ниже код программы. Help...
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#define port(){DDRD |= (1 << PD0); DDRD |= (1 << PD1); DDRD |= (1 << PD2); DDRD |= (1 << PD3); }
#define io() { uint8_t i=0; i<4;i+2;}
#define f1() {PORTD &= ~_BV(io()); _delay_ms(3000);} //горит 3 сек.
#define f2() { for(uint8_t n=0; n<3; n++){PORTD |= _BV(io());_delay_ms( 500);PORTD &= ~_BV(io()); _delay_ms(500); PORTD |= _BV(io());}; } //моргнуть 3 раза по 0,5 сек
#define f3() { PORTD &= ~_BV(1); _delay_ms(2000); PORTD |= _BV(1);} // горит 2 сек.
int main(void){
port();
PORTD = 0x0F;
io();
while(1){
f1();f2();f3();};
}
Вот программа, два светодиода, сначала один включается, моргает три раза, потом второй. Тут конечно алгоритм не тот что нужно, просто нет времени писать. Для образца. Подставьте свои значения. Тут пионеру понятно. В Вашей программе, я хоть и имею какой-то опыт, но ни хрена не могу понять, что и как. Забудьте Вы свои дефайны...
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
/**************** Инициализация порта ******************** ******/
void initialization(void)
{
DDRD=0x0F; // Выводы порта 0-3 - выход, остальные вход.
PORTD=0x00;
}
/**************** Управление светодиодом ******************** ******/
void LCD_init(unsigned char y)
{
if (y==0)
{unsigned char i;
for (i = 0; i < 3; i++)
PORTD |=_BV(PD0); //Зажигаем
_delay_ms(3000); // Пауза
PORTD &=~(_BV(PD0)); //Гасим
}
else if (y==1)
{
unsigned char t;
for (t = 0; t < 3; t++)
PORTD |=_BV(PD1); //Зажигаем светодиод 1
_delay_ms(3000); // Пауза
PORTD &=~(_BV(PD1)); //Гасим
_delay_ms(3000); // Пауза
}
}
/**************** Главная функция ******************** ******/
int main(void)
{
initialization(); //Вызов функции инициализации порта D
while (1) //Бесконечный цикл
{
LCD_init(0); // вызов функции управления светодиодами. В скобках параметр, который передается в функцию
// В зависимости от параметра управляется светодиод нулевой или первый.
_delay_ms(30); // Пауза
LCD_init(1); // вызов функции управления светодиодами. В скобках параметр, который передается в функцию
// В зависимости от параметра управляется светодиод нулевой или первый.
}
}
Последний раз редактировалось Владимир_К; 12.04.2021 в 20:32.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)