PIC + SSD1306
- КРАМ
- Друг Кота
- Сообщения: 25278
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: PIC + SSD1306
Выше все ответил.
- Реклама
-
KyJek
- Нашел транзистор. Понюхал.
- Сообщения: 183
- Зарегистрирован: Вт апр 07, 2015 19:19:29
- Откуда: г. Москва
Re: PIC + SSD1306
Даташит мне тяжело дается. Поэтому смотрю в него и мало чего понимаю.
Реализовывать как указали Вы я не стал. Слишком сложно. Я посмотрел эти два Special Event Trigger с огромной кучей настроек. CTMU мне понравился больше.
Все это необходимо лишь для того чтобы время между замерами АЦП, ( 12 TADs ) было 2 TADs минимум.
Так как у меня уже реализован счетчик на таймере 2 я решил запихнуть в его прерывания подсчет еще и задержки между замерами АЦП.
Добавил такие строки
а в обработчике прерываний по АЦП вот так
Если так сделать нельзя или может возникнуть какие то проблемы подскажите.
Реализовывать как указали Вы я не стал. Слишком сложно. Я посмотрел эти два 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
- КРАМ
- Друг Кота
- Сообщения: 25278
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: PIC + SSD1306
Вы занимаетесь ерундой.
1. Забудьте про низший приоритет. Это пока не для Вас. Вы не понимаете зачем он нужен.
2. Запускаете TMR2 таким образом, чтобы он ресетился с интервалом запусков преобразования. Для этого выставляете в PR2 необходимый коэффициент пересчета и подключаете к этому таймеру предделители. Интервал пересчета ДОЛЖЕН БЫТЬ БОЛЬШЕ, чем время преобразования АЦП.
3. В прерывании по этому таймеру не надо ничего проверять. Нужно просто взвести GO и выйти. Частота прерываний и так должна быть реже, чем цикл преобразования АЦП.
4. В прерывании по АЦП не нужно ничего проверять. Нужно просто переписать ADRES в буфер.
Никаких счетчиков циклов преобразования не надо.
Естественно, что на входе обработчика по 8 вектору должен стоять семафор, который определяет чей флаг был взведен и разрешено ли это прерывание.
Иначе запрет прерываний по одному из источников может вызвать ложное его исполнение лишь потому, что проверка его флага в семафоре стоит первой...
1. Забудьте про низший приоритет. Это пока не для Вас. Вы не понимаете зачем он нужен.
2. Запускаете TMR2 таким образом, чтобы он ресетился с интервалом запусков преобразования. Для этого выставляете в PR2 необходимый коэффициент пересчета и подключаете к этому таймеру предделители. Интервал пересчета ДОЛЖЕН БЫТЬ БОЛЬШЕ, чем время преобразования АЦП.
3. В прерывании по этому таймеру не надо ничего проверять. Нужно просто взвести GO и выйти. Частота прерываний и так должна быть реже, чем цикл преобразования АЦП.
4. В прерывании по АЦП не нужно ничего проверять. Нужно просто переписать ADRES в буфер.
Никаких счетчиков циклов преобразования не надо.
Естественно, что на входе обработчика по 8 вектору должен стоять семафор, который определяет чей флаг был взведен и разрешено ли это прерывание.
Иначе запрет прерываний по одному из источников может вызвать ложное его исполнение лишь потому, что проверка его флага в семафоре стоит первой...
-
KyJek
- Нашел транзистор. Понюхал.
- Сообщения: 183
- Зарегистрирован: Вт апр 07, 2015 19:19:29
- Откуда: г. Москва
Re: PIC + SSD1306
Просто у меня уже есть таймер 2 который я запустил с частотой в 1 Герц. По нему я считаю задержки. перед подачей команд, вкл питания и т.д. в него я прикрутил и подсчет задрежек по АЦП. Мне абсолютно все равно через сколько секунд будет получено новое значение АЦП. Это заряд аккумулятора. Я могу конечно запустить еще один таймер ( например 6) и настроить время чтобы на каждом его прерывании поднимать Go.
Вы считаете это более правильным?
Вы считаете это более правильным?
- КРАМ
- Друг Кота
- Сообщения: 25278
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: PIC + SSD1306
Если Вас устраивает частота в 1 Гц, то и запускайте с этой частотой. Только зачем там считать Tad? Когда преобразование закончится, тогда и будет вызов прерывания от АЦП.
Его даже можно не сразу исполнять в том смысле, что при возникновении задержек с исполнением других прерываний АЦП будет стоять в очереди. И проверку его флага в семафоре можно сделать последней.
Его даже можно не сразу исполнять в том смысле, что при возникновении задержек с исполнением других прерываний АЦП будет стоять в очереди. И проверку его флага в семафоре можно сделать последней.
- Реклама
-
KyJek
- Нашел транзистор. Понюхал.
- Сообщения: 183
- Зарегистрирован: Вт апр 07, 2015 19:19:29
- Откуда: г. Москва
Re: PIC + SSD1306
Я считаю тад для того чтобы выдержать время между вызовами преобразований ацп. Если я просто при каждои прерывании таймера буду поднимать го в 1 то может получится так что ацп еще не выполнит преобразование за свои 12 тадс а я уже поднял го. 2тадс мин задержки в таком случае я не выдержал. А я написал условие для таймера что если флаг го поднят ничего не делать, если опушен необходимо дождатся 254 мксек и поднять его. Я монимаю что можно настроить новый таймер на прерывание раз в 250 мкс и там уже написать поднятие го, но какая в этом принципиальная разница?
- КРАМ
- Друг Кота
- Сообщения: 25278
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: PIC + SSD1306
Что за ерунда?
Как может АЦП быть дважды запущен раньше, чем через 1 секунду?
И как может быть время преобразования больше допустимого 14*8 мкс
Вы вообще поняли механизм взаимодействий?
Как может АЦП быть дважды запущен раньше, чем через 1 секунду?
И как может быть время преобразования больше допустимого 14*8 мкс
Вы вообще поняли механизм взаимодействий?
-
KyJek
- Нашел транзистор. Понюхал.
- Сообщения: 183
- Зарегистрирован: Вт апр 07, 2015 19:19:29
- Откуда: г. Москва
Re: PIC + SSD1306
Не могу никак понять почему регистры ADCONx после инициализации все равны 0?
MOVLW B'01001101'
MOVWF ADCON0
а он в итоге равен 0. Что за ерунда. Банки памяти проверил. Банк стоит 0F.
MOVLW B'01001101'
MOVWF ADCON0
а он в итоге равен 0. Что за ерунда. Банки памяти проверил. Банк стоит 0F.
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: PIC + SSD1306
А ADC до этого был включен (PMDx)?
-
KyJek
- Нашел транзистор. Понюхал.
- Сообщения: 183
- Зарегистрирован: Вт апр 07, 2015 19:19:29
- Откуда: г. Москва
Re: PIC + SSD1306
Дамс.
Теперь все заработало.
Самое обидное что мне даже в голову это не пришло. А ведь я уже вкл. периферию.
Теперь все заработало.
Самое обидное что мне даже в голову это не пришло. А ведь я уже вкл. периферию.
Re: PIC + SSD1306
Что в итоге на экране получилось?KyJek писал(а):...
Теперь все заработало...
-
FIREBALL_1984
- Родился
- Сообщения: 12
- Зарегистрирован: Чт дек 27, 2018 00:30:34
Re: PIC + SSD1306
ПРИВЕТСТВУЮ ВСЕХ! давно не кодил на пиках. все подзабыл конкретно. если кто сможет помогите , в чем моя ошибка. нужно зажечь экран хоть каким то мусором. пока что только черный экран и вижу.
пишу на АСМ пик18Ф2520. если кому не жалко тестовый пример для вывода мусора. а то у же 2 дня мучаюсь. дисплей олед SSD1306.
мне надо хотя бы понять работает он вообще или нет. а то так можно кучу времени угрохать и не заметить что все делал правильно.
вот тупая программка. инит и послание в виде кучи байтов просто как мусор. musor-просто табилца байтов для вывода на экран. апппаратный ай2си . пойдет пример хоть для 16 пика. или может где ошибка у меня. кстати. описание на русском дисплея подсмотрел тут на радиокоте.
Добавлено after 3 hours 50 minutes 22 seconds:
спасибо всем. индикатор включился. хотя сам не понял почему не работало до этого. вроде все было так же. вместо бит АСК просто проверял бит прерывания.
и.....заработало.
теперь будем изучать дисплей.
ВОТ ТУПАЯ ПРОВЕРЯЛКА
пишу на АСМ пик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 спасибо всем. индикатор включился. хотя сам не понял почему не работало до этого. вроде все было так же. вместо бит АСК просто проверял бит прерывания.
и.....заработало.
теперь будем изучать дисплей.
ВОТ ТУПАЯ ПРОВЕРЯЛКА
Код: Выделить всё
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 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 

