Форум myROBOT.ru » Лаборатория » Микроконтроллеры » Код маленький, а глючит

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

1. danger3466 - 24 Декабря, 2011 - 22:03:35 - перейти к сообщению
CODE:
#define F_CPU 20000000UL // 20 MHz

#define BAUD 9600
#include <util/setbaud.h>

#include <avr/io.h> // ввод-вывод
#include <util/delay.h>

void UART_Init(void)
{
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
UCSRB = (1 << TXEN) | (1 << RXEN);
UCSRC = (1 << USBS) | (3 << UCSZ0);
}

void Send(unsigned char *data)
{
USART_Send(data);
}

void USART_Send(unsigned char *data)
{
int i;
while(data[i]){
if (data == '\n')
USART_Send('\r');
while ( !( UCSRA & (1<<UDRE)) ){};
UDR = data[i];
i++;
}
}

int main(void)
{
DDRA = 0x00; // Весь порт как вход
DDRB = 0x00; // Весь порт как вход

UART_Init();

int tmp=2;
while (1){
if ((PINB & _BV(PB1)) == 1) {
if(tmp != 1) Send("Test 1\n");
tmp = 1;
} else {
if(tmp != 0) Send("Test 0\n");
tmp = 0;
}
}

return 0;
}


Гоняю это дело в эмуляторе, но почему то все время мк считает что на линии 0, в терминале только один раз вижу "Test 0". Хотя я туда то 0 то 1 загоняю. Для этого завел две кнопки одна на минус вторая на плюс.
Похоже косяк тут:
CODE:
if ((PINB & _BV(PB1)) == 1)

Но я его не вижу Грустный
Помогите!
2. mihail - 25 Декабря, 2011 - 00:12:04 - перейти к сообщению
(PINB & _BV(PB1)) никогда не будет равно 1.
(PINB & _BV(PB1)) может быть равно 0 или 2 (0b10).

Лучше пишите
CODE:
if ((PINB & _BV(PB1)) == 0)
{
/* код выполняется если на PB1 "0" */
}
или
CODE:
if ((PINB & _BV(PB1)) != 0)
{
/* код выполняется если на PB1 "1" */
}
3. danger3466 - 25 Декабря, 2011 - 09:31:20 - перейти к сообщению
mihail пишет:
(PINB & _BV(PB1)) никогда не будет равно 1.
(PINB & _BV(PB1)) может быть равно 0 или 2 (0b10).

Вот этого я не понимаю, может поясните? А вообще чего возвращает _BV?
4. mihail - 25 Декабря, 2011 - 18:30:06 - перейти к сообщению
_BV(PB1) это не функция. Это макрос. Он описан в sfr_defs.h.
CODE:
#define _BV(bit) (1 << (bit))

PB1 это символическая константа. Она определяется в заголовочных файлах конкретного микроконтроллера. Например, iom8.h.
CODE:
#define PB1 1


Таким образом в текст программы вместо
CODE:
_BV(PB1)
подставляется
CODE:
(1 << (1))
Результатом этих операций будет 0b00000010.

В итоге строка
CODE:
(PINB & _BV(PB1))
может быть сведена к
CODE:
(PINB & 0b00000010)


Результатом выполнения
CODE:
(PINB & _BV(PB1))
может быть либо 0b00000000 (если на PINB1 "0" ) либо 0b00000010 (если на PINB1 "1" ).

PS Надеюсь, что нибудь понятное сказал Улыбка
5. cjA - 28 Декабря, 2011 - 01:56:33 - перейти к сообщению
как сообщение то удалить?
(Добавление)
да , сказал, бессмысленный макрос (я тоже думал что это функция)