PIC + SSD1306

Поклонники продукции Microchip Technology Inc тусуются тут.
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

PIC + SSD1306

Сообщение KyJek »

Добрый день.

Начну по порядку. Имею 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 на дисплей.

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

приборов к сожалению у меня нормальных нет. Использую светодиод :)
Реклама
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: PIC + SSD1306

Сообщение Albert_V »

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

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

	BSF _OLED_DC	 				; передача команд активный 0
Что этим хотели сказать при INIT-е OLED-а?
Кстати, рекомендуется на линии D/C устанавливать уровень до обращения к индикатору по SPI (линия CS).
Реклама
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

Re: PIC + SSD1306

Сообщение KyJek »

Спойлер

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

;*****************************************************************************
	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 раз.
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

Re: PIC + SSD1306

Сообщение KyJek »

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

BSF _OLED_DC


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

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

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

BCF _OLED_RES
	BSF _OLED_CS
а при начале инициализации дисплея

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

	BSF _OLED_RES
	BCF _OLED_CS
Реклама
Эиком - электронные компоненты и радиодетали
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

Re: PIC + SSD1306

Сообщение KyJek »

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

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

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

BSF _OLED_RES
	BCF _OLED_DC	 				
	BCF _OLED_CS
Реклама
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

Re: PIC + SSD1306

Сообщение KyJek »

Заработало, но с очисткой какие то проблемы
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC + SSD1306

Сообщение КРАМ »

Вы в курсе относительно сохранения контекста в shadow регистрах?
Зачем вы сохраняете контекст, восстанавливаете его, а затем выходите по FAST?
:dont_know:
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

Re: PIC + SSD1306

Сообщение KyJek »

нет не в курсе. первый раз пишу программу. делаю это для того чтобы когда попал в прерывание сохранить старое значение регистров.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC + SSD1306

Сообщение КРАМ »

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

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

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

Re: PIC + SSD1306

Сообщение KyJek »

Знаю. это задел на будущее. Вот которое сейчас пытаюсь реализовать.
Почему то не работают прерывания от ацп.
у меня 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
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC + SSD1306

Сообщение КРАМ »

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

Re: PIC + SSD1306

Сообщение KyJek »

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

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

  BSF INTCON,GIEH      ;Global Interrupt Enable
   BSF INTCON,GIEL      ;Peripheral Interrupt Enable
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC + SSD1306

Сообщение КРАМ »

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

Re: PIC + SSD1306

Сообщение KyJek »

если Я Вас правильно понял, то я уже что то подобное делал.

Добавлял в конце инита такие строки

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


BSF ADCON0,GO ;Start conversion
ADCPoll:
BTFSC ADCON0,GO ;Is conversion done?
BRA ADCPoll ;No, test again
MOVFF	ADRESH, ADC_RESULT
значение получаю, а вот в прерывание при этом все равно не вываливаюсь.

Значение еще какое то странное.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC + SSD1306

Сообщение КРАМ »

Да Бог с ним, со значением ADRES. Речь не о нем, а о флаге ADIF и битах ADIE, PEIE, GIE.
И брекпойнтов нужно поставить ДВА: один прямо прямо на movff, а второй на первой строке обработчика прерываний.
И к тому же, лучше пока перенести обработчик АЦП на вектор 8. И когда заработает, тогда и вернуть на 18-ый.
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

Re: PIC + SSD1306

Сообщение KyJek »

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

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

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

BSF 	ADCON0, GO 		;Start conversion
	ADCPoll:
	BTFSC 	ADCON0, GO 		;Is conversion done?
	BRA 	ADCPoll 		;No, test again
Прерывание низкого уровня было вызвано. И даже с поднятым флагом что это прерывание АЦП. Т.к. отлаживал отладчиком, а не в железе результат 0000.

Больше прерывание не вызывается, а почему?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC + SSD1306

Сообщение КРАМ »

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

Re: PIC + SSD1306

Сообщение KyJek »

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

Возможно надо в обработчик прерывания добавить поднятие флага Go?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC + SSD1306

Сообщение КРАМ »

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

Re: PIC + SSD1306

Сообщение KyJek »

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

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


Ответить

Вернуться в «PIC»