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

Не работает сенсорный модуль CPS 12F1822

Вт фев 12, 2013 17:19:38

Уже 3й день не могу найти причину. не получается запустить модуль емкостного сенсора CPS встроенный в контроллер 12F1822 все делаю по даташиту. Быть может у кого нибудь есть рабочий пример, если нет ниже выкладываю код я его обрезал до банального.
Суть такая: Конфигурируем регистр CPSCON0 и регистр T1CON таймера1. Таймер тактируем от модуля CPS следовательно он должен переполнится и зажечь светодиод.
И тут происходит следующее, в протеусе все так и работает а вот в железе, нет светодиод не зажигается.
Помогите пожалуйста очень нужно!

Код:
#include <htc.h>
#include <stdio.h>
#include <pic12f1822.h>;

__CONFIG(WDTE_OFF  & FOSC_INTOSC & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF & WRT_OFF  & PLLEN_OFF & STVREN_OFF &  LVP_OFF );

unsigned int porog, tmp;

void interrupt isr(void){
   
   
   if (TMR1IF == 1) {
RA0 = 1;
TMR1IF = 0;
 }
   }

void
main (void)
{
    OSCCON = 0b01101011; // 4Mhz
    GIE = 1;
    PEIE=1;
   

    OPTION_REG=0b00100000;
    INTCON=0b11100000;   

   CPSCON0 = 0b10001100;
   ANSA2 = 1;// set sense-input to analog
   TRISA2 = 1;
   PORTA=0;   
  T1CON = 0b11000001;      // TMR1 capacitive sensing osc, prescaler 1/1, decicated osc disabled,no synch,timer1 enabled
  T1GCON = 0;       
  TMR1IE = 1;     
  TMR1L   = 0x00;                                                                       
  TMR1H   = 0x00;
  TRISA0 = 0;
  RA0 = 0;
     
 while (1);
 
 {}
 }

}

Re: Не работает сенсорный модуль CPS 12F1822

Чт июн 11, 2020 09:44:31

Мож здесь кто ответит.
Разбираюсь с модулем тач 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

Re: Не работает сенсорный модуль CPS 12F1822

Чт июн 11, 2020 11:34:14

У ПИКов надо сначала все ерраты просмотреть...
Тем более, кристалл из новых "энхансед" - там свои особенности.
В живую пока не всречались...
Из теории (ранее сделанной подборки)( разве что это есть:
80502A_errata.pdf
(226.77 KiB) Скачиваний: 261

80502E_errata.pdf
(310.52 KiB) Скачиваний: 198

:dont_know:

Re: Не работает сенсорный модуль CPS 12F1822

Чт июн 11, 2020 14:05:52

Тем более, кристалл из новых "энхансед" - там свои особенности.
Уже давно не новые.
Спасибо, все это уже скачал ранее, но, увы, по поводу CPS там ничего нового.

Re: Не работает сенсорный модуль CPS 12F1822

Чт июн 11, 2020 16:11:41

А выбор канала почему не делаете CPSCON1= 0bххххххххх

Re: Не работает сенсорный модуль CPS 12F1822

Чт июн 11, 2020 17:39:30

Еще как делаю! смотрите в тексте кода.
Ответить