Обсуждаем контроллеры компании Atmel.
Ответить

Не могу нормально зажечь светодиод

Вт июл 04, 2017 10:19:19

Хочу написать программу, что при нажатии кнопки, светодиод начинает мигать, но проверив в протеусе программу, работает неправльно. Почему-то в протеусе мигает PB0, хотя должно мигать PB1, типо при нажатии кнопки которая подключается к ПБ0, у меня ПБ1 должна мигать, но этого не происходит, где ошибочка то.
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{

PORTB = 0x02;
DDRB = 0x01;


/* Replace with your application code */
while (1)
{
if (PORTB = (0 == PB0))
{
PORTB = (1 == PB1);
_delay_ms(100);
PORTB = (0 ==PB1);
_delay_ms(1000);
}

}
}

Re: Не могу нормально зажечь светодиод

Вт июл 04, 2017 11:04:11

PORTB = 0x02;
DDRB = 0x01;
такая навтройка порта делает выходом пин 0 порта B, а все остальные входами, а на пин 1 этого же порта делает подтяжку...
если хотите разобраться — выкладывайте код с комментариями, хоть ход мысли проследим и подскажем когда она пошла не туда.

Re: Не могу нормально зажечь светодиод

Вт июл 04, 2017 11:23:43

narius985 писал(а):if (PORTB = (0 == PB0))
narius985 писал(а):PORTB = (1 == PB1);
narius985 писал(а):PORTB = (0 ==PB1);
я думаю, вам прежде следует хотя бы бегло ознакомиться с основами языка Си, прежде чем начинать что-то писать на нём.

Re: Не могу нормально зажечь светодиод

Вт июл 04, 2017 11:39:42

я на это и вывожу :) только хочу чтоб он сам на это вышел

Re: Не могу нормально зажечь светодиод

Чт июл 06, 2017 05:01:28

Такая вот тема, если я напишу эту программу для одной кнопки, то всё рабоает, а если для двух, то почему-то при нажати, светодиод не горит, а мигает, кто-нибудь мне скажает почему. программа для атмеги8.
/*
* GccApplication5.c
*
* Created: 03.07.2017 14:05:22
* Author : PC
*/
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{

DDRD = 0x01;// ДЕЛАЮ ПД0 НА ВЫХОД
PORTD= 0b11000000; //ДЕЛАЮ ТАК ЧТО БЫ НА ПД7 и ПД 6 БЫЛА ЕДИНИЦА, ТИПО ЧТОБ КОГДА КНОПКА НЕ НАЖИМАЛАСЬ ЧТО СВЕТИК НЕ ГОРЕЛ



/* Replace with your application code */
while (1)
{
if (!(PIND&0b10000000)) //СЧИТЫВАНИЕ С ПД7
{
PORTD =0x01;//ЕСЛИ В ПБ7 СТОИТ 1, ТО В ПБ0 БУДЕТ 0, СЛЕДОВАТЕЛЬНО НИЧЁ ГОРЕТЬ НЕ БУДЕТ
}
else
{
PORTD = 0x00; // НУ ИНАЧЕ. ЕСЛИ БУДЕТ ПОДАН НУЛЬ. ТО В ПБ7 БУДЕТ ИДТИ 1, И СВЕТИК ЗАГОРИТСЯ.
}



if (!(PIND&0b01000000)) //СЧИТЫВАНИЕ С ПД6
{
PORTD =0x02;//ЕСЛИ В ПБ6 СТОИТ 1, ТО В ПБ0 БУДЕТ 0, СЛЕДОВАТЕЛЬНО НИЧЁ ГОРЕТЬ НЕ БУДЕТ
}
else
{
PORTD = 0x00; // НУ ИНАЧЕ. ЕСЛИ БУДЕТ ПОДАН НУЛЬ. ТО В ПБ6 БУДЕТ ИДТИ 1, И СВЕТИК ЗАГОРИТСЯ.
}

}
}

Re: Не могу нормально зажечь светодиод

Чт июл 06, 2017 16:42:18

narius985 писал(а):PORTD =0x02;//ЕСЛИ В ПБ6 СТОИТ 1, ТО В ПБ0 БУДЕТ 0, СЛЕДОВАТЕЛЬНО НИЧЁ ГОРЕТЬ НЕ БУДЕТ
С какой целью присвоено именно это значение? Кроме того Вы выключаете подтяжку.

Магические цифры- зло.
Неверные комментарии - не меньшее зло.

Re: Не могу нормально зажечь светодиод

Чт июл 06, 2017 17:16:55

пиши: PORTD = (1<<7); //подаем 1 на 7ю ногу порта D. но все остальные ноги порта обнулятся :(
тогда: PORTD|=(1<<7); //подаём 1 на 7ю ногу порта, не стирая состояния остальных ног
а стирать: PORTD&=~(1<<7); // подаём 0 на ногу 7 порта не трогая остальных
П.С.: в учебниках практически в самом начале знаки "|", "&", "~", "<<" описаны.

Re: Не могу нормально зажечь светодиод

Пт июл 07, 2017 09:31:09

пиши: PORTD = (1<<7); //подаем 1 на 7ю ногу порта D. но все остальные ноги порта обнулятся :(
тогда: PORTD|=(1<<7); //подаём 1 на 7ю ногу порта, не стирая состояния остальных ног
а стирать: PORTD&=~(1<<7); // подаём 0 на ногу 7 порта не трогая остальных
П.С.: в учебниках практически в самом начале знаки "|", "&", "~", "<<" описаны.

чувак, вроде сделал как ты сказала, всё равно каша, где ошибка то, сейчас у меня 2 и 4 , это светодиоды, а 1 и 3 там кнопки.
*/
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>
//----------—

//----------—
int main(void)
{


DDRD = 0b00001010;//
PORTD= 0b00000101; //Д



/* Replace with your application code */
while (1)
{
if (!(PIND = 0x01))
{
PORTD |= (1«2);
}
else
{
PORTD = ~(1«2);
}
if (!(PIND = 0b00000100))
{
PORTD |= (1«4);
}
else
{
PORTD = ~(1«4);
}
}
}

Re: Не могу нормально зажечь светодиод

Пт июл 07, 2017 21:25:14

if (!(PIND = 0x01))
Присвоение в условии? Странно что компилятор не ругается warning'ами.

Re: Не могу нормально зажечь светодиод

Сб июл 08, 2017 09:05:32

COKPOWEHEU писал(а):Присвоение в условии?
дык было давно сказано
ARV писал(а):прежде следует хотя бы бегло ознакомиться с основами языка Си, прежде чем начинать что-то писать на нём
кто б слушал...
COKPOWEHEU писал(а):Странно что компилятор не ругается warning'ами
кто б ещё их читал...

Re: Не могу нормально зажечь светодиод

Сб июл 08, 2017 13:11:27

COKPOWEHEU писал(а):Присвоение в условии?
дык было давно сказано
ARV писал(а):прежде следует хотя бы бегло ознакомиться с основами языка Си, прежде чем начинать что-то писать на нём
кто б слушал...
COKPOWEHEU писал(а):Странно что компилятор не ругается warning'ами
кто б ещё их читал...

я КОРОЧЕ ЩА ОТКРЫЛ КНИГУ П ПРОГРАММИРОВАНИЮ, там почитал. и в итоге у меня всё получилось, радости полные штаны.
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRD = 0b00001010;
PORTD = 0b00000101;


/* Replace with your application code */
while (1)
{
if (PIND &0b00000001)
{
PORTD &=~(1<<PD1);
}
else
{
PORTD |= (1<<PD1);
}
if (PIND &0b00000100)
{
PORTD &=~(1<<PD3);
}
else
{
PORTD |= (1<<PD3);
}
}

}

Помогите с программированием новичку.

Вс июл 09, 2017 20:23:04

Всем привет, хочу напистаь прогу, типо нажал кнопку(ну нажал и отпустил, т.е не зажимая её). и светодиод загорелся, потом опять так нажал, и он выключился. Я что-то пытался через цикл while, но не получилось, потом подумал дайка блок-схему составлю, и в итоге выяснилось что даже без понятие как это сделать. Мб у кого есть идеи. С++ знаю очень плохо, только цикл whi;e и if освовил, такжезнаю как сделать порт на выход или вход. и как присвоить портам единицу. регистами pin,ddr,port владею

Re: Не могу нормально зажечь светодиод

Пн июл 10, 2017 07:12:54

narius985 писал(а):Мб у кого есть идеи. С++ знаю очень плохо
есть: изучайте язык Си! минимальный уровень, после которого с вами можно будет культурно разговаривать - это четкое понимание отличий Си от C++. до этого момента других идей не будет.

Re: Не могу нормально зажечь светодиод

Пн июл 10, 2017 07:52:53

Ну почему же. Можно ознакомиться с курсом от DiHalt'а на easyelectronics. В принципе, есть видеокурс на cxem.net, но он похуже.

Re: Не могу нормально зажечь светодиод

Пн июл 10, 2017 08:13:06

narius985 писал(а):Мб у кого есть идеи. С++ знаю очень плохо
есть: изучайте язык Си! минимальный уровень, после которого с вами можно будет культурно разговаривать - это четкое понимание отличий Си от C++. до этого момента других идей не будет.

что в атмел студио есть, на том я и программирую

Re: Не могу нормально зажечь светодиод

Пн июл 10, 2017 08:21:28

Вот я и говорю: разберитесь, на чем именно вы программируете, изучите это самое, и тогда будем разговаривать по существу. Освойте что-то помощнее if-ов.
Ответить