Страница 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-ую на минус подтянуть.
:D

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
Про взятие младшего бита не знал, спасибо)
Еще один финт - можно объединить счетчик и маску. :wink: Я так люблю делать. :)

Например, хотим вывести байт:

Код: Выделить всё


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 писал(а):Еще один финт - можно объединить счетчик и маску. :wink: Я так люблю делать. :)
годный метод :)))

Re: Проблема со сдвиговым регистром

Добавлено: Пн май 27, 2013 13:48:51
Kavka
Nubik писал(а):Там даже ножек нет под это на МК))))
Мыслить надо ширше и гибчее. :)) :)) :)) :)) :))
Советы-то помогли? Разобрались? Заработало?