Ср май 11, 2016 13:19:14
CONFIG FOSC = INTIO67
#define SET_TRISA B'11111001'
#define SET_TRISB B'00000100'
#define _OLEDPON LATA,1
#define _OLED_DC LATB,0
#define _OLED_RES LATB,4
#define _OLED_CS LATB,5
INIT_SPI
MOVLW 0f
MOVWF BSR
BCF PMD1, MSSP2MD ; вкл. spi2
BSF SSP2CON1, SSPM0 ; clock=fosc/16
BCF SSP2CON1, SSPM1
BCF SSP2CON1, SSPM2
BCF SSP2CON1, SSPM3
BSF SSP2CON1, CKP ; Idle state for clock is low
BCF SSP2STAT, CKE ; Transmit occurs on transition from active to idle clock state
BCF SSP2STAT, SMP ; Data is sampled at middle of data output time
BSF SSP2CON1, SSPEN ; Enable SPI Port
MOVLW .39
MOVWF SSP2ADD ; SCLx pin clock period = ((39 + 1) *4)/FOSC
BSF IPR3, SSP2IP ; Synchronous Serial Port 2 Interrupt Priority bit 1 = High priority
BSF PIE3, SSP2IE ; TMR5 Gate Interrupt Enable bit 1 = Enabled
RETURN
MOVLW 0AE
MOVWF SSP2BUF
CALL SPI_WAIT
BCF PIR3,SSP2IF
MOVF SSP2BUF,W
Ср май 11, 2016 13:58:33
BSF _OLED_DC ; передача команд активный 0
Ср май 11, 2016 14:05:43
;*****************************************************************************
include <C:\Data\Microchip\MPASM Suite\P18F26K22.INC>
LIST P=PIC18F26K22F
CONFIG FOSC = INTIO67 ;стр 45. таблица 2-5 биты 3-0 (http://gputils.sourceforge.net/html-help/PIC18F26K22-conf.html , http://subscribe.ru/archive/comp.soft.prog.pic/200612/19203029.html)
;INTIO67 - Выводы генератора используются как I/O (1000) ;INTIO7 - Выводы генератора используются для вывода тактовой частоты (деленной на 4)
;FOSC – биты выбора режима генератора системной частоты микроконтроллера. Доступно восемь различных режимов.
;000 – LP(Low Power)-режим. Подключение низкочастотного кварца. До 200 кГц. Этот режим используется для разработки электронных устройств с низким энергопотреблением.
;001 – XT-режим. В этом режиме генератор может формировать системные частоты от 200кГц до 4 МГц, в зависимости от кварца.
;010 – HS(High Speed)-режим. Высокоскоростной режим. В этом режиме генератор может формировать системные частоты от 4 до 25 МГц, в зависимости от кварца.
;011 – RC(External Resistor/Capacitor)-режим. Частота системного генератора задается внешней RC-цепочкой. Максимальная частота, формируемая генератором 4 МГц. Данный режим удобен тем, что не надо покупать кварц или микросхему, для формирования частоты. Но стабильность системной частоты будет намного ниже, потому что станут сказываться температурный дрейф (влияние температуры на параметры резистора и конденсатора) и скачки по напряжению. Цепочка подключается на пин OSC1, а на пин OSC2 микроконтроллер выдает системную частоту/4. В этом режиме RA6(6-ой бит PORTA) не используется. Вместо него, подключен выход OSC2.
;100 – EC(External Clock)-режим. В этом режиме системная частота формируется внешним генератором и подается на вход OSC1. Частота может быть до 40МГц. На пин OSC2 микроконтроллер выдает системную частоту/4. В этом режиме RA6(6-ой бит PORTA) не используется. Вместо него, подключен выход OSC2. Этот режим используется, если на плате есть еще микросхемы, для которых необходимо сформировать системную частоту.
;101 – ECIO(External Clock)-режим. В этом режиме системная частота формируется внешним генератором и подается на вход OSC1. Частота может быть до 40МГц. В этом режиме RA6 используется, как один из пинов ввода/вывода. OSC2 отключен.
;110 – HS(HS oscillator with PLL enabled)-режим. Этот режим аналогичен режиму HS, только входная частота умножается на 4. Например, кварц на входе формирует частоту 10МГц. А, реальная частота, которая пойдет на ядро – 40МГц.
;111 – RCIO(External Resistor/Capacitor)-режим. Частота системного генератора задается внешней RC-цепочкой. В этом режиме RA6 используется, как один из пинов ввода/вывода. OSC2 отключен.
CONFIG PLLCFG = ON ;стр 357.бит 4 (Oscillator multiplied by 4) Частота генератора умножается на 4.
CONFIG PRICLKEN = ON ;стр 357. бит 5 Primary clock enabled
CONFIG FCMEN = OFF ;стр 357. бит 6 Fail-Safe Clock Monitor disabled - это функция которая отслеживает частоту внешнего систем клока. Если частота находится в пределах +/-5% - ничего. Если частота выходит за ети пределы, систем клок переключается на внутренный генератор и возможно (если соответствующий бит PIE = 1) сгенерится прерывание.
CONFIG IESO = ON ; бит 7 Oscillator Switchover mode enabled
CONFIG PWRTEN = ON ; Power-up Timer Enable disabled
;PWRTEN – бит, разрешающий включать таймер при подаче на микроконтроллер питания.
;Т.е. этот таймер делает задержку, перед началом исполнения кода, на 72 мс, чтобы смог стабилизироваться генератор системной частоты и напряжение питания.
;0 – таймер включен
;1 – выключен
CONFIG BOREN = ON ; 01 = Brown-out Reset enabled and controlled by software (SBOREN is enabled)
;BOREN – бит разрешения схемы сброса по просадке напряжения питания. Обязательно включайте эту схему! Это поможет избежать проблем, связанных со скачками напряжения. При которых, микроконтроллер может работать некорректно.
;0 – схема отключена
;1 – схема включена
CONFIG BORV = 285 ; Brown-out Reset Voltage bits VBOR set to 2.85V nominal
;BORV – порог срабатывания схемы сброса по просадке напряжения питания
;Если напряжение питания микроконтроллера станет меньше 2,85 Вольт, то схема BOR сбросит микроконтроллер.
CONFIG WDTEN = OFF ; Watchdog Timer Enable 01 = WDT enabled when device is active, disabled when device is in Sleep; SWDTEN bit disabled
;WDTEN – бит, разрешающий включать таймер Watchdog. Этот таймер используют, чтобы избежать зависаний микроконтроллера.
;Сбрасывается он специальной командой: CLRWDT. Если эта команда не выполнится в течение запрограммированного периода, то таймер Watchdog сбросит микроконтроллер.
;Обязательно используйте этот таймер, особенно, когда только учитесь программировать!
;1 – таймер включен
;0 – выключен, но можно будет включить из программы.
CONFIG WDTPS = 256 ;Watchdog Timer Postscale Select bits 1000 = 1:256
;WDTPS2:WDTPS0: конфигурация постскалера таймера Watchdog (период без постскалера = 18мс)
;111 = 1:128 (программируемый период = 128*0,018=2,3сек)
;110 = 1:64 (программируемый период = 64*0,018=1,152сек)
;101 = 1:32 и т.д.
CONFIG CCP2MX = PORTB3 ;CCP2 input/output is multiplexed with RB3
;CCP2MX – этот бит мультиплексирует вход/выход второго устройства захвата/сравнения CCP2.
;Если CCP2 будет запрограммировано на использование внешнего входа или выхода, только тогда будет значимым этот бит.
;1 – вход/выход CCP2 выведен на пин RC1 (1-ый бит PORTC).
;0 – вход/выход CCP2 выведен на пин RB3.
CONFIG PBADEN = OFF ;ANSELB<5:0> resets to 0, PORTB<4:0> pins are configured as digital I/O on Reset
CONFIG HFOFST = OFF ;HFINTOSC Fast Start-up bit; The system clock is held off until the HFINTOSC is stable
CONFIG T3CMX = PORTB5 ;Timer3 Clock Input MUX bit ;T3CKI is on RB5
CONFIG P2BMX = PORTC0 ;P2B Input MUX bit ;P2B is on RC0
CONFIG MCLRE = EXTMCLR ;MCLR Pin Enable bit
;1 = MCLR pin enabled; RE3 input pin disabled
;0 = RE3 input pin enabled; MCLR disabled
CONFIG STVREN = ON ;Stack full/underflow will cause Reset ;Этот бит лучше всегда устанавливайте!
;STVREN – этот бит разрешает или нет сброс микроконтроллера при переполнении стека или при потере значения в стеке, когда нужно прочитать из стека, а там ничего нет.
;1 – сбрасывать микроконтроллер в такой ситуации.
;0 – не сбрасывать микроконтроллер.
CONFIG LVP = OFF ;Single-Supply ICSP disabled
;LVP – этот бит разрешает низковольтное программирование микроконтроллера
;0 – запретить низковольтное программирование.
;1 – разрешить низковольтное программирование.
CONFIG XINST = OFF ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF ;Background debugger enabled, RB6 and RB7 are dedicated to In-Circuit Debug
;DEBUG – этот бит разрешает или нет режим внутрисхемной отладки микроконтроллера. Т.е. отладки, когда PIC уже припаян на плате.
;0 – режим отладки разрешен. RB6 и RB7 используются для отладчика.
;1 – режим отладки выключен. RB6 и RB7 используются, как пины ввода/вывода.
CONFIG CP0 = OFF ;Block 0 code-protected
CONFIG CP1 = OFF ;Block 1 code-protected
CONFIG CP2 = OFF ;Block 2 code-protected
CONFIG CP3 = OFF ;Block 3 code-protected
;CP3(Code Protection) – бит защиты кода, находящегося в блоке 3 памяти программ
;0 – защита включена
;1 – защита отключена
CONFIG CPB = OFF ;Boot Block code-protected
;CPB – бит защиты кода, находящегося в загрузочном блоке памяти программ
;0 – защита включена
;1 – защита отключена
CONFIG CPD = OFF ;Data EEPROM code-protected
;CPD – бит защиты данных, хранящихся в энергонезависимой памяти данных (EEPROM). Это такая память данных, в которой, после отключения питания, данные не теряются.
;0 – защита включена
;1 – защита отключена
CONFIG WRT0 = OFF ;Block 0 write-protected
CONFIG WRT1 = OFF ;Block 1 write-protected
CONFIG WRT2 = OFF ;Block 2 write-protected
CONFIG WRT3 = OFF ;Block 3 write-protected
;WRT3 – бит защиты от записи блока 3 памяти программ
;0 – защита включена
;1 – защита отключена
CONFIG WRTC = OFF ;Configuration registers write-protected
;WRTC – бит защиты от записи битов конфигурации микроконтроллера
;0 – защита включена
;1 – защита отключена
CONFIG WRTB = OFF ;Boot Block write-protected
;WRTB – бит защиты от записи загрузочного блока памяти программ
;0 – защита включена
;1 – защита отключена
CONFIG WRTD = OFF ;Data EEPROM write-protected
;WRTD – бит защиты от записи данных, хранящихся в энергонезависимой памяти данных (EEPROM).
;0 – защита включена
;1 – защита отключена
CONFIG EBTR0 = OFF ;Block 0 protected from table reads executed in other blocks
CONFIG EBTR1 = OFF ;Block 1 protected from table reads executed in other blocks
CONFIG EBTR2 = OFF ;Block 2 protected from table reads executed in other blocks
CONFIG EBTR3 = OFF ;Block 3 protected from table reads executed in other blocks
;EBTR3 – бит защиты от чтения блока 3 памяти программ
;0 – защита включена
;1 – защита отключена
CONFIG EBTRB = OFF ;Boot Block protected from table reads executed in other blocks
;EBTRB – бит защиты от чтения загрузочного блока памяти программ
;0 – защита включена
;1 – защита отключена
;----------
#define SET_SSP1MSK B'00000000'
#define SET_SSP2MSK B'00000000'
#define SET_ADCON0 B'01001101'
#define SET_ADCON1 B'00001000'
#define SET_ADCON2 B'00101111'
#define SET_CM1CON0 B'00000000'
#define SET_CM2CON0 B'00000000'
#define SET_CM2CON1 B'00000000'
#define SET_OSCCON B'01110000' ;OSCCON: OSCILLATOR CONTROL REGISTER стр.32
#define SET_OSCCON2 B'10000000' ;OSCCON2: OSCILLATOR CONTROL REGISTER 2 стр.33
#define SET_OSCTUNE B'01000000' ;OSCTUNE: OSCILLATOR TUNING REGISTER стр.37
#define SET_ANSELA B'00000001' ; PORTA ANALOG SELECT REGISTER -вкл ацп на ножку стр.152
#define SET_ANSELB B'00000000'
#define SET_ANSELC B'10000000'
#define SET_TRISA B'11111001' ; TRISx: PORTx TRI-STATE REGISTER -Инциализация портов ввода/вывода стр.133 1-вход 0-выход
#define SET_TRISB B'00000100'
#define SET_TRISC_0 B'10000111'
#define SET_TRISC_1 B'10011111'
#define SET_TRISE B'00000000'
#define SET_PMD0 B'11111101' ; PERIPHERAL MODULE DISABLE REGISTER -вкл перефирии стр.56 (вкл. таймер 2)
#define SET_PMD1 B'11111111'
#define SET_PMD2 B'11111111'
#define SET_VREFCON0 B'00000000' ; VOLTAGE REFERENCE CONTROL REGISTER -вкл АЦП стр.341
#define SET_VREFCON1 B'00000000'
#define SET_VREFCON2 B'00000000'
#define SET_CTMUICON B'00000000' ; CTMU CONTROL REGISTER -??? стр.329
#define SET_CTMUCONL B'00000000'
#define SET_CTMUCONH B'00000000'
#define SET_SRCON0 B'00000000' ; SR LATCH CONTROL REGISTER -??? стр.336
#define SET_SRCON1 B'00000000'
#define SET_CCPTMRS1 B'00000000' ; PWM TIMER SELECTION CONTROL REGISTER -??? стр.204
#define SET_CCPTMRS0 B'00000000'
#define SET_PR2 .99 ; PRx Period registers -??? стр.173 (деление на 100 для таймера 2)
#define SET_PR4 B'00000000'
#define SET_PR6 B'00000000'
#define SET_T2CON B'01001111' ; TxCON: TIMER2/TIMER4/TIMER6 CONTROL REGISTER -??? стр.175 (настроен таймер 2 пост и предедлитель)
#define SET_T4CON B'00000000'
#define SET_T6CON B'00000000'
#define SET_T0CON B'00000000'
#define SET_T1CON B'00000000' ; TXCON: TIMER1/3/5 CONTROL REGISTER -??? стр.170
#define SET_T3CON B'00000000'
#define SET_T5CON B'00000000'
#define SET_T1GCON B'00000000' ; TXGCON: TIMER1/3/5 GATE CONTROL REGISTER -??? стр.171
#define SET_T3GCON B'00000000'
#define SET_T5GCON B'00000000'
#define SET_CCP1CON B'00000000' ; CCPxCON: STANDARD CCPx CONTROL REGISTER -??? стр.201
#define SET_CCP2CON B'00000000'
#define SET_CCP3CON B'00000000'
#define SET_CCP4CON B'00000000'
#define SET_CCP5CON B'00000000'
#define SET_RCON B'10011111'
#define SET_PSTR1CON B'00000000' ; PSTRxCON: PWM STEERING CONTROL REGISTER(1) -??? стр.206
#define SET_PSTR2CON B'00000000'
#define SET_PSTR3CON B'00000000'
#define SET_ECCP1AS B'00000000' ; ECCPxAS: CCPX AUTO-SHUTDOWN CONTROL REGISTER -??? стр.205
#define SET_ECCP2AS B'00000000'
#define SET_ECCP3AS B'00000000'
#define SET_PWM1CON B'00000000' ; PWMxCON: ENHANCED PWM CONTROL REGISTER -??? стр.206
#define SET_PWM2CON B'00000000'
#define SET_PWM3CON B'00000000'
#define SET_SSP1CON1 B'00000000' ; SSPxCON1: SSPx CONTROL REGISTER -??? стр.256
#define SET_SSP2CON1 B'00000000' ; тактирование от внутрененго генератора/16 = 1 Мгц. бит 0-3
#define SET_SSP1CON2 B'00000000' ; SSPxCON2: SSPx CONTROL REGISTER -??? стр.258
#define SET_SSP2CON2 B'00000000'
#define SET_SSP1CON3 B'00000000' ; SSPxCON3: SSPx CONTROL REGISTER -??? стр.258
#define SET_SSP2CON3 B'00000000'
#define SET_SSP1STAT B'00000000' ; SSPxSTAT: SSPx STATUS REGISTER -??? стр.255
#define SET_SSP2STAT B'00000000'
#define SET_BAUDCON1 B'00000000' ; SSPx Receive Buffer/Transmit Register -??? стр.217
#define SET_BAUDCON2 B'00000000'
#define SET_RCSTA1 B'00000000' ; RCSTAX: RECEIVE STATUS AND CONTROL REGISTER -??? стр.273
#define SET_RCSTA2 B'00000000'
#define SET_TXSTA1 B'00000000' ; TXSTAX: TRANSMIT STATUS AND CONTROL REGISTER -??? стр.272
#define SET_TXSTA2 B'00000000'
#define SET_SPBRG1 B'00000000' ; EUSARTx Baud Rate Generator, Low Byte -??? стр.290
#define SET_SPBRG2 B'00000000'
#define SET_SPBRGH1 B'00000000' ; EUSARTx Baud Rate Generator, High Byte -??? стр.290
#define SET_SPBRGH2 B'00000000'
#define SET_INTCON B'00000000' ;INTCON: INTERRUPT CONTROL REGISTER -??? стр.115
#define SET_INTCON2 B'00000000' ;INTCON2: INTERRUPT CONTROL 2 REGISTER -??? стр.116
#define SET_INTCON3 B'00000000' ;INTCON3: INTERRUPT CONTROL 3 REGISTER -??? стр.117
#define SET_IPR1 B'00000010' ; IPRx: PERIPHERAL INTERRUPT PRIORITY REGISTER x -??? стр.130 -высокое прерывание таймера 2
#define SET_IPR2 B'00000000'
#define SET_IPR3 B'00000000'
#define SET_IPR4 B'00000000'
#define SET_IPR5 B'00000000'
#define SET_PIE1 B'00000010' ; PIEx: PERIPHERAL INTERRUPT ENABLE (FLAG) REGISTER x -??? стр.130
#define SET_PIE2 B'00000000'
#define SET_PIE3 B'00000000'
#define SET_PIE4 B'00000000'
#define SET_PIE5 B'00000000'
#define SET_SLRCON B'00000000' ; SLRCON: SLEW RATE CONTROL REGISTER -??? стр.156
#define SET_WPUB B'00000000' ; WPUB: WEAK PULL-UP PORTB REGISTER -??? стр.156
#define SET_IOCB B'00000000' ; IOCB: INTERRUPT-ON-CHANGE PORTB CONTROL REGISTER -??? стр.156
;----------
#define _KEYRIGHT PORTA,5
#define _KEYLEFT PORTA,4
#define _KEYUP PORTC,0
#define _KEYDOWN PORTC,1
#define _KEYOK PORTA,7
;----------
#define _POWERON LATA,2
#define _OLEDPON LATA,1
;----------
#define _OLED_DC LATB,0
#define _OLED_RES LATB,4
#define _OLED_CS LATB,5
;----------
#define _SIGPIO2 PORTA,3
#define _SI_SEN LATC,5
#define _SI_RST LATC,6
#define _SI_SCL LATC,3
#define _SI_SDIO LATC,4
;----------
#define SETPR2 .255
#define SETPR4 .255
#define SETPR6 .249
;----------
#define OLED_INIT_TABLE_LOW LOW OLED_INIT_TABLE
#define OLED_INIT_TABLE_HIGH HIGH OLED_INIT_TABLE
#define OLED_INIT_TABLE_UPPER UPPER OLED_INIT_TABLE
#define CODE_PAGE_6X8_LOW LOW CODE_PAGE_6X8
#define CODE_PAGE_6X8_HIGH HIGH CODE_PAGE_6X8
#define CODE_PAGE_6X8_UPPER UPPER CODE_PAGE_6X8
CBLOCK 100
TEMPL_STATUS
TEMPL_WREG
TEMPL_BSR
TEMPH_STATUS
TEMPH_WREG
TEMPH_BSR
INT_COUNT
INT_STEPS
TABLE_STEPS
TEMP_1
TEMP_2
TEMP_3
TEMP_FSRH
TEMP_FSRL
TEMP_TBLPTRH
TEMP_TBLPTRL
CHAR_COLS
CODE_PAGE_START
FLAG
ENDC
#define FLAG_SPI FLAG,0
;*************************************** ***************************************
ORG 0000
GOTO INIT
ORG 0008 ;High Priority Interrupt Generation
GOTO PRIORITY_HIGH
ORG 0018 ;Low Priority Interrupt Generation
GOTO PRIORITY_LOW
;*************************************** ***************************************
INIT
MOVLW 0f
MOVWF BSR
MOVLW SET_SSP1MSK
MOVWF SSP1MSK
MOVLW SET_SSP2MSK
MOVWF SSP2MSK
MOVLW SET_ADCON0
MOVWF ADCON0
MOVLW SET_ADCON1
MOVWF ADCON1
MOVLW SET_ADCON2
MOVWF ADCON2
MOVLW SET_CM1CON0
MOVWF CM1CON0
MOVLW SET_CM2CON0
MOVWF CM2CON0
MOVLW SET_CM2CON1
MOVWF CM2CON1
MOVLW SET_OSCCON
MOVWF OSCCON
MOVLW SET_OSCCON2
MOVWF OSCCON2
MOVLW SET_OSCTUNE
MOVWF OSCTUNE
MOVLW SET_ANSELA
MOVWF ANSELA
MOVLW SET_ANSELB
MOVWF ANSELB
MOVLW SET_ANSELC
MOVWF ANSELC
MOVLW SET_TRISA
MOVWF TRISA
MOVLW SET_TRISB
MOVWF TRISB
MOVLW SET_TRISC_0
MOVWF TRISC
MOVLW SET_TRISE
MOVWF TRISE
CLRF LATA
CLRF LATB
CLRF LATC
MOVLW SET_PMD0
MOVWF PMD0
MOVLW SET_PMD1
MOVWF PMD1
MOVLW SET_PMD2
MOVWF PMD2
MOVLW SET_VREFCON0
MOVWF VREFCON0
MOVLW SET_VREFCON1
MOVWF VREFCON1
MOVLW SET_VREFCON2
MOVWF VREFCON2
MOVLW SET_CTMUICON
MOVWF CTMUICON
MOVLW SET_CTMUCONL
MOVWF CTMUCONL
MOVLW SET_CTMUCONH
MOVWF CTMUCONH
MOVLW SET_SRCON0
MOVWF SRCON0
MOVLW SET_SRCON1
MOVWF SRCON1
MOVLW SET_CCPTMRS1
MOVWF CCPTMRS1
MOVLW SET_CCPTMRS0
MOVWF CCPTMRS0
MOVLW SET_PR2
MOVWF PR2
MOVLW SET_PR4
MOVWF PR4
MOVLW SET_PR6
MOVWF PR6
MOVLW SET_T2CON
MOVWF T2CON
MOVLW SET_T4CON
MOVWF T4CON
MOVLW SET_T6CON
MOVWF T6CON
MOVLW SET_T0CON
MOVWF T0CON
MOVLW SET_T1CON
MOVWF T1CON
MOVLW SET_T3CON
MOVWF T3CON
MOVLW SET_T5CON
MOVWF T5CON
MOVLW SET_T1GCON
MOVWF T1GCON
MOVLW SET_T3GCON
MOVWF T3GCON
MOVLW SET_T5GCON
MOVWF T5GCON
MOVLW SET_CCP1CON
MOVWF CCP1CON
MOVLW SET_CCP2CON
MOVWF CCP2CON
MOVLW SET_CCP3CON
MOVWF CCP3CON
MOVLW SET_CCP4CON
MOVWF CCP4CON
MOVLW SET_CCP5CON
MOVWF CCP5CON
MOVLW SET_RCON
MOVWF RCON
MOVLW SET_PSTR1CON
MOVWF PSTR1CON
MOVLW SET_PSTR2CON
MOVWF PSTR2CON
MOVLW SET_PSTR3CON
MOVWF PSTR3CON
MOVLW SET_ECCP1AS
MOVWF ECCP1AS
MOVLW SET_ECCP2AS
MOVWF ECCP2AS
MOVLW SET_ECCP3AS
MOVWF ECCP3AS
MOVLW SET_PWM1CON
MOVWF PWM1CON
MOVLW SET_PWM2CON
MOVWF PWM2CON
MOVLW SET_PWM3CON
MOVWF PWM3CON
MOVLW SET_SSP1CON1
MOVWF SSP1CON1
MOVLW SET_SSP1CON2
MOVWF SSP1CON2
MOVLW SET_SSP2CON2
MOVWF SSP2CON2
MOVLW SET_SSP1CON3
MOVWF SSP1CON3
MOVLW SET_SSP2CON3
MOVWF SSP2CON3
MOVLW SET_SSP1STAT
MOVWF SSP1STAT
MOVLW SET_BAUDCON1
MOVWF BAUDCON1
MOVLW SET_BAUDCON2
MOVWF BAUDCON2
MOVLW SET_RCSTA1
MOVWF RCSTA1
MOVLW SET_RCSTA2
MOVWF RCSTA2
MOVLW SET_TXSTA1
MOVWF TXSTA1
MOVLW SET_TXSTA2
MOVWF TXSTA2
MOVLW SET_SPBRG1
MOVWF SPBRG1
MOVLW SET_SPBRG2
MOVWF SPBRG2
MOVLW SET_SPBRGH1
MOVWF SPBRGH1
MOVLW SET_SPBRGH2
MOVWF SPBRGH2
MOVLW SET_INTCON
MOVWF INTCON
MOVLW SET_INTCON2
MOVWF INTCON2
MOVLW SET_INTCON3
MOVWF INTCON3
MOVLW SET_IPR1
MOVWF IPR1
MOVLW SET_IPR2
MOVWF IPR2
MOVLW SET_IPR3
MOVWF IPR3
MOVLW SET_IPR4
MOVWF IPR4
MOVLW SET_IPR5
MOVWF IPR5
MOVLW SET_PIE1
MOVWF PIE1
MOVLW SET_PIE2
MOVWF PIE2
MOVLW SET_PIE3
MOVWF PIE3
MOVLW SET_PIE4
MOVWF PIE4
MOVLW SET_PIE5
MOVWF PIE5
MOVLW SET_SLRCON
MOVWF SLRCON
MOVLW SET_WPUB
MOVWF WPUB
MOVLW SET_IOCB
MOVWF IOCB
BCF _OLED_RES
BSF _OLED_CS
;*************************************** ;Clear Memory
LFSR FSR0,100 ; чистка памяти от 100h до F00h
CLEAR
CLRF POSTINC0 ; очистка памяти по адресу в FSR0 и его инкремент
MOVLW B'00001111' ; проверка старшего байта не равен ли он F
CPFSEQ FSR0H,W
GOTO CLEAR
;***************************************
MOVLW .1 ; работа с первым банком памяти
MOVWF BSR
;***************************************
BSF INTCON,GIEH ;Global Interrupt Enable
BSF INTCON,GIEL ;Peripheral Interrupt Enable
;***************************************
MOVLW .5 ; 200 милисек.
CALL WAIT_W
CALL INIT_SPI
MOVLW .1 ;работа с первым банком памяти
MOVWF BSR
CALL INIT_OLED
;*************************************** ***************************************
;*************************************** ***************************************
MAIN
; CALL MOVE_OLED_MEMORY
; CALL OLED_PRINT
GOTO MAIN
;*************************************** ***************************************
;*************************************** ***************************************
PRIORITY_HIGH
MOVFF STATUS, TEMPH_STATUS
MOVFF WREG, TEMPH_WREG
MOVFF BSR, TEMPH_BSR
MOVLW .1 ;работа с первым банком памяти
MOVWF BSR
BTFSC PIR1,TMR2IF ; пропустить след. строку если TMR2IF бит равен 0
GOTO INT_TMR2
BTFSC PIR3,SSP2IF ; пропустить след. строку если SSP2IF бит равен 0
GOTO INT_SPI
GOTO INT_ENDH ; завершить прерывание если ниодин флаг не ожидался
INT_TMR2 ; прерывание по таймеру 2
BCF PIR1,TMR2IF ; очистка TMR2IF
TSTFSZ INT_COUNT ; TEST 0
DECF INT_COUNT,F ; INT_COUNT = INT_COUNT - 1; ( F = 1 откуда взяли туда и пишем ) ( W = 0 пишем в WREG )
GOTO INT_ENDH
INT_SPI ; прерывание SPI
BCF PIR3,SSP2IF ; сбросить флаг прерывания бит равен 0
MOVF SSP2BUF,W ; после передачи прочитать байт в WREG
BCF FLAG_SPI ; сбросить FLAG_SPI бит равен 0
GOTO INT_ENDH
INT_ENDH
MOVFF TEMPH_STATUS, STATUS
MOVFF TEMPH_WREG, WREG
MOVFF TEMPH_BSR, BSR
RETFIE FAST
;*************************************** ***************************************
;*************************************** ***************************************
PRIORITY_LOW
MOVFF STATUS, TEMPL_STATUS
MOVFF WREG, TEMPL_WREG
MOVFF BSR, TEMPL_BSR
INT_ENDL
MOVFF TEMPL_STATUS, STATUS
MOVFF TEMPL_WREG, WREG
MOVFF TEMPL_BSR, BSR
RETFIE
;*************************************** ***************************************
;*************************************** ***************************************
OLED_INIT_TABLE
DB 0AE,0D5
DB 0F0,0A8
DB 03F,0D3
DB 000,040
DB 08D,014
DB 0A1,0C8
DB 0DA,012
DB 081,0CF
DB 0D9,0F1
DB 0DB,040
DB 0A4,0A6
;*************************************** ***************************************
;*************************************** *************************************** ***************************************
INIT_OLED
BSF _OLED_RES
BCF _OLED_CS
BSF _OLED_DC ; передача команд активный 0
MOVLW .5 ; 15 милисек.
CALL WAIT_W
MOVLW 0AE
MOVWF SSP2BUF
CALL SPI_WAIT
MOVLW OLED_INIT_TABLE_UPPER ; Load TBLPTR with the base
MOVWF TBLPTRU ; address of the memory block
MOVLW OLED_INIT_TABLE_HIGH
MOVWF TBLPTRH
MOVLW OLED_INIT_TABLE_LOW
MOVWF TBLPTRL
MOVLW .22 ;число байт команд
MOVWF TABLE_STEPS
TABLE_COUNT
TBLRD*+ ; read into TABLAT, and inc чтение из таблицы и инкремент
MOVFF TABLAT, SSP2BUF ; запись первой считанной строки в spi2. на плате так подключенно
CALL SPI_WAIT
DECF TABLE_STEPS,F
BTFSS STATUS,Z ; условие пропустить след сроку если таблица закончилась
GOTO TABLE_COUNT
CLRF TEMP_1
CLRF TEMP_2
CLRF TEMP_3
OLED_CLEAR
MOVFF TEMP_3, SSP2BUF
CALL SPI_WAIT
INCF TEMP_1,F
BTFSC STATUS,C ; проверяем статус переполнения, если не равен 0 переполнен выполняем след срочку
INCF TEMP_2,F
BTFSS TEMP_2,2 ; проверяем не достиг ли 1024, второй байт = 1, тогда пропускаем строчку.
GOTO OLED_CLEAR
BSF _OLEDPON ; подключение питания дисплея VBAT
MOVLW .200 ; 200 милисек.
CALL WAIT_W
BCF _OLED_DC ; передача команд активный 0
MOVLW 0AF
MOVWF SSP2BUF ; запись первой считанной строки в spi2. на плате так подключенно
CALL SPI_WAIT
BSF _OLED_DC ; передача данных активный 1
BSF _OLED_CS
RETURN
;*************************************** *************************************** ***************************************
;*************************************** *************************************** ***************************************
MOVE_OLED_MEMORY
MOVLW CODE_PAGE_6X8_UPPER ; Load TBLPTR with the base
MOVWF TBLPTRU ; address of the memory block
MOVLW CODE_PAGE_6X8_HIGH
MOVWF TBLPTRH
MOVLW CODE_PAGE_6X8_LOW
MOVWF TBLPTRL
;*************************************** ;SET_OLED_MASK
LFSR FSR0, 0b00 ; запись памяти от B00h до F00h
SET_OLED_MASK
TBLRD*+
MOVFF TABLAT, TEMP_FSRL
TBLRD*+
MOVFF TABLAT, TEMP_FSRH
MOVFF TBLPTRL, TEMP_TBLPTRL
MOVFF TBLPTRH, TEMP_TBLPTRH
MOVFF TEMP_FSRH, TBLPTRH
MOVFF TEMP_FSRL, TBLPTRL
MOVLW .6
MOVWF CHAR_COLS
MOVLW 04d
NEXT_COL
ADDWF TBLPTRL, F
DECF CHAR_COLS
TSTFSZ CHAR_COLS
GOTO NEXT_COL
MOVLW .6
MOVWF CHAR_COLS
NEXT_COLL
TBLRD*+
MOVFF TABLAT, POSTINC0
DECF CHAR_COLS
TSTFSZ CHAR_COLS
GOTO NEXT_COLL
MOVFF TEMP_TBLPTRH, TBLPTRH
MOVFF TEMP_TBLPTRL, TBLPTRL
MOVLW B'00001111' ; проверка старшего байта не равен ли он 0F
CPFSEQ FSR0H,W
GOTO SET_OLED_MASK
;***************************************
RETURN
;*************************************** *************************************** ***************************************
;*************************************** *************************************** ***************************************
OLED_PRINT
BSF _OLED_DC ; передача данных активный 1
LFSR FSR0, 0b00 ; запись памяти от B00h до F00h
OLED_PRINT_WHILE
MOVFF POSTINC0, SSP2BUF
CALL SPI_WAIT
MOVLW B'00001111' ; проверка старшего байта не равен ли он 0F
CPFSEQ FSR0H,W
GOTO OLED_PRINT_WHILE
RETURN
;*************************************** *************************************** ***************************************
;*************************************** *************************************** ***************************************
SPI_WAIT
BSF FLAG_SPI
WAIT_FLAG
BTFSC FLAG_SPI ;TEST 0
GOTO WAIT_FLAG
RETURN
;*************************************** *************************************** ***************************************
INIT_SPI
MOVLW 0f
MOVWF BSR
BCF PMD1, MSSP2MD ; вкл. spi2
BSF SSP2CON1, SSPM0 ; clock=fosc/16
BCF SSP2CON1, SSPM1
BCF SSP2CON1, SSPM2
BCF SSP2CON1, SSPM3
BSF SSP2CON1, CKP ; Idle state for clock is low
BCF SSP2STAT, CKE ; Transmit occurs on transition from active to idle clock state
BCF SSP2STAT, SMP ; Data is sampled at middle of data output time
BSF SSP2CON1, SSPEN ; Enable SPI Port
MOVLW .3
MOVWF SSP2ADD ; SCLx pin clock period = ((3 + 1) *4)/FOSC
BSF IPR3, SSP2IP ; Synchronous Serial Port 2 Interrupt Priority bit 1 = High priority
BSF PIE3, SSP2IE ; TMR5 Gate Interrupt Enable bit 1 = Enabled
RETURN
;*************************************** *************************************** ***************************************
WAIT_W
MOVWF INT_COUNT
WAIT_RES
TSTFSZ INT_COUNT ;TEST 0
GOTO WAIT_RES
RETURN
;*************************************** *************************************** ***************************************
END
Ср май 11, 2016 14:10:19
BSF _OLED_DC
BCF _OLED_RES
BSF _OLED_CS
BSF _OLED_RES
BCF _OLED_CS
Ср май 11, 2016 14:13:24
BSF _OLED_RES
BCF _OLED_DC
BCF _OLED_CS
Ср май 11, 2016 17:58:46
Чт май 12, 2016 17:39:07
Пт май 13, 2016 00:15:45
Пт май 13, 2016 00:51:59
retfie FAST
Пт май 13, 2016 01:30:38
INIT_ADC
; Настройка АЦП. Измеряем два канала: AN0 и AN19
MOVLW 0f
MOVWF BSR
BSF TRISA,TRISA0 ; 1 - Как вход
BSF TRISC,TRISC7 ; 1 - Как вход
BSF ANSELA,ANSA0 ; 1 - AN0 как аналоговый вход
BSF ANSELC,ANSC7 ; 1 - AN19 как аналоговый вход
MOVLW B'01001101' ; Выбрали канал AN19
MOVWF ADCON0
MOVLW B'00001000' ; PVCFG = 10 = A/D VREF+ connected to internal signal, FVR BUF2 (bit 2:3)
MOVWF ADCON1 ; NVCFG = 00 = A/D VREF- connected to internal signal, AVSS (bit 0:1)
MOVLW B'00101111' ; ADCS = 111 частота тактирования (bit 0:2) clock derived from a dedicated internal oscillator = 600 kHz nominal
MOVWF ADCON2 ; ACQT = 101 = 12 TAD (bit 3:5)
BCF ADCON2,ADFM ; 0 - Левое выравнивание (удобно при использовании 8 бит)
BCF PIR1,ADIF ; 0 - Сброс флага прерываний АЦП
BSF PIE1,ADIE ; 1 - Разрешили прерывание АЦП
BCF IPR1,ADIP ; 0 - Низкий приоритет прерывания
BSF ADCON0,ADON ; Вкл. модуль АЦП
RETURN
PRIORITY_LOW
MOVFF STATUS, TEMP_L_STATUS
MOVFF WREG, TEMP_L_WREG
MOVFF BSR, TEMP_L_BSR
MOVLW .1 ;работа с первым банком памяти
MOVWF BSR
BTFSC PIR1,ADIF ; пропустить след. строку если ADIF бит равен 0 (прерывание АЦП)
GOTO INT_ADC
GOTO INT_ENDL ; завершить прерывание если ниодин флаг не ожидался
INT_ADC
;MOVFF ADRESH, ADC_RESULT
MOVLW .255
MOVWF ADC_RESULT
GOTO INT_ENDH
INT_ENDL
MOVFF TEMP_L_STATUS, STATUS
MOVFF TEMP_L_WREG, WREG
MOVFF TEMP_L_BSR, BSR
RETFIE
Пт май 13, 2016 01:49:37
Пт май 13, 2016 02:04:17
BSF INTCON,GIEH ;Global Interrupt Enable
BSF INTCON,GIEL ;Peripheral Interrupt Enable
Пт май 13, 2016 02:14:06
Пт май 13, 2016 07:58:21
BSF ADCON0,GO ;Start conversion
ADCPoll:
BTFSC ADCON0,GO ;Is conversion done?
BRA ADCPoll ;No, test again
MOVFF ADRESH, ADC_RESULT
Пт май 13, 2016 08:21:54
Пт май 13, 2016 08:39:50
BSF ADCON0, GO ;Start conversion
ADCPoll:
BTFSC ADCON0, GO ;Is conversion done?
BRA ADCPoll ;No, test again
Пт май 13, 2016 08:50:35
Пт май 13, 2016 09:56:55
Пт май 13, 2016 10:37:17
Пт май 13, 2016 10:40:15
INIT_ADC
; Настройка АЦП. Измеряем два канала: AN0 и AN19
MOVLW 0f
MOVWF BSR
BSF TRISA,TRISA0 ; 1 - Как вход
BSF TRISC,TRISC7 ; 1 - Как вход
BSF ANSELA,ANSA0 ; 1 - AN0 как аналоговый вход
BSF ANSELC,ANSC7 ; 1 - AN19 как аналоговый вход
MOVLW B'01001100' ; Выбрали канал AN19
MOVWF ADCON0
MOVLW B'00001000' ; PVCFG = 10 = A/D VREF+ connected to internal signal, FVR BUF2 (bit 2:3)
MOVWF ADCON1 ; NVCFG = 00 = A/D VREF- connected to internal signal, AVSS (bit 0:1)
MOVLW B'00101111' ; ADCS = 111 частота тактирования (bit 0:2) clock derived from a dedicated internal oscillator = 600 kHz nominal
MOVWF ADCON2 ; ACQT = 101 = 12 TAD (bit 3:5)
BCF ADCON2,ADFM ; 0 - Левое выравнивание (удобно при использовании 8 бит)
BCF PIR1,ADIF ; 0 - Сброс флага прерываний АЦП
BSF PIE1,ADIE ; 1 - Разрешили прерывание АЦП
BCF IPR1,ADIP ; 0 - Низкий приоритет прерывания
BSF ADCON0,ADON ; Вкл. модуль АЦП
BSF ADCON0, GO ; Start conversion
RETURN
PRIORITY_LOW
MOVFF STATUS, TEMP_L_STATUS
MOVFF WREG, TEMP_L_WREG
MOVFF BSR, TEMP_L_BSR
MOVLW 001 ;работа с первым банком памяти
MOVWF BSR
BTFSC PIR1, ADIF ; пропустить след. строку если ADIF бит равен 0 (прерывание АЦП)
GOTO INT_ADC
GOTO INT_ENDL ; завершить прерывание если ни один флаг не ожидался
INT_ADC
BCF PIR1, ADIF
MOVFF ADRESH, ADC_RESULT
BSF ADCON0, GO ;Start conversion
GOTO INT_ENDL
INT_ENDL
MOVFF TEMP_L_STATUS, STATUS
MOVFF TEMP_L_WREG, WREG
MOVFF TEMP_L_BSR, BSR
RETFIE