Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PIC18F4550 не работает
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
mustelus
Доброго всем времени суток.... У меня возникла проблема с "простой" схемкой...
Использую PIC18F4550, задума простее некуда: при запуске изначально все пины PORTD в состоянии 01010101, при появлении сигнала на RB6 состояния меняються следующим образом 10101010...
Соответственно програма простее некуда:

LIST P=18F4550, F=INHX32, r=dec
#include <P18F4550.INC>

CONFIG FOSC = HS

main:

clrf PORTB
clrf PORTD
movlw b'11111111'
movwf TRISB
movlw b'11111111'
movwf TRISB


LOOP:
btfsc PORTB,6
goto true
goto false

true:
movlw b'10101010'
movwf PORTD
goto LOOP

false:
movlw b'01010101'
movwf PORTD
goto LOOP

END

В отладчике все работает, а вот на практике, даже не дышет...
Подскажите что здесь не так, схема не верна или в програме ошибка???

Ниже прикреплена схема...
Нажмите для просмотра прикрепленного файла
Herz
Там действительно по 20мкф конденсаторы вокруг кварца?
mustelus
А, нет, ошибся ninja.gif , 20pF каждый....
@Ark
Цитата
... Подскажите что здесь не так, схема не верна или в програме ошибка???

Похоже, и то, и другое...
По программе:
- нужно переключить порт D на выход, если хотите что-то туда выводить. Записать нули в соотв. биты TRISD. В данном случае - во все.
По схеме:
- Вывод RB6 нужно подтянуть к земле резистором (1-10К), если вы замыкаете кнопку на питание. Иначе, при ненажатой кнопке, на RB6 будет непонятно какой (плавающий) потенциал. Кстати, обычно делают наоборот - подтягивают резистором к питанию, а замыкают кнопкой на землю.
- Вывод MCLR нужно подтягивать к питанию, а не к земле. Если используете внутрисхемное программирование, то номинал резистора нужно увеличить до 5-10К.
- Светодиоды, также, лучше подключить общей точкой к питанию, а не к земле. Соответственно, развернув их, и включать подачей не 1, а 0.
- Вообще-то, не рекомендуется подключать всю нагрузку к одному порту (тем более, когда есть выбор). Можно превысить допустимый суммарный ток для порта (см. даташит).
- На питание пика, как правило, ставят два конденсатора: электролитический - емкостью в несколько единиц и десятков микрофарад, и керамический - порядка 0,1 мкф, поближе к выводам Vdd и Vss.
- Рекомендуемые номиналы конденсаторов для кварца нужно смотреть в ДШ...
mustelus
На кварц так и написано по 20pF каждый...
А не могли бы вы уточнить насчот питания (использую импульсный источник питания), номиналы кондеров: скажем если электролит 20 микрофорад ну и керамику 0.3 микрофарада, подойдет???
Herz
Цитата(mustelus @ Nov 29 2009, 11:37) *
На кварц так и написано по 20pF каждый...
А не могли бы вы уточнить насчот питания (использую импульсный источник питания), номиналы кондеров: скажем если электролит 20 микрофорад ну и керамику 0.3 микрофарада, подойдет???


Да подойдёт...
mustelus
Добрый день еще раз....
Я немного переделал проект следующим образом: по прерыванию от любого из портов (RB0-RB2), меняеться состояние портов RD0-7 (т.е. когда на какомто RB0-RB2 true, то и на RD0-7 true, когда на RB0-RB2 false, то и на RD0-7 false), в отладчике все отлично работает
НО НА ПРАКТИКЕ ПО ПРЕЖНЕМУ НИЧЕГО....
По вашим советам я изменил схему, но никаких изменений (признаков жизни)...
ЧТО Я ЕЩЕ НЕ ТАК СДЕЛАЛ.....

Програма:


LIST P=18F4550, F=INHX32,r=dec ;directive to define processor
#include <P18F4550.INC> ;processor specific variable definitions

;******************************************************************************
;Configuration bits

CONFIG FOSC = HS ;HS oscillator, HS used by USB

;******************************************************************************
;Variable definitions


ds_temp equ 0xdd

UDATA
WREG_TEMP RES 1 ;variable in RAM for context saving
STATUS_TEMP RES 1 ;variable in RAM for context saving
BSR_TEMP RES 1 ;variable in RAM for context saving

UDATA_ACS

EXAMPLE RES 1 ;example of a variable in access RAM


;******************************************************************************
;EEPROM data

DATA_EEPROM CODE 0xf00000

DE "Test Data",0,1,2,3,4,5

;******************************************************************************
;Reset vector


RESET_VECTOR CODE 0x0000

goto Main ;go to start of main code

;******************************************************************************
;High priority interrupt vector

HI_INT_VECTOR CODE 0x0008

bra HighInt ;go to high priority interrupt routine

;******************************************************************************
;Low priority interrupt vector and routine


LOW_INT_VECTOR CODE 0x0018

bra LowInt ;go to low priority interrupt routine

;******************************************************************************
;High priority interrupt routine

CODE

HighInt:
btfss PORTB,2
goto next2
bcf INTCON3,1
bcf INTCON2,4
bsf ds_temp,0
retfie FAST

next2:
btfss PORTB,1
goto next1
bcf INTCON3,0
bcf INTCON2,5
bsf ds_temp,0
retfie FAST

next1:
btfss PORTB,0
goto next0
bcf INTCON,1
bcf INTCON2,6
bsf ds_temp,0
retfie FAST
next0:
bcf INTCON3,0
bsf INTCON2,5
bcf INTCON3,1
bsf INTCON2,4
bcf INTCON,1
bsf INTCON2,6
bcf ds_temp,0
retfie FAST

;******************************************************************************
;Low priority interrupt routine

LowInt:
movff STATUS,STATUS_TEMP ;save STATUS register
movff WREG,WREG_TEMP ;save working register
movff BSR,BSR_TEMP ;save BSR register

; *** low priority interrupt code goes here ***


movff BSR_TEMP,BSR ;restore BSR register
movff WREG_TEMP,WREG ;restore working register
movff STATUS_TEMP,STATUS ;restore STATUS register
retfie

;******************************************************************************
;Start of main program

Main:
; Interrypt
bsf RCON,7
bsf INTCON,7
bsf INTCON,4
bsf INTCON2,0
bsf INTCON2,1
bsf INTCON2,2
bsf INTCON2,5
bsf INTCON2,4
bsf INTCON3,6
bsf INTCON3,7
bsf INTCON3,4
bsf INTCON3,3


;Set PORTs
bcf T0CON,7
bsf T0CON,6
bcf T0CON,5
bcf T0CON,3
bcf T0CON,2
bcf T0CON,1
bcf T0CON,0
bcf INTCON,5
clrf PORTA
clrf PORTB
clrf PORTC
clrf PORTD
clrf PORTE
movlw 0x07
movwf ADCON1
movlw 0x07
movwf CMCON
movlw b'00000111'
movwf TRISB ;Inpyt interrypt 0,1,2
movlw b'11111111'
movwf TRISA ;
movlw b'11111111'
movwf TRISC ;
movlw 0x0;
movwf TRISD ;If interrypt true or false set states of bits
movlw b'00000000'
movwf TRISE
clrf ds_temp;


loop:
btfsc ds_temp,0
goto true
goto false

true:
movlw 0xff;
movwf PORTD
goto loop

false:
movlw 0x00;
movwf PORTD
goto loop

;******************************************************************************
;End of program
END

Схема:

Нажмите для просмотра прикрепленного файла
@Ark
Цитата
Добрый день еще раз....
Я немного переделал проект следующим образом: ....
ЧТО Я ЕЩЕ НЕ ТАК СДЕЛАЛ.....

Вы начали усложнять программу, так и не добившись работоспособности первого варианта. Это не правильно. Нужно вернуться к первоначальной, простой версии вашей программы, и, для начала, заставить работать ее. Пока эту задачку не решите (на реальной схеме, а не в отладчике!) - двигаться дальше нет смысла...
Последний вариант схемы подойдет. Поменяете только в исходной версии программы RB6 на RB0, например, чтобы не переделывать схему. Проверьте все ли биты конфигурации выставлены правильно при прошивке. Посмотрите осциллографом генерит ли кварц...
Herz
Подождите с прерываниями. Для начала упростите программу по максимуму, пусть она хоть просто моргает одним светодиодом в бесконечном цикле. Добейтесь, чтобы "задышала". WDT отключен? Осциллограф есть? Проверьте генерацию (может и генератор сконфигурирован неправильно), возьмите кварц частотой поменьше для начала.
mustelus
Кварц генерит, проверил осциллографам...
WDT отключон....
Меня смущает вот что, кондеры на кварц по 20пФ я взял не новые а выпоял из платы, если быть точнее то один по замерам гдето 18 пФ, а другой 19.5пФ (но кварц та генерит)...
На сколько я знаю ето не критично, кварц та генерит, вот только значение частоты не посмотрел (осцилограф не позваляет)...
Может в етом проблема...
@Ark
Вы, лучше, упростите программу до предела, как Вам Herz советует, и добейтесь, чтобы она заработала.
Вот примерно так, хотя бы:

LIST P=18F4550, F=INHX32, r=dec
#include <P18F4550.INC>
CONFIG FOSC = HS
main:
clrf PORTD
movlw b'00000000'
movwf TRISD
movlw b'11111111'
movwf PORTD
LOOP:
goto LOOP
END

Если заработает, то все светодиоды должны зажечься, согласно вашей схеме.
Разберитесь со значеними всех битов конфигурации по даташиту и установите нужные значения.
Часто забывают отключить WDT, режим низковольтного программирования и режим отладчика.
P.S. Чем прошиваете-то?
mustelus
Прошиваю програматором "Phyton ChipProgUSB"...
Я в курсе про все биты конфигурации rolleyes.gif
mustelus
Все, нашол, все дело в MCLR (подтянул вывод MCLR через резистор 5К не к питанию а к общей точке), ну запутался маленько и не туда ткнул.... laughing.gif
mustelus
Здравствуйте госпада.... Продолжаю сражаться с микрокантролером...
На сей раз дособрал схему для работы по USB шине, но снова проблема, не осуществляеться подключение к компу (при подключении шнура вообще никаких признаков, ни неопознанных оборудований ничего)....
В чом еще может быть проблема....
Вот схема...

Нажмите для просмотра прикрепленного файла
ar__systems
Цитата(mustelus @ Dec 15 2009, 16:04) *
Здравствуйте госпада.... Продолжаю сражаться с микрокантролером...
На сей раз дособрал схему для работы по USB шине, но снова проблема, не осуществляеться подключение к компу (при подключении шнура вообще никаких признаков, ни неопознанных оборудований ничего)....
В чом еще может быть проблема....

А в чем проблема? Все работает как и должно. Чип-то отключен от шины пока вы регистры не проинициализируете. USB это вам не КОМ-порт и не паралелльный порт, все ГОРАЗДО сложнее. Возьмите сампл ЮСБ программу на микрочип.ком. Хотя вряд ли полегчает, учитывая ваши проблеммы со светодиодами.
mustelus
Регистры. Понятно, так я ж не пустой чип подключаю а якобы с рабочей програмой (используя CDC клас), и якобы у меня есть приложение на комп и т.д....
P.S. со светодиодами вже давно покончено, все варианты работают, вся проблема была связана с неправильно собранным аппаратнам обеспечением...
ar__systems
Цитата(mustelus @ Dec 16 2009, 12:11) *
Регистры. Понятно, так я ж не пустой чип подключаю а якобы с рабочей програмой (используя CDC клас), и якобы у меня есть приложение на комп и т.д....
P.S. со светодиодами вже давно покончено, все варианты работают, вся проблема была связана с неправильно собранным аппаратнам обеспечением...


регистры тем не менее не проинициализированы, в частности тот, где пуллапы задаются.
mustelus
Вот не задача, в програме все инициализировано но похоже что аппаратно не инициализируеться
(макрос InitializeSystem() в main.c файле), регистр UCFG инициализируеться как 00010100.
Подтялул внешним резистором ногу D+ к Vusb, заработало...
Так что ж за фигня...
Вот исходник...
Нажмите для просмотра прикрепленного файла
dENIM
Цитата(@Ark @ Nov 26 2009, 22:52) *
- Светодиоды, также, лучше подключить общей точкой к питанию, а не к земле. Соответственно, развернув их, и включать подачей не 1, а 0.

Хоть и оффтоп, но как по мне, это уже не актуально лет восемь.
@Ark
PIC18F2450/4450
Data Sheet
....
21.0 ELECTRICAL CHARACTERISTICS
Absolute Maximum Ratings
....
Maximum current out of VSS pin ........ 300 mA
Maximum current into VDD pin .......... 250 mA
....
abrakada
Что касается usb, так это действительно непростая штука. Даже используя готовое firmware, скачанное с сайта микрочип, не факт что все пойдет так, как надо. Например, готовое по на сайте может использовать метод "polling"(последовательная обработка запросов) при работе с юсб, и при увеличении полезного кода устройство не проходит процедуру инициализации. Это очень хорошо заметно если использовать программу мониторинга юсб трафиика (bus hound например). Эта проблема была решена переходом на работу с юсб по прерываниям. Также стоит посмотреть на выбранный метод тактирования мк. При работе с юсб через поллинг у меня все было ок с осциллятором "usb = hs +pll enabled, primary clock=internal". Но, не знаю почему, эта схема работать перестала и я настроил "usb = hs +pll enabled, primary clock=hs+prescaler". И это далеко не все "подводные камни"
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.