Вт ноя 05, 2019 16:42:54
Вт ноя 05, 2019 17:41:43
Вт ноя 05, 2019 20:01:03
Вт ноя 05, 2019 21:44:47
Ср ноя 06, 2019 11:11:41
Ср ноя 06, 2019 11:21:47
Ср ноя 06, 2019 11:58:55
Ср ноя 06, 2019 16:14:09
Евгений07 писал(а):я файл атмел студио прикрепил!
#include <avr/io.h>
#include <util/delay.h>
#define Bit(bit) (1<<(bit))
#define ClearBit(reg, bit) reg &= (~(1<<(bit)))
#define SetBit(reg, bit) reg |= (1<<(bit))
#define BitIsClear(reg, bit) ((reg & (1<<(bit))) == 0)
#define PAUZA 200 // 200 * 100ms =20 000ms
int main()
{
static uint8_t a;
SetBit(DDRB, DDB0) ; ClearBit(PORTB, PB0);
ClearBit(DDRB ,DDB4); ClearBit(DDRB, DDB3); SetBit(PORTB, PB4); SetBit(PORTB, PB3);
while (1) {
if (BitIsClear(PINB,PINB3)) {
if ( a== PAUZA ) { ClearBit(PORTB, PB0);
} else { SetBit(PORTB, PB0); }
if (BitIsClear(PINB,PINB4)) {
if( ++a > PAUZA) { a=PAUZA; }
_delay_ms (100);
} else { a = 0; }
} else { ClearBit(PORTB, PB0); a = 0; }
};
}
Ср ноя 06, 2019 20:07:53
Ср ноя 06, 2019 20:52:25
как поставить задержку выключения светодиода на порте 0 при нажатой кнопке пин4 а при отпускании он должен снова сразу включиться т,к, пин 3 кнопка нажата постоянно а она отвечает за порт
Пн ноя 11, 2019 19:52:17
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRD = 0x00; // Порт D вход
PORTD = 0xFF; // Подключаем подтягивающие резисторы
DDRB = 0xFF; // Порт B выход
PORTB = 0x00; // Лог. 0 на выходе
while(1)
{
while ((PIND&(1 << PD0)) == 1){} // Ждем пока на выводе PDO лог. 1
_delay_ms(200); // Задержка 200мс
if ((PINB&(1 << PB0)) == 0) // Если на выводе PB0 лог. 0
{
PORTB |= (1 << PB0); // Лог. 1 на выводе PB0
}
else
{
PORTB &= ~(1 << PB0); // Лог. 0 на выводе PB0
}
while ((PIND&(1 << PD0)) == 0){} // Ждем пока на выводе PDO лог. 0
_delay_ms(200); // Задержка 200мс
}
}
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
//DDRD = 0x00; // Порт D вход
//PORTD = 0xFF; // Подключаем подтягивающие резисторы
//DDRB = 0xFF; // Порт B выход
//PORTB = 0x00; // Лог. 0 на выходе
DDRB = 0x00000001; //(последний бит установил в единицу - это будет выход, т.е на PB0 будет светодиод)
PORTB= 0x11111110; //(по аналогии с атмегой PB1=1 (подключен подтягивающий резистор), а PB0 - установлен логический 0 на входе)
while(1)
{
while ((PINB&(1 << PB1)) == 1){} // Ждем пока на выводе PDO лог. 1
_delay_ms(200); // Задержка 200мс
if ((PINB&(1 << PB0)) == 0) // Если на выводе PB0 лог. 0
{
PORTB |= (1 << PB0); // Лог. 1 на выводе PB0
}
else
{
PORTB &= ~(1 << PB0); // Лог. 0 на выводе PB0
}
while ((PINB&(1 << PB1)) == 0){} // Ждем пока на выводе PDO лог. 0
_delay_ms(200); // Задержка 200мс
}
}
Пн ноя 11, 2019 20:00:16
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
//DDRD = 0x00; // Порт D вход
//PORTD = 0xFF; // Подключаем подтягивающие резисторы
//DDRB = 0xFF; // Порт B выход
//PORTB = 0x00; // Лог. 0 на выходе
DDRB = (1 << PB0); //(последний бит установил в единицу - это будет выход, т.е на PB0 будет светодиод)
PORTB= (1 << PB1); //(по аналогии с атмегой PB1=1 (подключен подтягивающий резистор), а PB0 - установлен логический 0 на входе)
while(1)
{
while ((PINB&(1 << PB1))); // Ждем пока на выводе PDO лог. 1
_delay_ms(200); // Задержка 200мс
if ((PINB&(1 << PB0)) == 0) // Если на выводе PB0 лог. 0
{
PORTB |= (1 << PB0); // Лог. 1 на выводе PB0
}
else
{
PORTB &= ~(1 << PB0); // Лог. 0 на выводе PB0
}
while (!(PINB&(1 << PB1))); // Ждем пока на выводе PDO лог. 0
_delay_ms(200); // Задержка 200мс
}
}
Пн ноя 11, 2019 20:18:49
NStorm писал(а):Особенно писать в биты регистра, которые помечены как read-only
NStorm писал(а):Не надо сравнивать с 1 результат AND (&). 1<<PB1 равно 2, а никак не 1
NStorm писал(а):Но это изначально убогий код был.
Пн ноя 11, 2019 20:53:09
NStorm писал(а):Не надо сравнивать с 1 результат AND (&). 1<<PB1 равно 2, а никак не 1
if ((PINB&(1 << PB0)) == 0) // Если на выводе PB0 лог. 0
{
PORTB |= (1 << PB0); // Лог. 1 на выводе PB0
}
else
{
PORTB &= ~(1 << PB0); // Лог. 0 на выводе PB0
}
#include <avr/io.h>
#include <util/delay.h>
int main(void) {
DDRB = (1 << PB0); //(последний бит установил в единицу - это будет выход, т.е на PB0 будет светодиод)
PORTB = (1 << PB1); //(по аналогии с атмегой PB1=1 (подключен подтягивающий резистор), а PB0 - установлен логический 0 на входе)
while (1) {
while ((PINB & (1 << PB1))); // Ждем пока на выводе PB1 лог. 1
_delay_ms(200); // Задержка 200мс
PORTB ^= (1 << PB0);
while (!(PINB & (1 << PB1))); // Ждем пока на выводе PB1 лог. 0
_delay_ms(200); // Задержка 200мс
}
}
Пн ноя 11, 2019 22:35:39
NStorm писал(а):Пишется просто
PORTB ^= (1 << PB0);
while(1)
{
while ((PINB&(1 << PB1))){} // Ждем пока на выводе PDO лог. 1 (Жднем нажатия)
_delay_ms(200); // Задержка 200мс
while (1){
PORTB ^= (1 << PB0);
_delay_ms(200);
}
while ((PINB&(1 << PB1))) {}
_delay_ms(200); // Задержка 200мс
}
Пн ноя 11, 2019 22:43:57
while (1){
uint8_t i = 0, btn_flag = 0;
PORTB ^= (1 << PB0);
while (i <= 10) {
i++;
_delay_ms(20);
if (!((PINB & (1 << PB1)))) {
btn_flag = 1;
PORTB &= ~(1 << PB0);
break;
}
}
if (btn_flag) break;
}
Вт ноя 12, 2019 02:44:50
Вт ноя 12, 2019 08:58:24
radteh писал(а):если не секрет, ты пишешь эту программу для того что-бы разобраться с МК или для практической задачи?
while ((PINB & (1 << PB1))){};
while ((PINB & (1 << PB1))){
PORTB^=(1<<PB0);
_ms_delay(200);
};
while(1)
{
while ((PINB&(1 << PB1))){} // Ждем пока на выводе PDO лог. 1 (Жднем нажатия)
_delay_ms(200); // Задержка 200мс
while ((PINB&(1 << PB1))){ /// Вот в этом цикле, как я полагаю должно быть мигание, которое выключится по нажатию кнопки.
PORTB ^= (1 << PB0);
_delay_ms(200);
}
}
while ((PINB & (1 << PB1))){
PORTB^=(1<<PB0);
_ms_delay(200);
};
Вт ноя 12, 2019 09:07:19
Вт ноя 12, 2019 09:20:02