Программа слайд-шоу BPEG v0.2 и контроллер управления PIC16F876A

 

Программа "BPEG"

Программа BPEG (285 кб) была разработана в качестве компьютерного аналога системы "slide show". Данная версия была исправлена, устранены некоторые недостатки.
С последовательных портов компьютера (COM1,2...) получает управляющие байты. Каждому полученному байту соотвествует картинка в формате JPG в папке "JPEG".

C помощью контроллера управления (Контроллер упрвления представляет не сложную схему на основе контроллера Microchip PIC16F876A) и программы Bpeg вы можете организовать систему слайд-шоу на обычном компьютере.

Контроллер управления посылает через COM-port программе число от 0 до 255, в соотвествии с принятым числом программа Bpeg конвертирует значение в имя файла (Например: "12.jpg") находит в папке "jpeg" файл, если данный файл существует то открывает и показывает на весь экран. Всего управляющих байтов может быть 256 (от 0 до 255). Соответственно и в папке "JPEG" должно быть 256 слайдов.
программа позволяет выбрать любой порт, шрифт и цвет шрифта.
Настройки сохраняются автоматически.

общий вид программы для слайд-шоу
Выход - ESC
Настройка - F9 (либо правая кнопка мыши)

Программа распространяется бесплатно.

Программа по умолчанию использует скорость com-порта 9600 бод.

 

Контроллер

Проект открыт для применения МК Microchip. Прошу присоединится к проекту разработчиков схем с МК иных производителей.

Устройство разработано по типовым схемам. Представляет связку из 2-х микросхем МК PIC16F876A и MAX232CPE (MAX232) Рис.1. Необходимо использовать MAX232 для согласования уровней, так как модуль USART микроконтроллера не соответствует TTL используемые в портах ввода/вывода RS-232 компьютеров.

Схема контроллера управления
Схема контроллера управления

Существуют несколько видов кабеля (Рис.2, a),но для соединения COM-порта компьютера и девайса можно использовать следующий тип кабеля.


Рис.2


Tx и Rx подключены кроссом. При использовании кабеля, который соединяет напрямую (без кроссирования) нужно внести изменения в схему согласно подключениям Rx, Tx каналов.

Для полноценной работы разработал исходный код программы МК. В коде была ошибка, после исправления HEX весит 870 байтов:

; Контроллер управления для программы Baby-peg v0.2
; Система слайд-шоу (slide show system) на 256 слайдов
; (с)2008.Art!P email:artip@artip.ru
; Условия распространения программы: Freeware
; программа http://nice.artip.ru/?id=doc&a=doc8
; контроллер http://nice.artip.ru/?id=doc&a=doc45
; разрешена любая модификация исходного кода программы контроллера
; Контроллер инциализирует соединение с программой через COM-port на скорости 9600 baud

PROCESSOR 16f876a
#include "p16f876a.inc"
; Обязательно отключить таймер WatchDog! WDT = off
; Тактовый генератор = HS. Power Up Timer = 0ff. Brown Out Detect = off

radix dec
#define Button1 PORTA,0 ; "<<" кнопка для установки слайд в самое начало отсылается байт 0
#define Button2 PORTA,1 ; ">>" кнопка для установки слайд в самое начало отсылается байт 255
#define Button3 PORTA,2 ; ">" кнопка один слайд вперед
#define Button4 PORTA,3 ; "<" внопка один слайд назад

BAUD_9600 EQU 12
; для SBRG устнавливаем значение 12, при тактовой 8 МГц (скорость 9600 бод)
; при использовании других тактовых частот необходимо высчитать значение SBRG!

org 0x0
NOP
goto START
org 0x04; эта точка входа необходима при использовании отдладчика MICD2-MC1. Устанавливать её не обязательно
;**************** main start ****************
START
org 0x20; начало кода
sleep1    res  1; резервируем память для некоторых переменных
sleep2    res  1;
sleep3    res  1;
a1         res  1; Button1
b1         res  1; Button2
temp    res  1; Button3 Button4
pause1    res  1;
pause2    res  1;
movlw 0x15;
call sl; сделаем небольшую задержку перед включением светодиода
clrf PORTB;
BCF STATUS,RP1;
BSF STATUS,RP0;
movlw 0x0;
movwf TRISB;
clrf STATUS;
bsf PORTB,0;
включаем светодиод "устройство работает"
bsf STATUS,RP0; выбрать банк1
movlw b"11000000";
movwf TRISC;
включаем TX/RX(RC6/RC7)
movlw BAUD_9600;
movwf SPBRG; устанавливаем скорость порта
bcf PIE1,TXIE; запрещаем прерывания
bcf TXSTA,BRGH; устанавливаем скорость
bcf TXSTA,SYNC; асихронный режим
bsf TXSTA,TXEN; включить передатчик

bsf PIE1,RCIE;
bcf STATUS,RP0 ;
выбрать банк0
bsf RCSTA,SPEN; включаем USART
bsf RCSTA,CREN; включаем приемник.
;Приемник включать не обязательно, но оно необходимо если Вы будете другую программу,
;которая что-либо будет посылать на контроллер

main:
movlw 0x0
movwf a1; устнавливаем значение 0 кнопка "<<"
movwf temp; начальное значение 0 для ">", "<"
movlw 0xff;
movwf b1; для кнопки ">>" установим значение 255

bcf STATUS, RP1;
bcf STATUS, RP0;
CLRF PORTA;
Режим управления
bsf STATUS, RP0;
movlw 0x06;

movwf ADCON1; Определяем порты как цифровой вход
movlw 0xff;
movwf TRISA; Инициализация портов А

bcf STATUS, RP1;
bcf STATUS, RP0;
выбран 0-ой банк

Port_cycle: ; В портах использованы подтягивающие резисторы, они устанавливают напряжение и подтягивают значение до логической 1
        btfss   Button1 ; Если button1 = 1, то пропускаем следующую команду.
        goto    Press1; кнопка нажата (лог. 0), вызываем подпрограмму Press1
       
btfss   Button2;
        goto    Press2;
        btfss   Button3;
        goto    Press3;
        btfss   Button4;
        goto    Press4;
        goto    Port_cycle;
;
Обработка нажатия кнопки Button1:

Press1:
        call    Pause; сделаем небольшую паузе в несколько мс для устранения эффекта дребезжания кнопки
        btfsc   Button1;
        goto    Port_cycle; кнопка "дребезнула" возвращаемся в основной цикл
        call    Pressed1; иначе вызываем подпрограмму Pressed1
        movlw 0x9;
        call sl; установим задержку перед началом повтора
press_cycle1:
         btfsc   Button1; если внопка нажата
        
goto    Port_cycle;       
        call    Pressed1; то вызываем Pressed1
        call    Pause; пауза между нажатиями
        call    Pause;
        goto    press_cycle1;

Press2:
        call    Pause;
        btfsc   Button2;
        goto    Port_cycle;
        call    Pressed2; 
         movlw 0x9;
         call sl;
press_cycle2:
        btfsc   Button2;
         goto    Port_cycle;       
        call    Pressed2; 
        call    Pause;
         call    Pause;
         goto    press_cycle2;

Press3:
        call    Pause;
        btfsc   Button3;
        goto    Port_cycle;
             call    Pressed3;
             movlw 0x9;
             call sl;
  press_cycle3:
             btfsc   Button3;
             goto    Port_cycle;       
        call    Pressed3; 
        call    Pause;
             call    Pause;
             goto    press_cycle3;

Press4:
        call    Pause;
        btfsc   Button4;
        goto    Port_cycle;
        call    Pressed4; 
             movlw 0x9;
             call sl;
  press_cycle4:
             btfsc   Button4;
             goto    Port_cycle;       
        call    Pressed4; 
        call    Pause;
             call    Pause;
             goto    press_cycle4;

Pressed1: ; кнопка "<<" = 0
movf a1,0;
call send;
return;

Pressed2: ; кнопка ">>" = 255
movf b1,0;
call send;

return;

Pressed3: ; кнопка ">"
incf temp,1; Используется временная переменная для 2-х разных кнопок
movf temp,0; Значение temp меняется от 0 до 255 в цикле по кругу

call send; после 255 идет 0,1,2 и т.д.
return;

Pressed4: ; кнопка "<"
decf temp,1;
movf temp,0;
call send;
return; 

Pause: ; При разных тактовых частотах значение pause1 необходимо подобрать
        movlw   0xaa        movwf   pause1
        clrf    pause2
Pause_cycle:
        decfsz  pause2,f
        goto    Pause_cycle
        decfsz  pause1,f
        goto    Pause_cycle
        return;

 send:   
             bcf
STATUS,RP0      ; выбрать банк 0
             movwf TXREG    ; отсылаем содержимое регистра W.

                           ; Компьютер принимает значение в байтах
                           ; но программа конвертирует значение байта в десятичное число от 0 до 255
                           ; число преобразовывается в имя файла к примеру "0.jpg", ведется поиск из папки JPEG
                           ; если файл существует - открывается и показывается программой на экране

TransWt bsf STATUS,RP0          ; выбираем банк 0
WtHere  btfss TXSTA,TRMT        ; ждем пока всё отправится
      goto WtHere
      bcf STATUS,RP0
return  

sl: ; процедура большой задержки
        movwf   sleep1
        clrf    sleep2
        clrf    sleep3
cycle1:
        decfsz  sleep3,f
        goto    cycle1
        decfsz  sleep2,f
        goto    cycle1
        decfsz  sleep1,f
        goto    cycle1
         RETURN

END
;**************** main end ****************

Исходный код и готовый HEX для прошивки Вы можете скачать bpeg_asm.zip 13кб.
Программа разработана на ассембелере и имеет следующую логику работы:
После включения питания устройства через пару секунд зажигается светодиод "устройство работает".
Инциализирует модуль USART.
Опрашивает кнопки на нажатие. Посылает соотвествующий байт: 0 если нажата "<<", 255 если ">>" и ">" "<" посылают значение от 0 до 255 значение инкрментируется (декрментируется) в пределах этого диапазона. При достижении крайних значении 0 или 255 инкремент(декремент) продолжается с начального или конечного числа.

Программа МК далеко не совершенна, думаю требует некоторой оптимизации и исправления. С радостью расмотрю ваши замечания, еще с большей радостью если вы предложите улучшенную принципиальную схему, либо схему с другим МК (любого производителя). Предлагайте ваши исходные коды написанные на скажем Си и т.д. Обязательно рассмотрю и с Вашего разрешения выложу в ветку.

Art!P