PIC + SSD1306

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

Re: PIC + SSD1306

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

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

Re: PIC + SSD1306

Сообщение KyJek »

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

Реализовывать как указали Вы я не стал. Слишком сложно. Я посмотрел эти два 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

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

Re: PIC + SSD1306

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

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

Re: PIC + SSD1306

Сообщение KyJek »

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

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

Re: PIC + SSD1306

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

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

Re: PIC + SSD1306

Сообщение KyJek »

Я считаю тад для того чтобы выдержать время между вызовами преобразований ацп. Если я просто при каждои прерывании таймера буду поднимать го в 1 то может получится так что ацп еще не выполнит преобразование за свои 12 тадс а я уже поднял го. 2тадс мин задержки в таком случае я не выдержал. А я написал условие для таймера что если флаг го поднят ничего не делать, если опушен необходимо дождатся 254 мксек и поднять его. Я монимаю что можно настроить новый таймер на прерывание раз в 250 мкс и там уже написать поднятие го, но какая в этом принципиальная разница?
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25283
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC + SSD1306

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

Что за ерунда?
:facepalm:
Как может АЦП быть дважды запущен раньше, чем через 1 секунду?
И как может быть время преобразования больше допустимого 14*8 мкс
Вы вообще поняли механизм взаимодействий?
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

Re: PIC + SSD1306

Сообщение KyJek »

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

MOVLW B'01001101'
MOVWF ADCON0

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

Re: PIC + SSD1306

Сообщение Albert_V »

А ADC до этого был включен (PMDx)?
KyJek
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт апр 07, 2015 19:19:29
Откуда: г. Москва

Re: PIC + SSD1306

Сообщение KyJek »

Дамс.
Теперь все заработало.
Самое обидное что мне даже в голову это не пришло. А ведь я уже вкл. периферию.
pcb432
Мудрый кот
Сообщения: 1808
Зарегистрирован: Пт мар 26, 2010 17:16:52
Откуда: Kazan

Re: PIC + SSD1306

Сообщение pcb432 »

KyJek писал(а):...
Теперь все заработало...
Что в итоге на экране получилось?
FIREBALL_1984
Родился
Сообщения: 12
Зарегистрирован: Чт дек 27, 2018 00:30:34

Re: PIC + SSD1306

Сообщение FIREBALL_1984 »

ПРИВЕТСТВУЮ ВСЕХ! давно не кодил на пиках. все подзабыл конкретно. если кто сможет помогите , в чем моя ошибка. нужно зажечь экран хоть каким то мусором. пока что только черный экран и вижу.
пишу на АСМ пик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 
Ответить

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