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 на дисплей.
К сожалению он не загорается (. Я уже не знаю в чем проблема и где я мог накосячить.
приборов к сожалению у меня нормальных нет. Использую светодиод
Карма: 4
Рейтинг сообщений: 2
Зарегистрирован: Вт апр 07, 2015 19:19:29 Сообщений: 183 Откуда: г. Москва
Рейтинг сообщения:0
Спойлер
Код:
;***************************************************************************** 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'
;*************************************** ;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
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 ;*************************************** ***************************************
;*************************************** *************************************** 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 ;*************************************** ***************************************
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
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 ;*************************************** *************************************** ***************************************
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
В 18-Х ПИКах при входе в прерывание происходит АВТОМАТИЧЕСКОЕ сохранение контекста в невидимых (Shadow) регистрах. Это происходит БЕЗУСЛОВНО. Это нельзя отключить. А вот восстанавливается сохраненный в этих регистрах контекст лишь в случае, если при выходе из прерывания использован параметр FAST:
Код:
retfie FAST
То есть Вы совершенно впустую сохраняете и восстанавливаете контекст своими силами. Автоматический процесс сохранения-восстановления находится СНАРУЖИ Ваших действий. То есть сохранение происходит раньше, а восстановление позже. ЗЫ. Писать обработчик по вектору 0х18 (нижний приоритет) при его НЕиспользовании нет никакой необходимости. Попасть туда программа все равно не сможет.
Откройте даташит на контроллер в разделе Interrupts (9-ый параграф). И посмотрите СХЕМУ логики генерации прерываний (фиг. 9-1). Обратите внимание на ВЫХОДНЫЕ ВЕНТИЛИ обоих приоритетов. Там имеют место быть УСЛОВИЯ РАЗРЕШЕНИЯ этой самой генерации реквеста. И находятся биты этих условий в регистре INTCON. То есть для входа в прерывание необходимо не только частное периферийное разрешение (PIE), но и групповое (PEIE), а так же глобальные (GIEH/GIEL).
Тогда все делается очень просто. Вы вставляете (временно) ПРОГРАММНОЕ ожидание завершения преобразования (не флаг прерывания, а бит GO/DONE) и по этому условию ставите брекпойнт в отладчике. Далее смотрите состояние разрешений и флага по генерации прерываний от АЦП. А прежде просто ставите брекпойнт на входе обработчика по 18 вектору и убеждаетесь в справедливости Ваших первоначальных предположений...
Да Бог с ним, со значением ADRES. Речь не о нем, а о флаге ADIF и битах ADIE, PEIE, GIE. И брекпойнтов нужно поставить ДВА: один прямо прямо на movff, а второй на первой строке обработчика прерываний. И к тому же, лучше пока перенести обработчик АЦП на вектор 8. И когда заработает, тогда и вернуть на 18-ый.
Если честно, то я ничего не понял... Нулевой результат в СИМ вполне естественнен. Но само тактирование АЦП в СИМе симулируется корректно. Выводите в Watch все интересующие Вас регистры, устанавливаете коэффициент деления для Tad небольшой, чтобы не тыкать много раз шаги, и тупо проходите по шагам от запуска GO. Наблюдая при этом все флаги до входа в обработчик и после выхода из обработчика.
Карма: 4
Рейтинг сообщений: 2
Зарегистрирован: Вт апр 07, 2015 19:19:29 Сообщений: 183 Откуда: г. Москва
Рейтинг сообщения:0
Прерывание вызывается только в том случае если бит go поднят. При вызове прерывания он автоматически сбрасывается и поднимается флаг PIR1, ADIF. Если в дальнейшем флаг go не понимать то больше прерываний возникать не будет.
Возможно надо в обработчик прерывания добавить поднятие флага Go?
У меня такое ощущение, что даташит Вы в принципе не считаете необходимым даже бегло прочитать... Вообще то GO - это ЗАПУСК ПРЕОБРАЗОВАНИЯ. Одного преобразования. Единственного. По его завершению это бит СБРАСЫВАЕТСЯ, что АВТОМАТИЧЕСКИ приводит к поднятию флага ADIF. Если Вы желаете автоматизировать процесс поднятия GO, то нужно почитать даташит, где есть описание этой функции через CCP5 и CTMU, что позволяет хардварно синхронизировать процесс поднятия GO с различными алгоритмами. Просто цепочечного запуска по завершению предыдущего преобразования нет. Вы это можете сделать самостоятельно прямо при выходе из обработчика прерываний. И не забудьте, что ДО начала преобразования должен успеть зарядиться конденсатор УВХ, что несложно обеспечить выбором автоматического эквизишн тайма, либо обеспечения необходимого времени между запусками алгоритмом...
Карма: 4
Рейтинг сообщений: 2
Зарегистрирован: Вт апр 07, 2015 19:19:29 Сообщений: 183 Откуда: г. Москва
Рейтинг сообщения:0
написал вот так инит добавил в конце строку
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 сбрасывается когда случается прерывание и больше прерываний не случается если его не поднимать написал поднятие флага в прерывании.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения