'**************************************************************** '* Name : Epson16F819_01.PBP * '* Author : Anatoly A. Tokarev * '* Notice : Copyright (c) 2007 Anatoly A. Tokarev * '* : All Rights Reserved * '* Date : 06.12.2007 * '* Version : 0.01 * '* Notes : Контроллер для управления биполярным двигателем * '* : в Epson на PIC16F819 * '* : * '* : НЕ ДЛЯ КОММЕРЧЕСКОГО ИСПОЛЬЗОВАНИЯ! * '* : * '**************************************************************** ' Подключение железа: ' ' Включены резисторы подтяжки PORTB ' RB0 - STEP ' RB1 - DIR ' RB2 - Ph1 ' RB3 - I01 ' RB4 - I11 ' RB5 - Ph2 ' RB6 - I02 ' RB7 - I12 ' ' RA0 - PhA ' RA1 - PhC ' RA2 - PhB ' RA3 - PhD ' RA4 - светодиод ' RA5 - J3 - high torque/normal microstep ' RA6 - кварц ' RA7 - кварц ' DEFINE OSC 20 ' 20 MHz OSC DEFINE NO_CLRWDT 1 ' убрали из программы вставки CLRWDT ' Задаем для удобства обозначения портам и выводам LED var PORTA.4 ' выход на светодиод STEPIN var PORTB.0 ' вход STEP DIRIN var PORTB.1 ' вход DIR Ph1 var PORTB.2 ' выход Phase1 I01 var PORTB.3 ' выход I11 var PORTB.4 ' выход Ph2 var PORTB.5 ' выход Phase1 I02 var PORTB.6 ' выход I12 var PORTB.7 ' выход '------------------------------------------------------------------------------- A var Byte[17] ' массив с управляющей последовательностью RevCntr var byte ' реверсивный счетчик '=============================================================================== ' Таблица управ. сигналов, выводимых в PortB - см. назначение выводов выше EEPROM 0,[%00001111,%00001011,%00100111,%01000011,%11100011,%11000011,%10100111,%10001011] ' $0F,$0B,$27,$43,$E3,$C3,$A7,$8B,$9F,$9B,$B7,$D3,$73,$53,$37,$1B EEPROM 8,[%10011111,%10011011,%10110111,%11010011,%01110011,%01010011,%00110111,%00011011] GoTo Begin ' jump over the interrupt handler and sub ' Собственно само начало программы Begin: ' Проводим инициализацию контроллера ' bank 1 ADCON1 = %00000110 ' все входы - цифровые, опорное - от питания TRISA = %00000000 ' RA0,1,2,3-вЫходы, RA4-выход, RA5-выход OK, RA6,7-кварц TRISB = %00000011 ' RB0-вход IRQ Step, RB1- Direction SSPSTAT = %01000000 ' CKE=1 OPTION_REG = %00000000 ' включили подтягивающие резисторы в PORTB, ' прерывания INT по падающему 1->0 переходу ' bank 0 PORTA = 255 ' все выходы портов PORTB = 255 ' устанавливаем ADCON0 = 0 ' АЦП выключен T1CON = $31 ' включаем Timer1, prescaler = 1:8, переполнение через 26,2144 мс INTCON = 0 '$C0 все запрещено ' разрешаем глобальные прерывания и от периферии SSPCON = %00000000 ' запрещаем SSP '-- Читаем таблицу в память для ускорения работы ------------------------------- For RevCntr = 0 To 15 read RevCntr,A[RevCntr] ' Next '-- Задаем начальные значения SIN, COS ----------------------------------------- RevCntr = 0 ' PORTB = A[0] ' начальное значение '== Бесконечный цикл опроса ==================================================== ' Loop: '-- обработка сигнала STEP ----------------------------------------------------- if (INTCON.1 = 1) then ' ждем прерывания от INT - сигнала STEP INTCON.1 = 0 ' было прерывание, сбрасываем флажок If DIRIN = 0 Then ' в зависимости от сигнала DIR RevCntr = RevCntr-1 ' уменьшаем Else ' или RevCntr = RevCntr+1 ' увеличиваем счетчик EndIf RevCntr = RevCntr & %00001111 ' ограничиваем счетчик 4 разрядами PORTB = A[RevCntr] ' и выводим управляющий сигналы в порт endif goto Loop ' '=== Здесь окончание цикла опроса ==============================================