Мож здесь кто ответит.
Разбираюсь с модулем тач CSM. Для начала написал тестовый код для примерного определения частоты встроенного генератора CSM на два пина без пальцев. Пульсы с гены считает TMR1, базовое время формируется по переполнению TMR0. Все это рекомендованно по даташиту.
Поскольку в МПлабе генератор CSM не симулируется, то просто сохраняю значение счетчика TMR1 в EEPROM, а потом считываю его программатором PIckit3.
В результате читаю из EEPROM только нули. Т.е. или генератор CPS не генерит, или TMR1 его не считает. Однако, если источником для TMR1 выбрать Tosc/4, то все пишется исправно, как и в симуляторе.
Испытывал два нетронутых 12F1822, потом портировал на 16F1827 того же семейства, но все по прежнему.
Посмотрел осциллом пины сенсоров - никаких сигналов не наблюдается, а ведь должна быть генерация. Похоже, модуль CSM не генерит почему-то...
Что я делаю не так?
Спасибо.
Спойлер
Код: Выделить всё
#include <P12F1822.inc> ;f=32,0 MHz INTRC
list P=12F1822
__CONFIG _CONFIG1,_PWRTE_ON&_MCLRE_OFF&_IESO_OFF&_FOSC_INTOSC&_FCMEN_OFF;&_CP_ON
cblock 0x20
STATE,MEM,MEM1,NL0,NH0,NL1,NH1,SET_NL0,SET_NH0,SET_NL1,SET_NH1
PARA1
endc
;-------------------------------------------------------
#define SV0 PORTA,4 ;светодиод SV0
#define SV1 PORTA,5 ;светодиод SV1
;#define CPS0 PORTA,0 ;touchsensor CPS0
;#define CPS1 PORTA,1 ;touchsensor CPS1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ИНИЦИАЛИЗАЦИЯ
org 0x00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0x00
GOTO INIT_ALL
org 0x04
GOTO SRV_INT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT_ALL
BANKSEL PORTA
CLRF PORTA
;-------------------- ;настройка блока CPS
MOVLW B'11001000' ;ток Medium from FVR
;MOVLW B'10001000' ;ток Medium Fixed Voltage References
MOVWF CPSCON0 ;Fixed Voltage References
MOVLW B'00000000' ;канал сенсора CPS0
MOVWF CPSCON1
MOVLW B'11000101' ;источник для TMR1 от CPS
;MOVLW B'00000101' ;источник для TMR1 от OSC/4
MOVWF T1CON ;включен с преддел. 1:1
;MOVLW B'10000001' ;Gate от переполнения TMR0
;MOVWF T1GCON ;
;BSF T1GCON,T1GTM ;Togle mode
;BSF T1GCON,T1GPOL ;Polarity
;-------------------- ;настройка портов
BANKSEL LATA
CLRF LATA
MOVLW B'10001010' ;
MOVWF FVRCON ;выход 2,048V
BANKSEL ANSELA
MOVLW B'00000011'
MOVWF ANSELA ;сенсор CPS0,CPS1 аналог
BANKSEL TRISA
MOVLW B'00000011'
MOVWF TRISA ;сенсор CPS0,CPS1 на вход
;MOVLW B'00001100' ;неиспользуемый в CPS канал
;MOVWF ADCON0
;-------------------- ;настройка INTOSC и WDT
MOVLW B'11110000' ;F = 32 MHz INTRCIO
MOVWF OSCCON
MOVLW B'01010001' ;F = 32 MHz INTRCIO
MOVWF OSCSTAT
MOVLW B'00001000' ;16 msec
MOVWF WDTCON
;-------------------- ;настройка TMR0, TMR2
MOVLW B'00000110' ;настройка таймера TMR0
MOVWF OPTION_REG ;с преддел. 1:128
BANKSEL TMR2
MOVLW 0xFF ;
MOVWF PR2 ;T=4*Tosc*(PR2+1)*(TMR2 Prescale)
MOVLW B'00000111' ;включить TMR2
MOVWF T2CON ;предделитель TMR2 1:64
;BSF INTCON,PEIE ;разрешить прерывание периферии
;-----------------------
ClrMem MOVLW 0x20 ;очистка памяти RAM
MOVWF FSR0 ;
ClrMem1 CLRF INDF0
INCF FSR0
BTFSS FSR0,7 ;всего кол-во памяти
GOTO ClrMem1
;-------------------------------
MOVLW 0 ;задержка 0,5 сек
MOVWF MEM
CALL D2
DECFSZ MEM
GOTO $-2
;-------------------------------
CALL NO_FINDER ;начальные значения CPS без пальца
;BSF INTCON,TMR0IE ;разрешить прерывание TMR0
;BSF INTCON,GIE ;разрешить прерывания
;BANKSEL PIE1
;BSF TMR2IE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN CALL D2 ;задержка 2 мсек
GOTO MAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NO_FINDER ;сохраняем начальные значения без пальца в EEPROM
BANKSEL TMR0
CLRF CPSCON1 ;канал 0
CLRF EE_ADR ;нулевой адрес
;BANKSEL FVRCON
;BTFSS FVRCON,FVRRDY
;GOTO NO_FINDER
;BANKSEL TMR0
BSF T1CON,TMR1ON ;включить TMR1
CLRF TMR0
CLRF TMR1H
BCF PIR1,TMR1IF
CLRF TMR1L
BCF INTCON,TMR0IF ;ожидание 2 mсек
CLRWDT
BTFSS INTCON,TMR0IF
GOTO $-2
BCF T1CON,TMR1ON ;стоп TMR1
BTFSC PIR1,TMR1IF ;если переполнение TMR1
RETURN ;то выход без записи
MOVFW TMR1H
MOVWF EE_DATA
CALL EE_WR ;сохраняем TMR1H в EEPROM
INCF EE_ADR ;следующий адрес
MOVFW TMR1L
MOVWF EE_DATA
CALL EE_WR ;сохраняем TMR1L в EEPROM
INCF CPSCON1 ;следующий канал 1
INCF EE_ADR ;следующий адрес
BSF T1CON,TMR1ON ;включить TMR1
CLRF TMR0
CLRF TMR1H
BCF PIR1,TMR1IF
CLRF TMR1L
BCF INTCON,TMR0IF ;ожидание 2 mсек
CLRWDT
BTFSS INTCON,TMR0IF
GOTO $-2
BCF T1CON,TMR1ON ;стоп TMR1
BTFSC PIR1,TMR1IF ;если переполнение TMR1
RETURN ;то выход без записи
MOVFW TMR1H
MOVWF EE_DATA
CALL EE_WR ;сохраняем TMR1H в EEPROM
INCF EE_ADR ;следующий адрес
MOVFW TMR1L
MOVWF EE_DATA
CALL EE_WR ;сохраняем TMR1L в EEPROM
RETURN