Страница 1 из 1
Проблема со сдвиговым регистром
Добавлено: Чт май 23, 2013 23:16:09
Nubik
Здравствуйте. Разбираюсь со сдвиговым регистром. Вроде все понятно, что да как делать с ним. Решил затестить. Написал программку, подключил в протеусе - не работает. Не пойму в чем дело, по логике должно работать.
Пишу в Студии 5й, Протеус - 7.10
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
#define SH PINA0
#define DATA PINA1
#define WRITE PINA2
void send_data(int numb)
{
while (numb != 0)
{
if (numb%2)
{
PORTA &= ~_BV(SH);
PORTA |= _BV(DATA);
PORTA |= _BV(SH);
}
else
{
PORTA &= ~_BV(SH);
PORTA &= ~_BV(DATA);
PORTA |= _BV(SH);
};
numb = numb/2;
PORTA |= _BV(WRITE);
_delay_ms(30);
}
}
int main(void)
{
DDRA = 0xFF;
PORTA = 0xFF;
int numb = 173;
send_data(numb);
while(1)
{
//TODO:: Please write your application code
}
}
Буду благодарен за любую помощь и подсказку.
Re: Проблема о сдвиговым регистром
Добавлено: Пт май 24, 2013 06:51:14
Kavka
Во-первых, 10-ую ножку на плюс, 13-ую на минус подтянуть.
Во-вторых. А где спад сигнала WRITE?
Как говориться, по моему скромному мнению...
(numb%2) - "взятие" младшего бита обычно делается через битовую операцию (numb & 1)
numb = numb/2 - это делается битовым сдвигом вправо numb = numb >> 1 или numb >>= 1
Из конструкции с условным оператором можно вынести одинаковые операторы - будет меньше прошивка.
Re: Проблема о сдвиговым регистром
Добавлено: Пт май 24, 2013 07:14:58
kalobyte
Re: Проблема о сдвиговым регистром
Добавлено: Пт май 24, 2013 10:20:05
Кефир
Kavka писал(а):Во-первых, 10-ую ножку на плюс, 13-ую на минус подтянуть.

Re: Проблема о сдвиговым регистром
Добавлено: Пт май 24, 2013 11:40:52
Nubik
kalobyte писал(а):http://kalobyte.com/upravlenie-registrami-74hc595-i-4094-s-7-segmentnymi-indikatorami
Спасибо, помогло.
Kavka писал(а):Во-первых, 10-ую ножку на плюс, 13-ую на минус подтянуть.
В Протеусе это не нужно.
Kavka писал(а):
(numb%2) - "взятие" младшего бита обычно делается через битовую операцию (numb & 1)
Про взятие младшего бита не знал, спасибо)
Re: Проблема со сдвиговым регистром
Добавлено: Пт май 24, 2013 22:07:41
YS
Про взятие младшего бита не знал, спасибо)
Еще один финт - можно объединить счетчик и маску.

Я так люблю делать.
Например, хотим вывести байт:
Код: Выделить всё
uint8_t mask;
for (mask=0x80; mask; mask=mask >> 1)
{
if (byte & mask)
{
//выводим единицу
}
else
{
//выводим ноль
}
}
То же самое можно написать и для uint16_t, и uint32_t. Автоматом получаем вывод двух/четырех байт.
Понятно, переменные mask и byte должны быть одного типа.
В Протеусе это не нужно.
А я бы подтянул. Кто знает, что там по умолчанию...
Re: Проблема со сдвиговым регистром
Добавлено: Вс май 26, 2013 17:05:52
Nubik
YS писал(а):
А я бы подтянул. Кто знает, что там по умолчанию...
Там даже ножек нет под это на МК))))
Re: Проблема со сдвиговым регистром
Добавлено: Вс май 26, 2013 17:08:52
YS
10-я и 13-я - это ~MR и ~OE на сдвиговом регистре.
Re: Проблема со сдвиговым регистром
Добавлено: Пн май 27, 2013 10:02:08
kalobyte
YS писал(а):Еще один финт - можно объединить счетчик и маску.

Я так люблю делать.
годный метод

Re: Проблема со сдвиговым регистром
Добавлено: Пн май 27, 2013 13:48:51
Kavka