Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

PIC + SSD1306

Ср май 11, 2016 13:19:14

Добрый день.

Начну по порядку. Имею PIC18F26K22F и подключенный к нему через spi2 oled1306.

OLED D0 подключен к RB1 (sck2/scl2)
OLED D1 подключен к RB3 (sdo2)

OLED RES подключен к RB4
OLED CS подключен к RB5
OLED D/C подключен к RB0

Подключение питание VBAT к дисплею через транзисторный ключ на ножке мк RA1.
Перехожу к коду. Тактируется от внутреннего генератора.
Код:
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


инициализирую spi2

Код:
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

дальше как в даташите инициализации дисплея сказано отправляю 22 команды
пример отправки одной.

Код:
   MOVLW 0AE
   MOVWF SSP2BUF
   CALL SPI_WAIT


SPI_WAIT подпрограмма которая ждет поднятия флага в прерывании высокого уровня
сбрасывает флаг и читает регистр.
Код:
   
BCF PIR3,SSP2IF         
   MOVF SSP2BUF,W   

потом отправляется след команда.

После отправки всех команд открываю питание VbAT на дисплей.

К сожалению он не загорается (. Я уже не знаю в чем проблема и где я мог накосячить.

приборов к сожалению у меня нормальных нет. Использую светодиод :)

Re: PIC + SSD1306

Ср май 11, 2016 13:58:33

Выкладывайте весь исходник.
Но, поскольку лично я его уже видел - спрошу:
В подпрограмме INIT_OLED у вас есть строка:
Код:
   BSF _OLED_DC                ; передача команд активный 0

Что этим хотели сказать при INIT-е OLED-а?
Кстати, рекомендуется на линии D/C устанавливать уровень до обращения к индикатору по SPI (линия CS).

Re: PIC + SSD1306

Ср май 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




Последний раз редактировалось KyJek Ср май 11, 2016 14:23:16, всего редактировалось 1 раз.

Re: PIC + SSD1306

Ср май 11, 2016 14:10:19

Код:
BSF _OLED_DC


0 - это передача команд
1- это передача данных т.е. уже рисование ( пока до этого далеко )

В самом начале программы у меня

Код:
BCF _OLED_RES
   BSF _OLED_CS


а при начале инициализации дисплея

Код:
   BSF _OLED_RES
   BCF _OLED_CS

Re: PIC + SSD1306

Ср май 11, 2016 14:13:24

Оу . т.е. я при ините не опустил, а поднял D/C ?

получается правильно в интите оледа

Код:
BSF _OLED_RES
   BCF _OLED_DC                
   BCF _OLED_CS

Re: PIC + SSD1306

Ср май 11, 2016 17:58:46

Заработало, но с очисткой какие то проблемы

Re: PIC + SSD1306

Чт май 12, 2016 17:39:07

Вы в курсе относительно сохранения контекста в shadow регистрах?
Зачем вы сохраняете контекст, восстанавливаете его, а затем выходите по FAST?
:dont_know:

Re: PIC + SSD1306

Пт май 13, 2016 00:15:45

нет не в курсе. первый раз пишу программу. делаю это для того чтобы когда попал в прерывание сохранить старое значение регистров.

Re: PIC + SSD1306

Пт май 13, 2016 00:51:59

В 18-Х ПИКах при входе в прерывание происходит АВТОМАТИЧЕСКОЕ сохранение контекста в невидимых (Shadow) регистрах.
Это происходит БЕЗУСЛОВНО. Это нельзя отключить.
А вот восстанавливается сохраненный в этих регистрах контекст лишь в случае, если при выходе из прерывания использован параметр FAST:
Код:
retfie FAST

То есть Вы совершенно впустую сохраняете и восстанавливаете контекст своими силами. Автоматический процесс сохранения-восстановления находится СНАРУЖИ Ваших действий. То есть сохранение происходит раньше, а восстановление позже.
ЗЫ. Писать обработчик по вектору 0х18 (нижний приоритет) при его НЕиспользовании нет никакой необходимости. Попасть туда программа все равно не сможет.

Re: PIC + SSD1306

Пт май 13, 2016 01:30:38

Знаю. это задел на будущее. Вот которое сейчас пытаюсь реализовать.
Почему то не работают прерывания от ацп.
у меня AN19
Код:
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

Re: PIC + SSD1306

Пт май 13, 2016 01:49:37

Откройте даташит на контроллер в разделе Interrupts (9-ый параграф).
И посмотрите СХЕМУ логики генерации прерываний (фиг. 9-1).
Обратите внимание на ВЫХОДНЫЕ ВЕНТИЛИ обоих приоритетов.
Там имеют место быть УСЛОВИЯ РАЗРЕШЕНИЯ этой самой генерации реквеста.
И находятся биты этих условий в регистре INTCON.
То есть для входа в прерывание необходимо не только частное периферийное разрешение (PIE), но и групповое (PEIE), а так же глобальные (GIEH/GIEL).

Re: PIC + SSD1306

Пт май 13, 2016 02:04:17

Если посмотреть код который я выкладывал выше то я разрешил глобальное прерывание.
Код:
  BSF INTCON,GIEH      ;Global Interrupt Enable
   BSF INTCON,GIEL      ;Peripheral Interrupt Enable

Re: PIC + SSD1306

Пт май 13, 2016 02:14:06

Тогда все делается очень просто.
Вы вставляете (временно) ПРОГРАММНОЕ ожидание завершения преобразования (не флаг прерывания, а бит GO/DONE) и по этому условию ставите брекпойнт в отладчике.
Далее смотрите состояние разрешений и флага по генерации прерываний от АЦП.
А прежде просто ставите брекпойнт на входе обработчика по 18 вектору и убеждаетесь в справедливости Ваших первоначальных предположений...

Re: PIC + SSD1306

Пт май 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


значение получаю, а вот в прерывание при этом все равно не вываливаюсь.

Значение еще какое то странное.

Re: PIC + SSD1306

Пт май 13, 2016 08:21:54

Да Бог с ним, со значением ADRES. Речь не о нем, а о флаге ADIF и битах ADIE, PEIE, GIE.
И брекпойнтов нужно поставить ДВА: один прямо прямо на movff, а второй на первой строке обработчика прерываний.
И к тому же, лучше пока перенести обработчик АЦП на вектор 8. И когда заработает, тогда и вернуть на 18-ый.

Re: PIC + SSD1306

Пт май 13, 2016 08:39:50

я отлаживаю в MPLAB 8.92 дебагером MPLAB SIM.

Хм. сделал как Вы написали и пока инит висел в цикле

Код:
BSF    ADCON0, GO       ;Start conversion
   ADCPoll:
   BTFSC    ADCON0, GO       ;Is conversion done?
   BRA    ADCPoll       ;No, test again


Прерывание низкого уровня было вызвано. И даже с поднятым флагом что это прерывание АЦП. Т.к. отлаживал отладчиком, а не в железе результат 0000.

Больше прерывание не вызывается, а почему?

Re: PIC + SSD1306

Пт май 13, 2016 08:50:35

Если честно, то я ничего не понял...
Нулевой результат в СИМ вполне естественнен. Но само тактирование АЦП в СИМе симулируется корректно.
Выводите в Watch все интересующие Вас регистры, устанавливаете коэффициент деления для Tad небольшой, чтобы не тыкать много раз шаги, и тупо проходите по шагам от запуска GO. Наблюдая при этом все флаги до входа в обработчик и после выхода из обработчика.

Re: PIC + SSD1306

Пт май 13, 2016 09:56:55

Прерывание вызывается только в том случае если бит go поднят.
При вызове прерывания он автоматически сбрасывается и поднимается флаг PIR1, ADIF.
Если в дальнейшем флаг go не понимать то больше прерываний возникать не будет.

Возможно надо в обработчик прерывания добавить поднятие флага Go?

Re: PIC + SSD1306

Пт май 13, 2016 10:37:17

У меня такое ощущение, что даташит Вы в принципе не считаете необходимым даже бегло прочитать...
Вообще то GO - это ЗАПУСК ПРЕОБРАЗОВАНИЯ. Одного преобразования. Единственного.
По его завершению это бит СБРАСЫВАЕТСЯ, что АВТОМАТИЧЕСКИ приводит к поднятию флага ADIF.
Если Вы желаете автоматизировать процесс поднятия GO, то нужно почитать даташит, где есть описание этой функции через CCP5 и CTMU, что позволяет хардварно синхронизировать процесс поднятия GO с различными алгоритмами.
Просто цепочечного запуска по завершению предыдущего преобразования нет. Вы это можете сделать самостоятельно прямо при выходе из обработчика прерываний.
И не забудьте, что ДО начала преобразования должен успеть зарядиться конденсатор УВХ, что несложно обеспечить выбором автоматического эквизишн тайма, либо обеспечения необходимого времени между запусками алгоритмом...

Re: PIC + SSD1306

Пт май 13, 2016 10:40:15

написал вот так инит добавил в конце строку

BSF ADCON0, GO ; Start conversion

Код:

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


и чуточку изменил прерывание. поскольку флаг go сбрасывается когда случается прерывание и больше прерываний не случается если его не поднимать написал поднятие флага в прерывании.

Код:

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


Ответить