Перейти к содержанию

Работа С Портами.


Рекомендуемые сообщения

Здравствуйте. столкнулся с такой проблемой. На вид всё очень просто, но не работает. Хочу просто включить светодиод с помощью кнопки. пишу код:

#include <avr/io.h>
#include <util/delay.h>
int main()
{
DDRB = 0b00000001;

while(1)
{
if(PINB1==0 ){
PORTB= 0b00000011;
} else
{
PORTB= 0b00000010;
}
}
}

Но почему то он не работает, помогите пожалуйста новичку.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

if(PINB1==0 ){
if(1 == 0){
Чего вы хотели этим добиться?

Ну и схему бы поглядеть.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

if(PINB1==0 ){
if(1 == 0){
Чего вы хотели этим добиться?

А вдруг? Наступит конец Света и тут оно сработает. Еще ангелы не протрубят, а владелец устройства с этой прошивкой уже будет знать, что пора грехи замаливать.
Ссылка на комментарий
Поделиться на другие сайты

Переходите на CodeVision.

Лучше пускай обычный Си учит, чем несовместимые с ним диалекты. А еще лучше - ассемблер, там это делается еще проще - sbis PINB,1

На Си запись немного длиннее if( PINB & (1<<1) ){

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Xt

if(PINB1==0 ){
if(1 == 0){
Чего вы хотели этим добиться?

Ну и схему бы поглядеть.

Схему прикрепил, но что то её не видно А хотел я через PIN считать состояние порта PB1 и в зависимости от этого включать или выключать светодиода..

post-95730-0-17747800-1458822264.jpg

Ссылка на комментарий
Поделиться на другие сайты

Стоило включить подтяжку PB1 к питанию до начала цикла, иначе при первом проходе нельзя будет предсказать поведение. Еще лучше подтянуть внешним резистором.

Вопрос, зачем вы сравниваете PINB1 (который, как известно, равен 1, также как PINB2 равен 2, PINB5 - 5 и т.д.) с нулем, был намеком вам исправить условие на более осмысленное.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

C портами вроде немного разобрался. Нашёл в интернете код для семисегментного индикатора который просто считал. Немного изменил и получился счётчик. Добавил светодиод и теперь при достижении 0000 срабатывает светодиод. Но! есть переменная

volatile unsigned int test = 111; // Переменная для вывода на индикатор

которая задаёт начальное значения с которого начинается отчёт. Так вот, нашёл много исходных кодов опроса матричной клавиатуры, но никак не пойму как её прикрутить к коду счётчика. Как я понимаю если я набираю 99 или 123, то эти значении должны вписаться в какую то переменную откуда будут переданы в test? Что то типа test=(значения введённые с клавиатуры). Подскажите пожалуйста в какую сторону копать??

//#define F_CPU 7372800UL // Частота кварца
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile unsigned int test = 111; // Переменная для вывода на индикатор
ISR(INT0_vect) // Обработчик прерывания по совпадению таймера 1
{
test--;
// Увеличить выводимое число
if(test > 9999) test = 0; // Если вышел за пределы четырех разрядов, обнулить
TCNT1H=0x00; // Сброс регистра
TCNT1L=0x00; // счета
}
void dig_out(int num); // Объявление функции вывода на индикатор
int main(void)
{
DDRB=0x01;
PORTB=0x01;
DDRA=0xFF;
DDRC = 0x0F; // Настройка портов
//PORTA = 0x00;
DDRD = 0x00; // для работы с индикатором Порт С для разрядов, Порт D для цифр
PORTD=0x04;
//TCCR1A=0x00; // Настройка таймера
//TCCR1B=0x04;
//инициализация прерывания
GICR |= 0x40;//0x40 = 0b01000000 разрешить прерывания на int0
MCUCR |= 0x3;//0x3 = 0b00000011 прерывания по фронту int0
sei();//разрешить все прерывания, cli()- запретить

//TCNT1H=0x00;
//TCNT1L=0x00;
//OCR1AH=0x70;
//OCR1AL=0x80;
//TIMSK=0x10;

sei(); // Разрешение прерываний

while(1)
{
dig_out(test); //Постоянно вызываем функцию вывода текущего числа
}
}
void dig_out(int num) // Функция для вывода на индикатор 4-х разрядов
{
unsigned char i = 0; // Переменная счетчика
unsigned char raz = 1; // Номер разряда
unsigned char dig_num[] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; // Коды цифр для индикатора с общим анодом
unsigned char dig[] = {0, 0, 0, 0}; // Массив для значения разряда

if(num < 10) // Для заполнения нулями левых разрядов
{
dig[0] =0;
dig[1] =0;
dig[2] =0;
}

if(num < 100) // Для заполнения нулями левых разрядов
{
dig[0] =0;
dig[1] =0;
}

if(num < 1000) // Для заполнения нулями левых разрядов
{
dig[0] =0;
}

while(num > 999) // Получение количества тысяч
{
dig[0]++;
num -= 1000;
}

while(num > 99) // Получение количества сотен
{
dig[1]++;
num -= 100;
}

while(num > 9) // Получение числа десятков
{
dig[2]++;
num -= 10;
}

dig[3] = num; // Получения количества единиц

while(raz <= 0x10) // Крутимся пока не заполним все 4 разряда
{
PORTC = raz; // Выбираем разряд
PORTA = dig_num[dig[i]]; // Выводим цифру
raz = raz<<1; // Сдвигаемся на следующий разряд
i++; // Увеличиваем индекс следующей цифры
if(dig[0]==0&&dig[1]==0&&dig[2]==0&&dig[3]==0){PORTB=0x00;}
_delay_ms(1); // Задержка 1 мс
}
}

post-95730-0-08476300-1459095747_thumb.jpg

Изменено пользователем Azerhud
Ссылка на комментарий
Поделиться на другие сайты

Точнее, [spоilеr]текст[/spоilеr]

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...