[PIC] Работа со сдвиговым регистром

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
vbmart
Сообщения: 4
Откуда: Иркутск

Сообщение vbmart » 26 сен 2011, 03:58

Добрый день!
Использую PIC18F4550 с кварцем 20 MHz. К нему через сдвиговые регистры(74HC595) подцеплены 48 светодиодов.
Хочу сделать ВАМ на 75 Гц при 255 уровнях яркости.
Посчитал длительность горения первого такта ВАМ: примерно 52 мкс. Т.е. для зажигания всех светодиодов надо затратить меньше 52мкс.

Сперва попробовал в цикле обрабатывать этот массив и выдавать на сдвиговый регистр данные - очень медленно. На установку всех светодиодов надо около 300 мкс.

Отказался от цикла и получил 48 однотипных групп действий(выбор и отправка на регистр данных и щёлканье клоком). Отладчик подсказал, что за 1 мкс контроллер успеет сделать 5 шагов(циклов). Итого, на одну группу действий есть всего 5 шагов(48 мкс).

Вот что у меня получилось:
Данные об уровне яркости хранятся в байтовом массиве.

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

asm
  BSF RA2_bit+0, 2 // Data := 1
  MOVF _iBAM, 0, 1 // W:= iBAM
  ANDWF _ledbuf+0, 0, 1 // W:= W AND ledbuf[0]
  BNZ l0
  BCF RA2_bit+0, 2 // Data := 0
  l0:
  BSF RA3_bit+0, 3 //Clock:= 1;
  BCF RA3_bit+0, 3 // Clock:= 0;
end;

Но этот код затрачивает 7 шагов (67 мкс) на всё, что много.
Может кто-нибудь помочь уложить этот код в 5-6 шагов?
Команды можно посмотреть тут: http://www.microchip.ru/?mid=3&tab=18
Последний раз редактировалось vbmart 26 сен 2011, 11:41, всего редактировалось 1 раз.

uschema.com
Сообщения: 162

Сообщение uschema.com » 26 сен 2011, 11:18

MOVF _iBAM, 0, 1 // W:= iBAM
ANDWF _ledbuf+0, 0, 1 // W:= W AND iBAM
похоже что вторая строчка лишняя. Т.К. по сути это W:= W AND W

vbmart
Сообщения: 4
Откуда: Иркутск

Сообщение vbmart » 26 сен 2011, 11:40

uschema.com писал(а):MOVF _iBAM, 0, 1 // W:= iBAM
ANDWF _ledbuf+0, 0, 1 // W:= W AND iBAM
похоже что вторая строчка лишняя. Т.К. по сути это W:= W AND W

Я ошибся в комментарии. правильно так:
// W:= W AND ledbuf[0]

uschema.com
Сообщения: 162

Сообщение uschema.com » 26 сен 2011, 12:04

Попробуй с BTFSC, ну или в том направлении, если все верно, то выигрыш в 2 команды

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

 BSF RA2_bit, 2 // бит в порт
; MOVF _iBAM, 0, 1 // iBAM в аккумулятор W
; ANDWF _ledbuf, 0, 1 // Ложится маска, результат в W аккумулятор. W:= W & ledbuf[0]
BTFSC  iBAM, ledbuf[0]
; BNZ l0 // Проверяется аккумулятор W, Если ноль в Z то в l0
 BCF RA2_bit, 2 // Data := 0 // если не ноль, очистить бит
l0:
 BSF RA3_bit, 3 //Clock:= 1;
 BCF RA3_bit, 3 // Clock:= 0;

vbmart
Сообщения: 4
Откуда: Иркутск

Сообщение vbmart » 26 сен 2011, 16:10

Думал про такой вариант. Но, к сожалению, команда BTFSC просит вторым параметром константу :(

vbmart
Сообщения: 4
Откуда: Иркутск

Сообщение vbmart » 28 сен 2011, 03:39

Уменьшил частоту до 50 Гц. Проверяю на устройстве - пока мерцаний не видно.

Вернуться в «Микроконтроллеры и ПЛИС»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 12 гостей