Отправлено: 18.01.12 12:08. Заголовок: Что я делаю не так?! Помогите
Всем привет. Помогите, пожалуйста, разобраться в моей ошибке. Где я ошибся. Есть ЖК-индикатор WH1602D-YYK-CTK (2х16 русскоязычный). Учился с ним работать на PIC16F84A. Работаю по 4-х проводному интерфейсу. Все работало верно и правильно. Когда понадобилось АЦП решил перейти на PIC16F676. Программу перенес на этот контроллер с поправками для него. Теперь не могу понять где моя ошибка. Почему на PIC16F84A у меня все нормально выводит, а на PIC16F676 или вообще ничего или с 3-5 раза какую-то "кракозябру" и не на том месте где нужно. Оба контролера работают на тактовой частоте 4 МГц. Может в инициализации допускаю ошибку.
Вот пример для PIC16F84A. ЖКИ подключен к PB4-PB7 ******************************************************************************************************************* LIST p=16F84a ; Определение типа микроконтроллера. #include<p16f84a.inc> __CONFIG 03FF1H
#define RS PortB,2 #define E PortB,3 .......
; НАЧАЛО ОСНОВНОЙ ПРОГРАММЫ ;********************************************************************************************************************************* START clrf INTCON ; ЗАПРЕТ ПРЕРЫВАНИЙ ;------------------------------------------------------------------------------------------------- ;------------------------------------------------------------------------------------------------- clrwdt ; Сброс сторожевого таймера. bsf Status,5 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status). clrf TrisB ; Установить все порты на "выход". movlw b'00011100' movwf TrisA ; В0 - вход movlw b'11000011' movwf OPTION_REG ; Переключаем предделитель 1:16 к TMR0, ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ОТКЛЮЧЕНЫ bcf Status,5 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status).
;================================================================================================================================== ;==============ИНИЦИАЛИЗАЦИЯ LCD(СТАНДАРТНЫЙ БЛОК)=========================== bcf RS bcf RW bcf E movlw 15h ; загрузить константу задержки call DELAY2 ; задержка на 15мс movlw 30h ; 30h-это константа для всех режимов movwf PortB bsf E NOP bcf E CALL delay_100mks bsf E NOP bcf E MOVLW 4h CALL DELAY2 ;задержка вместо опроса BUSY MOVLW 20h CALL WRC MOVLW 28h ;шина - 4бит, 2строки, 5х8 пикселей, 38h - 8 бит CALL WRC MOVLW 0Ch ;отображение - вкл, но без курсора CALL WRC MOVLW 06h ;автоматическое перемещение курсора слева направо CALL WRC MOVLW 01h ;очистить дисплей CALL WRC MOVLW 03h CALL DELAY2 ;задержка вместо опроса BUSY .....
;====================================================================== ; ПОДПРОГРАММЫ ДЛЯ ВЫВОДА НА ЖКИ ;====================================================================== ; Запись кода команд LCD ;---------------------------------------------------------------------- WRC BCF RS CLRF TEM_P BCF RW MOVWF TEM_P ANDLW 0F0h ; 0F0h-вывод на порты D7-D4, 1Eh-вывод на порты D4-D1 MOVWF PortB BSF E nop nop BCF E SWAPF TEM_P,W ANDLW 0F0h MOVWF PortB BSF E nop nop BCF E MOVLW 4h CALL DELAY2 ;задержка вместо опроса BUSY RETURN
;======================================================================== ; Запись кода данных LCD ;------------------------------------------------------------------------ WRD BSF RS CLRF TEM_P BCF RW MOVWF TEM_P ANDLW 0F0h IORLW 04h ;оставить RS=1 MOVWF PortB BSF E nop nop BCF E SWAPF TEM_P,W ANDLW 0F0h IORLW 04h ;оставить RS=1 MOVWF PortB BSF E nop nop BCF E MOVLW 4h CALL DELAY2 ;задержка вместо опроса BUSY BCF RS RETURN
; НАЧАЛО ОСНОВНОЙ ПРОГРАММЫ ;********************************************************************************************************************************* START ;------------------------------------------------------------------------------------------------- ;------------------------------------------------------------------------------------------------- clrwdt ; Сброс сторожевого таймера.
bsf Status,5 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status). MOVLW B'00000001' ; MOVWF TrisA ; Установить все порты на "выход". РА0 на вход. MOVLW B'00000001' MOVWF ANSEL ; ВЫБРАН АНАЛОГОВЫЙ ВХОД clrf TrisC ; Установить все порты на "выход" movlw b'10000001' movwf OPTION_REG ; Переключаем предделитель 1:128 к TMR0, ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ отключены clrf INTCON ; ЗАПРЕТ ПРЕРЫВАНИЙ CLRF VRCON ; ИОН ОТКЛЮЧЕН. CLRF PCON ; ПРЕРЫВАНИЯ ПО ПИТАНИЮ ЗАПРЕЩЕНЫ. clrwdt ; Сброс сторожевого таймера. clrf WPUA ; ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ВЫКЛЮЧЕНЫ. clrf IOCA ; ПРЕРЫВАНИЯ РА запрещены MOVLW B'00100000' ; MOVWF OSCCAL ; минимальная частота MOVLW 0FFH ; СИНХРОНИЗАЦИЯ ОТ RC MOVWF ADCON1 ; ТАКТ АЦП ОТ ВНУТРЕННЕГО ГЕНЕРАТОРА 500 кГц. CLRF VRCON ; ИОН ОТКЛЮЧЕН. bcf Status,5 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status). clrwdt ; Сброс сторожевого таймера. CLRF PortA CLRF PortC CLRF T1CON ; ТАЙМЕР 1 ОТКЛЮЧЕН. MOVLW B'00000111' ; MOVWF CMCON ; КОМПАРАТОР ВЫКЛЮЧЕН. .... Инициализацию ЖКИ использую как для PIC16F84A. ;====================================================================== ; ПОДПРОГРАММЫ ДЛЯ ВЫВОДА НА ЖКИ ;====================================================================== ; Запись кода команд LCD ;---------------------------------------------------------------------- WRC bcf RS ; запись команд movwf TEM_P ; swapf TEM_P,W ; andlw B'00001111' ; обнуляем старшие разряды movwf PortC ; call strob ; строб call pau1ms ; пауза movfw TEM_P andlw B'00001111' ; обнуляем старшие разряды movwf PortC ; call strob ; строб pau1ms movlw .255 ; пауза 1 мсек call Psm return ;======================================================================== ; Запись кода данных LCD ;------------------------------------------------------------------------ WRD movwf TEM_P ; временное хранение swapf TEM_P,W ; меняем местами полубайты andlw B'00001111' ; обнуляем старшие разряды movwf PORTC ; bsf RS ; запись данных call strob ; строб call pausm ; пауза movfw TEM_P ; andlw B'00001111' ; обнуляем старшие разряды movwf PORTC ; bsf RS ; запись данных call strob ; строб call pausm ; пауза return ;======================================================================== ; ФОРМИРОВАНИЕ СТРОБИРУЮЩЕГО ИМПУЛЬСА. ;======================================================================== strob clrwdt nop bsf E ; movlw .25 call Psm bcf E ; return ;======================================================================== Psm addlw -1 ; btfss Status,Z ; goto $-2 ; return ; ;======================================================================== pausm movlw .10 ;40 МКС. addlw -1 btfss Status,Z goto $-2 return
;======================================================================= Вот тут не пойму, что я делаю не так и у меня либо ничего не выводит или "кракозябра". Подпрограммы подготовки данных для ЖКИ работают на 100% (тут я их не указывал).
Отправлено: 23.01.12 15:20. Заголовок: Александр пишет: По..
Александр пишет:
цитата:
Попробуй конфигурацию 31A9H включены XT-осцилятор, WDT, PWRT, MCLR! можно и без WDT тогда 11A1H
Спасибо за ответы. Извините мою неопытность в этом, но пока не могу понять как конфигурация может влиять. На сколько я понимаю мне нужно четко выдерживать время общения с индикатором. На время влияет тактовая частота. Она у меня и там и там по 4 МГц, только PIC16F84 использует для этого XT-осцилятор, а PIC16F676 внутренний генератор. У меня на PIC16F676 все порты будут заняты и выделить два порта для XT- генератора не могу себе позволить. Потеряю функциональность. Если я не прав - поправьте. Заметил, что если подключение идет к старшей тетраде порта (при наличии полного порта на целый байт), то вывод идет отлично. Если начинаю подключать к младшей тетраде с соответствующими поправками для этого, то ничего не получается. С чем это связано не могу объяснить. Почему так происходит?
Наверняка посылаешь не те полубайты и не туда. Обрати на них внимание. Какой полубайт маскируешь и в какой последовательности посылаешь. Как там положено, вначале старший, а потом младший полубайт? Или наоборот? не помню. Посмотри проекты на Chipmk. Только обрати внимане, чтобы в примере было подключение как у тебя.
И ещё, посмотри у себя в каталоге C:\Program Files\Microchip\MPASM Suite\Template\Code\... Там есть шаблоны / заготовки для программ, на все контроллеры, очень удобно. Запись типа __CONFIG 03FF1H напрягает, расшифровывать надо. Гораздо удобней записывать как в шаблоне в таком виде
базара нет меня тоже напрягает, но так как я полностью учился на самоучителях КЕА для меня проще выбирать конфигурацию на IcProg105, просто выбрал пик, натыкал нужных галочек и списал конфигурацию... Ivan555 пишет
цитата:
У меня на PIC16F676 все порты будут заняты и выделить два порта для XT- генератора не могу себе позволить. Потеряю функциональность. Если я не прав - поправьте.
Вы правы по части лишних выводов, их просто нет. тогда с задействованием внутреннего RC на 4 Мгц, конфигурация возможна 31FCh что означает IntOSC GP4- внутренний генатакт, вкл. WDT, MCLR,BODEN, остальное выключено...
Пост N: 201
Зарегистрирован: 10.02.11
Откуда: Россия
Рейтинг:
2
Отправлено: 26.01.12 08:28. Заголовок: Александр пишет: я ..
Александр пишет:
цитата:
я полностью учился на самоучителях КЕА
Переучивайтесь, пока не поздно ! И старайтсь не произносить всяческие быдлофразы на птичьем языке, типа
цитата:
генатакт
Вы же программист. От Вас должны исходить слова на техническом языке. IntOSC сам же за себя говорит что это такое - Internal OSCillator, т.е. внутренний осцилятор.
Александр пишет:
цитата:
для меня проще выбирать конфигурацию на IcProg105, ....
Мда, видимо он совсем мозги запудрил своим ученикам...
Отправлено: 26.01.12 19:31. Заголовок: Alex не вопрос я не ..
Alex не вопрос я не против исправления. Alex пишет:
цитата:
Мда, видимо он совсем мозги запудрил своим ученикам...
а как подругому его определить быстро может поделитесь? MAZ пишет:
цитата:
Ну тупые фразы, плохой код, не оптимальный.
так главное чтоб в голову легло приятно и понятно, а называть можно хоть храмой обезьяной, мы же советчики, а советы тяжеловато понимаются особенно на даташитовском языке, поэтому написал попроше и покороче, смысл то от этого не изменился...
Отправлено: 26.01.12 19:57. Заголовок: Александр пишет: а ..
Александр пишет:
цитата:
а как подругому его определить быстро может поделитесь?
Очень просто, открываете для данного контроллера файл по адресу. С/Program Files/Microchip/MPASM Sute/Template/Code/ и нужный вам контроллер. Получаете шаблон проекта для этого контроллера, в котором у же расписана конфигурация и не только. Ставьте в нужных местах OFF или ON. Ну и все как будто. Как пример, для PIC16F84A __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _RC_OSC для PIC16F676 _CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT Если не знаете как расшифровать значения конфигурации почитайте даташит на данный контроллер. Александр пишет:
цитата:
так главное чтоб в голову легло приятно и понятно, а называть можно хоть
Вам нравится слово "быдло"? Мне не нравится, извините.
Пост N: 202
Зарегистрирован: 10.02.11
Откуда: Россия
Рейтинг:
2
Отправлено: 27.01.12 19:07. Заголовок: Люди, вы меня не пон..
Люди, вы меня не поняли. Я не хотел ни кого оскорбить, просто пытался сказать, что выражаться нужно нормальным техническим языком, а не тем, попугайским, который вы слышите в самоМучителе одного нами известного индивидума. Если кого огорчил - прошу прощения
Наверняка посылаешь не те полубайты и не туда. Обрати на них внимание. Какой полубайт маскируешь и в какой последовательности посылаешь. Как там положено, вначале старший, а потом младший полубайт? Или наоборот? не помню.
Спасибо за ответ. Проверял вдоль и поперек. Прогонял в симуляторе. Все правильно. А в реальности не так как нужно. Заметил такую особенность, что если включать-выключать устройство много раз, то могу застать когда индикатор начинает выводить то что нужно на половину (половина информации правильная, а к половине подмешивается "кракозябра"). Могу предположить, что очередность выводов полубайтов соблюдаю, раз половину информации выводит индикатор правильно.
Photographer пишет:
цитата:
Посмотри проекты на Chipmk.
Спасибо за интересный сайт. Просмотрел его. И опять таки все примеры с задействованием старшего полубайта порта для вывода на индикатор. Перепахал этот код, а толку пока нет. Никак не могу понять по поводу конфигурации. У меня конфигурация для PIC16F676 _CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
Посматривать начинаю на другой контроллер с полноценными портами и АЦП. Думаю остановиться на PIC16F876. Тут портов для моих задач с головой хватит.
Думаю остановиться на PIC16F876. Тут портов для моих задач с головой хватит.
А почему тогда не PIC16F877(A)? На нём достаточно много проектов сделано и с выводом на индикацию проблем не наблюдалось. Можно будет использовать наработки на этом МК, "заточив" их под свои задачи. Цена вроде тоже адекватна.
Ivan555 Бегло взглянул на программу, сразу два вопроса Где инициализация LCD в 676 в 84 она есть а в 676 нет... И второй индикатору возможно не хватает ваших пауз, не пробовали их увеличить в 2 раза и посмотреть что произойдет? Ну и на всякий случай гляньте еще раз, в правильном ли порядке выводите полубайты
Отправлено: 29.01.12 23:01. Заголовок: SanSanich пишет: А п..
SanSanich пишет:
цитата:
А почему тогда не PIC16F877(A)?
думаю ответ сам за себя напрашивается 877 стоит в 2 а то и в 3 раза дороже чем 676, а например для вывода банального результата АЦП к примеру с двух выводов, както жаба давит за остальные свободные выводы.
Пост N: 562
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг:
1
Отправлено: 29.01.12 23:08. Заголовок: Александр пишет: а ..
Александр пишет:
цитата:
а для того чтобы руку набить может и пойдет.
Ну я, собственно, об этом же. Он более менее универсален, имеет практически всё, что возможно в среднем семействе и код можно всегда перенести на менее "сильные" МК, слегка внеся коррекцию.
Отправлено: 31.01.12 14:59. Заголовок: Спасибо всем за отве..
Спасибо всем за ответы. Александр спасибо Вам за файл, который ответил на все мои вопросы. Именно с этого все и начиналось. Скачал я исходник приставки для зарядного устройства уже давненько. Забросил его в загашник. Когда понадобилась такая связка индикатора и контроллера вспомнил за этот исходник. Собрал для проверки устройство на макетке - работает, но как-то странно (кракозябра проскакивала). Решил основу общения с индикатором взять отсюда для своей программы. Вот и получил результат. Пробовал разные варианты, а с места не двигался. Решил обратиться к Вам за помощью. Спасибо еще раз за ответы.
Все даты в формате GMT
3 час. Хитов сегодня: 13
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет