роботы робототехника микроконтроллеры


 Страниц (1): [1]   

> Описание: Программирование портов микроконтроллера AVR с помощью GCC
Hansndndnnd Post Id


Рядовой


Сообщений всего: 1
Дата рег-ции: Февр. 2025  



Всем приветик! Занимаюсь написанием лазертака на асемблере, возникла такая проблема, необходимо написать код на единице управления, сделал кодик но в схеме протеуса начинает сама по себе работать в произвольном режиме, хотя должна работать при нажатии на кнопку, у меня кнопка выполняет функцию как фотодиод.
Ломаю голову не понимаю как правильно сделать в коде, при 0 управления все хорошо, когда ставлю единицу управления работает в произвольном режиме, кто знает как исправить данную проблему если не трудно то помогите, сам код и что в протеусе прикреплю ниже. Заранее спасибо огромное!!) рёв в три ручья Замешательство

#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>

// Глобальная переменная для хранения текущего индекса массива
int a = 0;

// Массив значений для вывода на PORTB
int dd[10] = {
0b00000000, 0b00000001, 0b00010010, 0b00010011, 0b00100100,
0b00100101, 0b00110110, 0b00110111, 0b01001000, 0b01001001,
};

int main(void) {
// Настройка PORTC как вход (0x00)
DDRC = 0x00;
// Настройка PORTB как выход (0xff)
DDRB = 0xff;
// Настройка PORTD как выход (0xff) для управления единицей асамбер
DDRD = 0xff;
// Включение подтягивающего резистора на PINC0
PORTC = 0b00000001;

while (1) {
// Вывод значения из массива dd на PORTB
PORTB = dd[a];

// Проверка нажатия кнопки на PINC0
if (0!= (PINC & (1 << 0))) {
// Увеличение индекса массива
a++;
// Задержка для избежания дребезга контактов
_delay_ms(1000);
// Сброс индекса, если он выходит за границы массива
if (a > 9) a = 0;
}

// Управление выводами PORTC в зависимости от значения a
if (a < 5) {
PORTC &= ~(1 << 2); // Выключение PC2
PORTC |= (1 << 3); // Включение PC3
PORTD |= (1 << 0); // Включение PD0 (управление единицей асамбер)
}
if (a > 4 && a <= 8) {
PORTC &= ~(1 << 3); // Выключение PC3
PORTC |= (1 << 1); // Включение PC1
PORTD &= ~(1 << 0); // Выключение PD0
}
if (a > 8) {
PORTC |= (1 << 2); // Включение PC2
PORTC &= ~(1 << 1); // Выключение PC1
PORTD |= (1 << 1); // Включение PD1 (возможно, другое управление асамбером)
}
}
}
(Добавление)
не получается прикрепить схему(
 
 Top
Admin Администратор Post Id


Администратор


Сообщений всего: 901
Дата рег-ции: Май 2006  



Код для микроконтроллера AVR написан на AVR GCC

Обратите внимание на следующую строчку:

CODE:
// Включение подтягивающего резистора на PINC0
PORTC = 0b00000001;


то есть при отсутствии нажатия на кнопке на PINC0 будет высокий уровень.

Далее в коде идёт следующее условие

CODE:
// Проверка нажатия кнопки на PINC0
if (0!= (PINC & (1 << 0))) {


PINC — это регистр состояния порта C в микроконтроллере AVR. Он содержит значения, полученные с выводов порта C. Каждый бит в регистре соответствует состоянию одного пина (вывода) на порту C. Например, бит 0 в PINC будет отображать состояние первого пина порта C (PC0).

(1 << 0) — это побитовая операция сдвига, которая сдвигает единицу на 0 позиций, то есть создает маску, в которой установлен только первый бит: 00000001 (бит 0 равен 1, остальные равны 0).

PINC & (1 << 0) — это побитовая операция И между содержимым регистра PINC и маской, где установлен только первый бит. Результат будет зависеть от состояния пина PC0:

Если PC0 высокий (логическая 1), то результат будет ненулевым значением (например, 1).
Если PC0 низкий (логическая 0), то результат будет 0.
if (0 != ...) — это условие проверяет, является ли результат выражения (PINC & (1 << 0)) ненулевым (то есть, если пин PC0 находится в высоком состоянии). Если да, то условие выполняется, и код внутри блока if будет выполнен.

Таким образом, выражение if (0 != (PINC & (1 << 0))) проверяет, находится ли пин PC0 в логическом высоком состоянии. Если PC0 равен 1, то условие будет истинным, и код внутри if выполнится. Если PC0 равен 0, условие не выполнится.

То есть, похоже, каждую секунду происходит увеличение значения счетчика
a++
в программе
 
 Top
Страниц (1): [1]
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru