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

Язык СИ для микроконтроллеров


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

Добрый день, подскажите пожалуста.

pic16f84a

Как проще реализовать переключение 4х портов в виде:

0 0 0 1

0 0 1 0

0 0 1 1

0 1 0 0

0 1 0 1

. . . . . .

1 1 1 1

micro C For PIC

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

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

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

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

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

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

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

Спасибо) А есть книги примеры по микроС фор pic?

Как передать в функцию какой порт выключить?)))

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

  • 4 недели спустя...

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

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

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

Начал читать Белова "Создаем устройства на микроконтроллерах", но там используется CodeVision, а мне он не по душе:) использую Studio с установленным Toolchain. Но оказывается что в CodeVision изменено обращение к портам и тп.

Это часть кода из книги, но студия ругается что не правильно что-то...

while(PIND.0==1) {}
if(PINB.0==1)
   { PORTB.0=0}
else
   { PORTB.0=0}
while(PIND.0==0){}

Нашел проблему, но не совсем.

{ PORTB.0=0}
else
{ PORTB.0=0}

Это заменил на:

{ PORTB &= ~(1<<0); }
 else
{ PORTB|=(1<<0); }

ошибок меньше, но что делать с остальным не знаю.

На сколько понял нужно организовать сравнение, но вот как.

Программа самая простая: при нажатии на кнопку светодиод загорается, при еще одном нажатии гаснет.

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

Опять проблемы... Все тот же Белов.

Так значит теперь задача стоит такая: создать эффект бегущих огней. Просто они бегут вправо, при нажатии кнопки влево.

Вот что у меня получилось:

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
unsigned char rab; //переменная
PORTA=0b00000000;
DDRA=0b00000000;
PORTB=0b11111111;
DDRB=0b11111111;
PORTD=0b01111111;
DDRD=0b00000000;
ACSR=0x80;
while (1)
	 {
  if(!PIND & (1<<0)) // проверка кнопки
   {
		 rab = 0b10000000; // запись начального значения
   while (rab= 0)
	  {						  //сдвиг вправо		  
 PORTB = rab ^ 0b11111111; // запись с инверсией
 rab = rab >> 1;		   // сдвиг разрядов
 _delay_ms(200);
   }
  }
  else
   {					 
 rab = 0b00000001;
  while (rab != 0)
 {						 // сдвиг влево
    PORTB = rab ^ 0b11111111; // запись с инверсией
    rab = rab << 1;		   // сдвиг разрядов
    _delay_ms(200);
 }
		 }
	 }
}

Теперь два вопроса. 1) Наверно очень глупый, но я решил спросить. На схеме у светодиодов общий плюс, а как сделать так чтоб был общий минус. То есть при подключении светодиодов работало все так же.

2) Что сделать чтоб программа заработала. При запуске схемы светодиоды бегут только вправо, на кнопку не реагируют.

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

НУ на первый вопрос ответ очевиден: берем и ставим светодиоды на общий минус, а в программе инвертировать рабочее состояние, если так можно выразится.

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

Откуда Вы взяли вот это выражение ?

if(!PIND & (1<<0))

Наверное, всё-таки, нужно так:

if( !(PIND & (1<<0)) )

Или я ошибаюсь ?

И ещё, не вижу на схеме подтягивающего сопротивления. Если оно внутреннее, то проверьте, не забыли ли Вы его включить. Я в АВРах, к сожалению, нихт ферштейн )

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

Там не ошибки там CodeVision

Стоп не так понял, а что там не так? Там что-то со скобкой.

while (rab == 0)

так? Но легче все равно не стало.

И еще он warning выдает по поводу этого по моему:

#include <util/delay.h>

c:\program files\atmel\avr tools\avr toolchain\bin\../lib/gcc/avr/4.5.1/../../../../avr/include/util/delay.h:89:3: warning: #warning "F_CPU not defined for <util/delay.h>"

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

Откуда Вы взяли вот это выражение ?

if(!PIND & (1<<0))

Наверное, всё-таки, нужно так:

if( !(PIND & (1<<0)) )

...

Это я писал - не помню приоритетов выполнения операций (первым выполняется все же логическое отрицание (!), а потом - логическое "И")

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

Чтобы не путаться с приоритетами, ставьте всегда скобки. Они не только обезопасят Вас от глюков, но и придадут нормальную читабельность.

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

Что-то все равно мне все равно не помогло, код стал таким:

while (1)
	 {
if( !(PIND & (1<<0)) ) // проверка кнопки
{
		 rab = 0b10000000; // запись начального значения
while (rab==0)
	 {						 //сдвиг вправо		
 PORTB = rab ^ 0b11111111; // запись с инверсией
 rab = rab >> 1;		 // сдвиг разрядов
 _delay_ms(200);
}
}
else
 {					
 rab = 0b00000001;
 while (rab!=0)
 {					 // сдвиг влево
 PORTB = rab ^ 0b11111111; // запись с инверсией
 rab = rab << 1;		 // сдвиг разрядов
 _delay_ms(200);
 }
		 }
	 }
}

Все нормально, но при нажатии кнопки загорается светодиод только один:

rab = 0b10000000;

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

Если не равно rab то в rab записать 1?
Если rab равен нулю - записать в него 0x01.

Если бы было if(rab) , то условие срабатывало бы при любом значении rab, отличным от нуля. Соответственно, if(!rab) срабатывает при нулевом значении.

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...