Описание: Написал код для работы в блоке питания, работает как то странно, непойму! |
| Поиск в теме | Версия для печати |
| Начинающий |
Отправлено: 09 Августа, 2025 - 13:03:59
|
Рядовой

Сообщений всего: 9
Дата рег-ции: Авг. 2025
|
Код тестирую в протеусе по упрощённой схеме, на входы вместо компараторов кнопки с фиксацией, на выходе вместо реле светодиоды. Принцип работы таков при появлении на первом входе РВ5=0 на PD0=1; PB5=0 PB4=0 > PD0=0 PD1=1; PB5=0 PB4=0 PB3=0>PD0=1 PD1=1; PB5=0 PB4=0 PB3=0 PB2=0> PD0=1 PD1=1 PD2=1;
PB5=0 PB4=0 PB3=0 PB2=0 PB1=0> PD0=1 PD1=1 PD2=0 PD3=1;
PB5=0 PB4=0 PB3=0 PB2=0 PB1=0 PB0=0> PD0=1 PD1=1 PD2=1 PD3=1;
В написаном мною коде почемуто мигают на выходе светодиоды, не могу разобратся почему, а должны гореть!
#include <asf.h>
#define F_CPU 1000000UL //Выбор частоты микроконтроллера
#include <util/delay.h> //Программа рабочая
#include <avr/io.h>
// Макросы для управления светодиодами
//Макросы вход
#define BUTTON0_PB 0 //Каждый макрос сответствует номеру порта.
#define BUTTON1_PB 1
#define BUTTON2_PB 2
#define BUTTON3_PB 3
#define BUTTON4_PB 4
#define BUTTON5_PB 5
#define BUTTON6_PB 6
#define BUTTON7_PB 7
//Макросы выход
#define LED_B_PD 0
#define LED_O_PD 1
#define LED_G_PD 2
#define LED_Y_PD 3
#define LED_R_PD 4
#define LED_V_PD 5
#define LED_P_PD 6
#define LED_W_PD 7
int main (void) {
DDRB &= ~((1<<BUTTON0_PB)|(1<<BUTTON1_PB)|(1<<BUTTON2_PB)|(1<<BUTTON3_PB)|(1<<BUTTON4_PB)|(1<<BUTTON5_PB)|(1<<BUTTON6_PB)|(1<<BUTTON7_PB)); //порт B - вход
PORTB |= ((1<<BUTTON0_PB)|(1<<BUTTON1_PB)|(1<<BUTTON2_PB)|(1<<BUTTON3_PB)|(1<<BUTTON4_PB)|(1<<BUTTON5_PB)|(1<<BUTTON6_PB)|(1<<BUTTON7_PB)); //подключаем нагрузочный резистор
DDRD |= ((1<<LED_B_PD)|(1<<LED_O_PD)|(1<<LED_G_PD)|(1<<LED_Y_PD)|(1<<LED_R_PD)|(1<<LED_V_PD)|(1<<LED_P_PD)|(1<<LED_W_PD)); //порт D - выход
PORTD &= ~((1<<LED_B_PD)|(1<<LED_O_PD)|(1<<LED_G_PD)|(1<<LED_Y_PD)|(1<<LED_R_PD)|(1<<LED_V_PD)|(1<<LED_P_PD)|(1<<LED_W_PD)); //устанавливаем 0 на выходе D
while(1)
{
if ( (PINB & 1<<BUTTON5_PB) == 0 ) { // Опрос порта.кнопки 1
PORTD |= 1<<LED_O_PD ;//Включаем первое реле при замыкании выключателя
}
else {
PORTD &= ~(1 << LED_O_PD); // Выключаем первое реле при размыкании выключателя
_delay_ms(50);
}
if( (PINB & 1<<BUTTON4_PB) == 0 ) { //Опрос порта.кнопки 2
PORTD |= 1<<LED_Y_PD; //Включаем второе реле при замыкании выключателя
PORTD &= ~(1<<LED_O_PD); //Выключаем первое реле при замыкании выключателя
}
else {
PORTD &= ~(1<<LED_Y_PD); // Выключаем второе реле при размыкании выключателя
_delay_ms(50);
}
if( (PINB & 1<<BUTTON3_PB) == 0 ) { //Опрос порта.кнопки3
PORTD |= ((1<<LED_O_PD)|(1<<LED_Y_PD)); //Включаем первое и второе реле при замыкании выключателя
}
else {
PORTD &= ~((1<<LED_B_PD)|(1>>LED_Y_PD)); //Выключаем первое и второе реле
_delay_ms(50);
}
if( (PINB & 1<<BUTTON2_PB) == 0 ) { //Опрос порта.кнопки 4
PORTD |= ((1<<LED_O_PD)|(1<<LED_Y_PD)|(1<<LED_B_PD)); //Включаем первое, второе и третье реле при замыкании выключателя
}
else {
PORTD &= ~(1<<LED_B_PD); //Выключаем третье реле
_delay_ms(50);
}
if( (PINB & 1<<BUTTON1_PB) == 0 ) { //Опрос порта.кнопки 5
PORTD |= ((1<<LED_O_PD)|(1<<LED_Y_PD)|(1<<LED_G_PD)); //Включаем первое, второе, четвёртое реле при замыкании выключателя
PORTD &= ~(1<<LED_B_PD); //Выключаем третье реле
}
else {
PORTD &= ~(1<<LED_G_PD); //Выключаем реле при размыкании выключателя
_delay_ms(50);
}
if( (PINB & 1<<BUTTON0_PB) == 0 ) { //Опрос порта.кнопки6
PORTD |= ((1<<LED_O_PD)|(1<<LED_Y_PD)|(1<<LED_G_PD)|(1<<LED_B_PD)); //Включаем первое, второе, третье, четвёртое реле при замыкании выключателя
}
else {
PORTD &= ~((1<<LED_O_PD)|(1<<LED_Y_PD)|(1<<LED_G_PD)|(1<<LED_B_PD));
_delay_ms(50);
}
}
} |
| |
|
| Начинающий |
Отправлено: 10 Августа, 2025 - 13:12:38
|
Рядовой

Сообщений всего: 9
Дата рег-ции: Авг. 2025
|
Огромное спасибо за участие, исправил ваше замечание итог тот же. Привожу исправленый код. Ниже этого приведу код который хочу попробывать вместо этого, только никак не соображу как там продлить (кнопки добавить).
#include <asf.h>
#define F_CPU 1000000UL //Выбор частоты микроконтроллера
#include <util/delay.h> //Программа рабочая
#include <avr/io.h>
// Макросы для управления светодиодами
//Макросы вход
#define BUTTON0_PB 0 //Каждый макрос сответствует номеру порта.
#define BUTTON1_PB 1
#define BUTTON2_PB 2
#define BUTTON3_PB 3
#define BUTTON4_PB 4
#define BUTTON5_PB 5
#define BUTTON6_PB 6
#define BUTTON7_PB 7
//Макросы выход
#define LED_B_PD 0
#define LED_O_PD 1
#define LED_G_PD 2
#define LED_Y_PD 3
#define LED_R_PD 4
#define LED_V_PD 5
#define LED_P_PD 6
#define LED_W_PD 7
int main (void) {
DDRB &= ~((1<<BUTTON0_PB)|(1<<BUTTON1_PB)|(1<<BUTTON2_PB)|(1<<BUTTON3_PB)|(1<<BUTTON4_PB)|(1<<BUTTON5_PB)|(1<<BUTTON6_PB)|(1<<BUTTON7_PB)); //порт B - вход
PORTB |= ((1<<BUTTON0_PB)|(1<<BUTTON1_PB)|(1<<BUTTON2_PB)|(1<<BUTTON3_PB)|(1<<BUTTON4_PB)|(1<<BUTTON5_PB)|(1<<BUTTON6_PB)|(1<<BUTTON7_PB)); //подключаем нагрузочный резистор
DDRD |= ((1<<LED_B_PD)|(1<<LED_O_PD)|(1<<LED_G_PD)|(1<<LED_Y_PD)|(1<<LED_R_PD)|(1<<LED_V_PD)|(1<<LED_P_PD)|(1<<LED_W_PD)); //порт D - выход
PORTD &= ~((1<<LED_B_PD)|(1<<LED_O_PD)|(1<<LED_G_PD)|(1<<LED_Y_PD)|(1<<LED_R_PD)|(1<<LED_V_PD)|(1<<LED_P_PD)|(1<<LED_W_PD)); //устанавливаем 0 на выходе D
while(1)
{
if ((PINB& (1 << BUTTON5_PB)) == 0 ) { // Опрос порта.кнопки 1
PORTD |= 1 << LED_O_PD ;//Включаем первое реле при замыкании выключателя
_delay_ms(50);
}
else {
PORTD &= ~(1 << LED_O_PD); // Выключаем первое реле при размыкании выключателя
_delay_ms(50);
}
if((PINB& (1 << BUTTON4_PB)) == 0 ) { //Опрос порта.кнопки 2
PORTD |= 1 << LED_Y_PD; //Включаем второе реле при замыкании выключателя
PORTD &= ~(1 << LED_O_PD); //Выключаем первое реле при замыкании выключателя
_delay_ms(50);
}
else {
PORTD &= ~(1 << LED_Y_PD); // Выключаем второе реле при размыкании выключателя
_delay_ms(50);
}
if((PINB& (1 << BUTTON3_PB)) == 0 ) { //Опрос порта.кнопки3
PORTD |= ((1 << LED_O_PD)|(1 << LED_Y_PD)); //Включаем первое и второе реле при замыкании выключателя
_delay_ms(50);
}
else {
PORTD &= ~((1 << LED_O_PD)|(1 << LED_Y_PD)); //Выключаем первое и второе реле
_delay_ms(50);
}
if((PINB& (1 << BUTTON2_PB)) == 0 ) { //Опрос порта.кнопки 4
PORTD |= (( 1<< LED_O_PD)|(1 << LED_Y_PD)|(1 << LED_B_PD)); //Включаем первое, второе и третье реле при замыкании выключателя
_delay_ms(50);
}
else {
PORTD &= ~((1 << LED_B_PD)|( 1<< LED_O_PD)|(1 << LED_Y_PD)); //Выключаем третье реле
_delay_ms(50);
}
if((PINB& (1 << BUTTON1_PB)) == 0 ) { //Опрос порта.кнопки 5
PORTD |= ((1 << LED_O_PD)|(1 << LED_Y_PD)|(1 << LED_G_PD)); //Включаем первое, второе, четвёртое реле при замыкании выключателя
PORTD &= ~(1 << LED_B_PD); //Выключаем третье реле
_delay_ms(50);
}
else {
PORTD &= ~((1<<LED_G_PD)|(1 << LED_O_PD)|(1 << LED_Y_PD)); //Выключаем реле при размыкании выключателя
_delay_ms(50);
}
if((PINB& (1 << BUTTON0_PB)) == 0 ) { //Опрос порта.кнопки6
PORTD |= ((1 << LED_O_PD)|(1 << LED_Y_PD)|(1 << LED_G_PD)|(1 << LED_B_PD)); //Включаем первое, второе, третье, четвёртое реле при замыкании выключателя
_delay_ms(50);
}
else {
PORTD &= ~((1 << LED_O_PD)|(1 << LED_Y_PD)|(1 << LED_G_PD)|(1 << LED_B_PD));
_delay_ms(50);
}
}
}
Этот код более лучше в плане задержки, вот только не соображу как продлить его в моём случае.
#define F_CPU 1000000UL //Выбираем частоту микроконтроллера
#include <avr/io.h> // подключение параметров микроконтроллера из библиотеки
#include <util/delay.h> //Включаем функцию задержек
int main (void)
{//Нало основной программы
unsigned char butcount =0;
DDRB = 0b00000000; //Устанавливаем вывод порта на вход
PORTB = 0b11111111;
DDRD = 0b11111111;//Устанавливаем вывод порта на выход
PORTD = 0b00000000;
while(1)
{
if (!(PINB&0b00000010)) //Начало цикла
{
if (butcount <5)
{
butcount ++;
}
else
{
PORTD = 0b00000001;
}
}
else
{
if (butcount >0)
{
butcount --;
}
else
{
PORTD = 0b00000000;
}
}
}
}
Будте добры подсказать что лучше и что делать дальше. Просто я с этим блоком питания вожусь уже 2 год из за этого! |
| |
|
| Начинающий |
Отправлено: 28 Августа, 2025 - 08:09:23
|
Рядовой

Сообщений всего: 9
Дата рег-ции: Авг. 2025
|
Я согласен вот попытка соеденить код в нем не работают две кнопки PB5 PB4, PC0 ...PC5 работают. Как сделать так чтобы PB5 PB4заработали. Если вы специалист то помогите а если поприкалываться то спасибо, и не надо советовать применить два микроконтроллера.
Атмега 8
#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
// Прототип функции
// void update_leds(void);
// Определяем пины для кнопок и светодиодов
#define BUTTON1_PIN PC5 // Кнопка 1 на порту B, пин 0
#define BUTTON2_PIN PC4 // Кнопка 2 на порту B, пин 1
#define BUTTON3_PIN PC3 // Кнопка 3 на порту B, пин 1
#define BUTTON4_PIN PC2 // Кнопка 4 на порту B, пин 1
#define BUTTON5_PIN PC1 // Кнопка 5 на порту B, пин 1
#define BUTTON6_PIN PC0 // Кнопка 6 на порту B, пин 1
#define BUTTON_UP_PIN PB5 // Кнопка увеличения +
#define BUTTON_DOWN_PIN PB4 // Кнопка уменьшения -
#define LED1_PIN PD0 // Светодиод 1 на порту D, пин 0
#define LED2_PIN PD1 // Светодиод 2 на порту D, пин 1
#define LED3_PIN PD2 // Светодиод 3 на порту D, пин 2
#define LED4_PIN PD3 // Светодиод 4 на порту D, пин 3
#define LED_PD4 PD4 // Светодиод 4 на порту D
#define LED_PD5 PD5 // Светодиод 5 на порту D
#define LED_PD6 PD6 // Светодиод 6 на порту D
#define LED_PD7 PD7 // Светодиод 7 на порту D
// Состояние светодиодов PD4-PD7
uint8_t state = 0; // Начальное состояние (все выключены)
uint8_t last_buttons = 0;
// Функция обновления светодиодов
void update_leds(void) {
PORTD = 0x00; // Очищаем все биты
switch(state) {
case 0: break;
case 1: PORTD |= (1 << LED_PD5); break;
case 2: PORTD |= (1 << LED_PD6); break;
case 3: PORTD |= ((1 << LED_PD6) | (1 << LED_PD5)); break;
case 4: PORTD |= ((1 << LED_PD4) | (1 << LED_PD6) | (1 << LED_PD5)); break;
case 5: PORTD |= ((1 << LED_PD7) | (1 << LED_PD6) | (1 << LED_PD5)); break;
case 6: PORTD |= ((1 << LED_PD4) | (1 << LED_PD5) | (1 << LED_PD6) | (1 << LED_PD7)); break;
}
}
int main(void)
{
// Настройка портов
DDRC &= ~(_BV(BUTTON1_PIN) | _BV(BUTTON2_PIN) | _BV(BUTTON3_PIN) | _BV(BUTTON4_PIN) | _BV(BUTTON5_PIN) | _BV(BUTTON6_PIN)); // Входы для кнопок
PORTC |= _BV(BUTTON1_PIN) | _BV(BUTTON2_PIN) | _BV(BUTTON3_PIN) | _BV(BUTTON4_PIN) | _BV(BUTTON5_PIN) | _BV(BUTTON6_PIN); // Подтягивающие резисторы
DDRD |= (_BV(LED1_PIN) | _BV(LED2_PIN) | _BV(LED3_PIN) | _BV(LED4_PIN) | (1 << LED_PD4) | (1 << LED_PD5) | (1 << LED_PD6) | (1 << LED_PD7)); // Выходы для светодиодов
// DDRD |= _BV(LED_UP_PIN) | _BV(LED_DOWN_PIN) | _BV(LED_LEFT_PIN) | _BV(LED_RIGHT_PIN); // Выходы для новых светодиодов
DDRB &= ~((1 << BUTTON_UP_PIN) | (1 << BUTTON_DOWN_PIN)); // Входы для кнопок
PORTB |= (1 << BUTTON_UP_PIN) | (1 << BUTTON_DOWN_PIN); // Подтягивающие резисторы
while(1)
это начало.
(Добавление)
Я согласен вот попытка соеденить код в нем не работают две кнопки PB5 PB4, PC0 ...PC5 работают. Как сделать так чтобы PB5 PB4заработали. Если вы специалист то помогите а если поприкалываться то спасибо, и не надо советовать применить два микроконтроллера.
Это вторая часть
{
// Считываем состояние кнопок
uint8_t button1 = (PINC & _BV(BUTTON1_PIN)) == 0; // 1 если нажата
uint8_t button2 = (PINC & _BV(BUTTON2_PIN)) == 0; // 1 если нажата
uint8_t button3 = (PINC & _BV(BUTTON3_PIN)) == 0; // 1 если нажата
uint8_t button4 = (PINC & _BV(BUTTON4_PIN)) == 0; // 1 если нажата
uint8_t button5 = (PINC & _BV(BUTTON5_PIN)) == 0; // 1 если нажата
uint8_t button6 = (PINC & _BV(BUTTON6_PIN)) == 0; // 1 если нажата
// uint8_t buttons = (PINB & ((1 << BUTTON_UP_PIN) | (1 << BUTTON_DOWN_PIN)));
uint8_t buttons = PINB;
// Обработка кнопки увеличения
if ((buttons & (1 << BUTTON_UP_PIN)) == 0) {
if ((last_buttons & (1 << BUTTON_UP_PIN)) != 0) {
state = (state + 1) % 7;
// update_leds();
}
}
// Обработка кнопки уменьшения
if ((buttons & (1 << BUTTON_DOWN_PIN)) == 0) {
if ((last_buttons & (1 << BUTTON_DOWN_PIN)) != 0) {
state = (state == 0) ? 6 : state - 1;
// update_leds();
}
}
last_buttons = buttons;
// Обработка комбинаций основных кнопок
if (button1 && !button2 && !button3 && !button4 && !button5 && !button6) {
// Нажата только кнопка 1
PORTD = (1 << LED1_PIN);
}
else if (button1 && button2 && !button3 && !button4 && !button5 && !button6) {
// Нажаты кнопки 1 и 2
PORTD = (1 << LED2_PIN);
}
else if (button1 && button2 && button3 && !button4 && !button5 && !button6) {
// Нажаты кнопки 1-3
PORTD = (1 << LED1_PIN) | (1 << LED2_PIN);
}
else if (button1 && button2 && button3 && button4 && !button5 && !button6) {
// Нажаты кнопки 1-4
PORTD = (1 << LED1_PIN) | (1 << LED2_PIN) | (1 << LED3_PIN);
}
else if (button1 && button2 && button3 && button4 && button5 && !button6) {
// Нажаты кнопки 1-5
PORTD = (1 << LED1_PIN) | (1 << LED2_PIN) | (1 << LED4_PIN);
}
else if (button1 && button2 && button3 && button4 && button5 && button6) {
// Нажаты все кнопки
PORTD = (1 << LED1_PIN) | (1 << LED2_PIN) | (1 << LED3_PIN) | (1 << LED4_PIN);
}
else {
// Нет нажатых кнопок
PORTD = 0;
}
_delay_ms(20); // Дебаунс задержка
}
return 0;
} |
| |
|
|
| Поиск в теме | Версия для печати |
| Страниц (2): [1] 2 » |
| « Программирование микроконтроллеров » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
  |
|
|
|