Мне кажется, удобнее подобные "моргалки" делать на сдвиговых регистрах, и одним корпусом скорее всего не получится. Тактовый генератор тоже нужен, кагбе...
Мне кажется, удобнее подобные "моргалки" делать на сдвиговых регистрах, и одним корпусом скорее всего не получится. Тактовый генератор тоже нужен, кагбе...
Вот такой светофорчик делали. Не совсем правильно по таймингам с желтым, правда.
Спасибо за помощь. Реально помогли. Если не делом, то советом.
Что по итогу. Скачал, распечатал и занимаемся с сыном по посоветованной WALET книге. Медленно, но движемся. Это раз. В качестве бонуса за апгрейд, малой сел за изучение СИ и СИ++. Уже прописал в качестве задания расчёт квадратного уравнения (ч/з дискриминант и т.д. если кто подзабыл). Так что светофор будет, но попизже и немного по другому (привет UN-NS)
Караван идёт.
Ещё раз, спасибо всем.
Что б закончить вопрос -
Ниже программа, написанная сыном и видео работы его светофора. Светодиоды на панельке - PD0-PD3. Включение - общий анод на плюсе. Поэтому пришлось "переворачивать " программу. Естественно, программу малой написал с образца. Можно было проще сделать, но сделали специально так, что б понять логические операции и их работу. Я сегодня, ради интереса пол дня уложил, что б переписать эту программу без "детских" болезней. Зато и сам въехал.
ещё раз - спасибо за советы и подсказки.
#define F_CPU 1000000UL
#include <xc.h>
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
while(1)
{
int redlong = 5000;
int greenlong = 5000;
int yellow = 1000;
int redshot = 500;
int greenshot = 1000;
int pause = 500;
DDRD |= (1 << PD0);
DDRD |= (1 << PD1);
DDRD |= (1 << PD2);
PORTD &= ~(1 << PD0);
_delay_ms(redlong);
PORTD |= (1 << PD0);
_delay_ms(pause);
PORTD &= ~(1 << PD0);
_delay_ms(pause);
PORTD |= (1 << PD0);
_delay_ms(pause);
PORTD &= ~(1 << PD0);
_delay_ms(pause);
PORTD |= (1 << PD0);
_delay_ms(pause);
PORTD &= ~(1 << PD0);
_delay_ms(pause);
PORTD |= (1 << PD0);
PORTD &= ~(1 << PD1);
_delay_ms(yellow);
PORTD |= (1 << PD1);
PORTD &= ~(1 << PD2);
_delay_ms(greenlong) ;
PORTD |= (1 << PD2);
_delay_ms(pause);
PORTD &= ~(1 << PD2);
_delay_ms(pause);
PORTD |= (1 << PD2);
_delay_ms(pause);
PORTD &= ~(1 << PD2);
_delay_ms(pause);
PORTD |= (1 << PD2);
_delay_ms(pause);
PORTD &= ~(1 << PD2);
_delay_ms(pause);
PORTD |= (1 << PD2);
PORTD &= ~(1 << PD1);
_delay_ms(yellow);
PORTD |= (1 << PD1);
}
}
https://www.youtube.com/watch?v=2i4AEv9zKqs
Хорошая иллюстрация того, как не надо делать. И не надо с самого начала приучать к такому. Вся Ваша программа может иметь три строчки. Ну не три, чуть больше.. Подумайте как это сделать и Вы сделаете следующий шаг в программировании. В качестве подсказки - почитайте, что такое функции.
Последний раз редактировалось Владимир_К; 22.03.2021 в 22:43.
Ну, для начала ведь очень даже неплохо. Как прочитавший свой первый даташит два года назад, прекрасно понимаю состояние начинающих. Для примера ещё один вариант нерационального решения, его цель - показать, как макросы повышают читаемость кода, и в некоторых случаях справляются с задачами функций. Главное, чтобы не пропало желание учиться, и время оставалось.
#include <avr/io.h>
#include <util/delay.h>
#define INIT() { DDRB |= (1 << PB0 | 1 << PB1 | 1 << PB2); }
#define GREEN_LIGHT() { PORTB |= (1 << PB0); _delay_ms(3000); PORTB ^= (1 << PB0); }
#define GREEN_BLINK() { for(uint8_t i=0; i<6; i++) { PORTB ^= (1 << PB0); _delay_ms(500); } }
#define YELLOW_LIGHT() { PORTB |= (1 << PB2); _delay_ms(1000) ; PORTB ^= (1 << PB2); }
#define RED_LIGHT() { PORTB |= (1 << PB1); _delay_ms(3000); PORTB ^= (1 << PB1); }
#define REDYELL_LIGHT() { PORTB |= (1<<PB2 | 1<<PB1); _delay_ms(1000); PORTB &= ~(1<<PB2 | 1<<PB1); }
int main(void){
INIT();
while(1){
RED_LIGHT(); REDYELL_LIGHT();
GREEN_LIGHT(); GREEN_BLINK();
YELLOW_LIGHT();
}
}
Последний раз редактировалось ozforester; 23.03.2021 в 14:08.
Ну увлечение дефайнами также может быть лишним. Зачем дефайн для инициализации порта, если инициализация в данном случае делается всего один раз. Кроме того, функция может вызываться с аргументами. А может быть совсем в другом файле.
С чем полностью согласен, так с тем, что Вы, там где надо, воспользовались циклом, а не подряд несколько одинаковых строк. А дефайнить все подряд...
Да, так и написал, что код нерациональный. Просто еще один взгляд.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)