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

Re: PIC + SSD1306

Пт май 13, 2016 10:45:27

Выше все ответил.

Re: PIC + SSD1306

Пт май 13, 2016 14:23:42

Даташит мне тяжело дается. Поэтому смотрю в него и мало чего понимаю.

Реализовывать как указали Вы я не стал. Слишком сложно. Я посмотрел эти два Special Event Trigger с огромной кучей настроек. CTMU мне понравился больше.

Все это необходимо лишь для того чтобы время между замерами АЦП, ( 12 TADs ) было 2 TADs минимум.

Так как у меня уже реализован счетчик на таймере 2 я решил запихнуть в его прерывания подсчет еще и задержки между замерами АЦП.

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

Код:

INT_TMR2                     ; прерывание по таймеру 2
   BCF    PIR1,TMR2IF            ; очистка TMR2IF
   
   BTFSS    ADCON0, GO              ; пропустить след. строку если преобразование АЦП запущенно GO бит равен 1
   INCF   ADC_TADs_COUNTER              ; увеличение на едницу задержки между преобразованиями. счет до 254
   BTFSC   STATUS, C            ; переполнение счетчика времени выше 255, тогда стартуем преобразование АЦП
   BSF    ADCON0, GO             ; Start conversion АЦП

   TSTFSZ    INT_TMR2_COUNTER        ; TEST 0
   DECF    INT_TMR2_COUNTER,F       ; INT_COUNT = INT_COUNT - 1; ( F = 1 откуда взяли туда и пишем )  ( W = 0 пишем в WREG )

   GOTO    INT_ENDH


а в обработчике прерываний по АЦП вот так
Код:

INT_ADC
   BCF    PIR1, ADIF
   MOVFF   ADRESH, ADC_RESULT
   CLRF   ADC_TADs_COUNTER
   GOTO    INT_ENDL



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

Re: PIC + SSD1306

Пт май 13, 2016 14:38:00

Вы занимаетесь ерундой.
1. Забудьте про низший приоритет. Это пока не для Вас. Вы не понимаете зачем он нужен.
2. Запускаете TMR2 таким образом, чтобы он ресетился с интервалом запусков преобразования. Для этого выставляете в PR2 необходимый коэффициент пересчета и подключаете к этому таймеру предделители. Интервал пересчета ДОЛЖЕН БЫТЬ БОЛЬШЕ, чем время преобразования АЦП.
3. В прерывании по этому таймеру не надо ничего проверять. Нужно просто взвести GO и выйти. Частота прерываний и так должна быть реже, чем цикл преобразования АЦП.
4. В прерывании по АЦП не нужно ничего проверять. Нужно просто переписать ADRES в буфер.
Никаких счетчиков циклов преобразования не надо.
Естественно, что на входе обработчика по 8 вектору должен стоять семафор, который определяет чей флаг был взведен и разрешено ли это прерывание.
Иначе запрет прерываний по одному из источников может вызвать ложное его исполнение лишь потому, что проверка его флага в семафоре стоит первой...

Re: PIC + SSD1306

Пт май 13, 2016 14:53:12

Просто у меня уже есть таймер 2 который я запустил с частотой в 1 Герц. По нему я считаю задержки. перед подачей команд, вкл питания и т.д. в него я прикрутил и подсчет задрежек по АЦП. Мне абсолютно все равно через сколько секунд будет получено новое значение АЦП. Это заряд аккумулятора. Я могу конечно запустить еще один таймер ( например 6) и настроить время чтобы на каждом его прерывании поднимать Go.

Вы считаете это более правильным?

Re: PIC + SSD1306

Пт май 13, 2016 15:06:37

Если Вас устраивает частота в 1 Гц, то и запускайте с этой частотой. Только зачем там считать Tad? Когда преобразование закончится, тогда и будет вызов прерывания от АЦП.
Его даже можно не сразу исполнять в том смысле, что при возникновении задержек с исполнением других прерываний АЦП будет стоять в очереди. И проверку его флага в семафоре можно сделать последней.

Re: PIC + SSD1306

Пт май 13, 2016 15:50:44

Я считаю тад для того чтобы выдержать время между вызовами преобразований ацп. Если я просто при каждои прерывании таймера буду поднимать го в 1 то может получится так что ацп еще не выполнит преобразование за свои 12 тадс а я уже поднял го. 2тадс мин задержки в таком случае я не выдержал. А я написал условие для таймера что если флаг го поднят ничего не делать, если опушен необходимо дождатся 254 мксек и поднять его. Я монимаю что можно настроить новый таймер на прерывание раз в 250 мкс и там уже написать поднятие го, но какая в этом принципиальная разница?

Re: PIC + SSD1306

Пт май 13, 2016 16:02:21

Что за ерунда?
:facepalm:
Как может АЦП быть дважды запущен раньше, чем через 1 секунду?
И как может быть время преобразования больше допустимого 14*8 мкс
Вы вообще поняли механизм взаимодействий?

Re: PIC + SSD1306

Сб май 14, 2016 11:36:01

Не могу никак понять почему регистры ADCONx после инициализации все равны 0?

MOVLW B'01001101'
MOVWF ADCON0

а он в итоге равен 0. Что за ерунда. Банки памяти проверил. Банк стоит 0F.

Re: PIC + SSD1306

Сб май 14, 2016 11:38:41

А ADC до этого был включен (PMDx)?

Re: PIC + SSD1306

Сб май 14, 2016 11:47:13

Дамс.
Теперь все заработало.
Самое обидное что мне даже в голову это не пришло. А ведь я уже вкл. периферию.

Re: PIC + SSD1306

Пн июл 11, 2016 17:56:22

KyJek писал(а):...
Теперь все заработало...

Что в итоге на экране получилось?

Re: PIC + SSD1306

Чт дек 27, 2018 05:16:40

ПРИВЕТСТВУЮ ВСЕХ! давно не кодил на пиках. все подзабыл конкретно. если кто сможет помогите , в чем моя ошибка. нужно зажечь экран хоть каким то мусором. пока что только черный экран и вижу.
пишу на АСМ пик18Ф2520. если кому не жалко тестовый пример для вывода мусора. а то у же 2 дня мучаюсь. дисплей олед SSD1306.
мне надо хотя бы понять работает он вообще или нет. а то так можно кучу времени угрохать и не заметить что все делал правильно.

вот тупая программка. инит и послание в виде кучи байтов просто как мусор. musor-просто табилца байтов для вывода на экран. апппаратный ай2си . пойдет пример хоть для 16 пика. или может где ошибка у меня. кстати. описание на русском дисплея подсмотрел тут на радиокоте.



Код:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; I2C ENABLE       
        CLRF  SSPSTAT   
        CLRF  SSPCON1
        CLRF  SSPCON2
        CLRF  SSPADD
        CLRF  SSPBUF
         
        MOVLW 3FH    ;DEC 63 (MIN = 3 FOR TIC48)
        MOVWF SSPADD
        MOVLW B'10000000'
        MOVWF SSPSTAT
        MOVLW B'00001000'
        MOVWF SSPCON1
       
        BSF    SSPCON1,SSPEN ; SSP ON/OFF
   

       
MAIN_BATTERY1
      ;BSF  SSPCON2,ACKEN
     
      BSF SSPCON2,SEN,0   ; START
      BTFSC SSPCON2,SEN,0
      BRA $-2
      BCF PIR1,SSPIF,0
     
     
     
      MOVLW 0X78          ; ADRESS 0X7A  0X78
      MOVWF SSPBUF,0
      BTFSC SSPCON2,ACKSTAT
      BRA $-2
      BCF PIR1,SSPIF,0
      BSF SSPCON2,ACKEN
         
         MOVLW UPPER LCD_INIT_BYTE
         MOVWF TBLPTRU
         MOVLW HIGH LCD_INIT_BYTE
         MOVWF TBLPTRH
         MOVLW LOW  LCD_INIT_BYTE
         MOVWF TBLPTRL
       
       
         MOVLW .36 ;  КОМАНД
         MOVWF COUNTER
INIT2    TBLRD*+
         MOVF  TABLAT,W
        MOVWF SSPBUF
        BTFSC SSPCON2,ACKSTAT
        BRA $-2
        BCF PIR1,SSPIF
         BSF SSPCON2,ACKEN
         
         DECFSZ COUNTER,F
         BRA   INIT2
        CALL  STOP_BIT
     
     
     
     
      BSF SSPCON2,SEN,0   ; START
      BTFSC SSPCON2,SEN,0
      BRA $-2
      BCF PIR1,SSPIF,0
     
      MOVLW  0X78          ; ADRESS
      MOVWF SSPBUF,0
      BTFSC SSPCON2,ACKSTAT
      BRA $-2
      BCF PIR1,SSPIF,0
      BSF SSPCON2,ACKEN
     
      MOVLW 0X40          ; DATS 40  DAT C0  COM 80
      MOVWF SSPBUF,0
      BTFSC SSPCON2,ACKSTAT
      BRA $-2
      BCF PIR1,SSPIF,0
      BSF SSPCON2,ACKEN
     
     
         
         
         
         
         MOVLW UPPER MUSOR
         MOVWF TBLPTRU
         MOVLW HIGH MUSOR
         MOVWF TBLPTRH
         MOVLW LOW  MUSOR
         MOVWF TBLPTRL
         
         
         MOVLW .255
         MOVWF COUNTER
INIT22    TBLRD*+
         MOVF  TABLAT,W
        MOVWF SSPBUF
        BTFSC SSPCON2,ACKSTAT
        BRA $-2
        BCF PIR1,SSPIF
         BSF SSPCON2,ACKEN
         DECFSZ COUNTER,F
         BRA   INIT22
         
         
         CALL  STOP_BIT




 MAIN_BATTERY2             
              BRA MAIN_BATTERY2


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; УСЛОВИЕ "СТОП"
STOP_BIT
   BSF SSPCON2,PEN,0
   BTFSC SSPCON2,PEN,0
   BRA $-2
   
   RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;




ORG 4000H

   
   
   
   
   
   
   
LCD_INIT_BYTE ; 36 BYTE
 DB  0X80,0XA8,0X80,0X3F,0X80,0XD3,0X80,0X00,0X80,0X40,0X80,0XA1,0X80,0XC8,0X80,0XDA,0X80,0X12,0X80,0X81,0X80, 0X7F,0X80,0XA4,0X80,0XA6,0X80,0XD5,0X80,0X80,0X80,0X8D,0X80,0X14,0X80,0XAF
   
   

   
   
MUSOR
 DB 0X80, 0XA8, 0X80, 0X3F, 0X80, 0XD3, 0X80, 0X00, 0X80, 0X40, 0X80, 0XA1, 0X80, 0XC8, 0X80, 0XDA, 0X80, 0X12, 0X80, 0X81, 0X80, 0X7F, 0X80, 0XA4, 0X80, 0XA6, 0X80, 0XD5, 0X80, 0X80, 0X80, 0X8D, 0X80, 0X14, 0X80, 0XAF 


Добавлено after 3 hours 50 minutes 22 seconds:
спасибо всем. индикатор включился. хотя сам не понял почему не работало до этого. вроде все было так же. вместо бит АСК просто проверял бит прерывания.
и.....заработало.
теперь будем изучать дисплей. :))

ВОТ ТУПАЯ ПРОВЕРЯЛКА
Код:
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; I2C ENABLE       
        CLRF  SSPSTAT   
        CLRF  SSPCON1
        CLRF  SSPCON2
        CLRF  SSPADD
        CLRF  SSPBUF
         
        MOVLW 3FH    ;DEC 63 (MIN = 3 FOR TIC48)
        MOVWF SSPADD
        MOVLW B'10000000'
        MOVWF SSPSTAT
        MOVLW B'00001000'
        MOVWF SSPCON1
       
   

   BSF    SSPCON1,SSPEN ; SSP ON/OFF
   

       


       



MAIN_BATTERY1
     
     
      BSF SSPCON2,SEN,0   ; START
      BTFSC SSPCON2,SEN,0
      BRA $-2
      BCF PIR1,SSPIF,0
     
     
     
      MOVLW 0X78          ; ADRESS 0X7A  0X78
      MOVWF SSPBUF,0
      BTFSS PIR1,SSPIF
      BRA $-2
      BCF PIR1,SSPIF,0
     
         
         MOVLW UPPER LCD_INIT_BYTE
         MOVWF TBLPTRU
         MOVLW HIGH LCD_INIT_BYTE
         MOVWF TBLPTRH
         MOVLW LOW  LCD_INIT_BYTE
         MOVWF TBLPTRL
       
       
         MOVLW .36 ;  КОМАНД
         MOVWF COUNTER
INIT2    TBLRD*+
         MOVF  TABLAT,W
        MOVWF SSPBUF,0
        BTFSS PIR1,SSPIF
        BRA $-2
        BCF PIR1,SSPIF
         DECFSZ COUNTER,F
         BRA   INIT2
        CALL  STOP_BIT
     
     
         
         
         
         
         NOP
         BRA $-2
Ответить