Страница 1 из 2
PIC-контроллеры(P16F877A) что? как? почему я?
Добавлено: Вт сен 29, 2009 18:23:06
Valerian
Уважаемые Коты, извините за столь наглое нарушение вашего спокойствия, но у меня возникла проблема, справиться с которой самостоятельно просто не в силах - и я рассчитываю на вашу помощь.
Не могу сказать, что совсем не знаком с электроникой, т.к. каждое утро я имею привычку включать электрический чайник, но на этом мои познания в принципе и заканчиваются. А задача поставлена так:
к порту D подключено 8 светодиодов. Организовать "бегущий огонь". Кнопки, подключенные к старшим разрядам порта B, управляют скоростью бега. (Режи работает, пока кнопки нажаты)
Мастерского познания чайника в данном случае оказалось недостаточно. Попытался разобраться сам, спаял маленькую аналоговую схему (оказалось, что это не так сложно, хотя процесс весьма трудоемкий), но просветлению в поле микроконтроллеров это никак не способствовало.
В моем представлении это выглядит так:
как смоделировать нажатие клавиш порта B?
я представляю программу так:
//KZ - коэффициент_задержки
Код: Выделить всё
@begin:
KZ=B1+B2+B3+B4 //считаем количество нажатых клавиш
JZ @end
D1=1; //загорелся первый светодиод(по крайней мере я на это надеюсь)
delay(kz*'сколько_надо');
D1=0;
delay(kz*'сколько_надо');
D2=1;
delay(kz*'сколько_надо');
D2=0;
.....
D7=1;
delay(kz*'сколько_надо');
D7=0;
@end:
goto begin;
Все надо написать на ассемблере (личном, пиковском)... Пишут, что даже есть программы для моделирования... но только моделировать пока нечего... Время поджимает, а я в прострации...
Да, физически устройства нет и программатора тоже... Как делать/проверять - ума не приложу... Буду благодарен за любую информацию - желательно как можно максимум информативную, ибо времени до армагеддона 2 дня
ЗЫ я боюсь это не последнее мое столкновение с электроникой и программируемыми контроллерами в частности. Скажите, надо ли их приобретать, если да, то какие. Если есть какая-нибудь литература "для полных идиотов" - тоже буду благодарен
Добавлено: Вт сен 29, 2009 18:34:23
krant
877 я думаю вам лучше пока что отложить, с вашим инуждами вполне может справиться и PIC 16F628A.
Если вы хотите подключить кнопки на порт В , то вам необзодимо всего-лишь подать питание на нужный порт (с питанием не переусердствовать, максимальное значение лучше использовать не больше того что питает контроллер).
Как мне кажется бегущая строка пока что сложновато, попробуйте сперва хотябы зажечь диод, после им помигать, а дальше потихонечку и до бегущей строки доберётесь (именно так я когда то начинал).
К сожалению я немогу вам ничего подсказать по вашему коду, т.к. не знаком с его синтаксисом, я бы вам порекомендовал PICC
Схем программаторов море.
Добавлено: Вт сен 29, 2009 18:42:19
Valerian
877 я думаю вам лучше пока что отложить, с вашим инуждами вполне может справиться и PIC 16F628A.
В университете только 877 и на него надо залить готовый код
К сожалению я немогу вам ничего подсказать по вашему коду, т.к. не знаком с его синтаксисом, я бы вам порекомендовал PICC
Код является не более чем изложением общей направленности мысли и был создан лично мной для демонстрации общей логики
Как мне кажется бегущая строка пока что сложновато, попробуйте сперва хотябы зажечь диод, после им помигать, а дальше потихонечку и до бегущей строки доберётесь (именно так я когда то начинал).
Пока что для меня обе эти задачи равносильно невыполнимы

Добавлено: Вт сен 29, 2009 18:50:47
otest
Добавлено: Вт сен 29, 2009 18:51:46
Igor_67
Можно и не имея физического контакта с МК и программатором, все написать и проанализировать. Вот немного литературы по ПИКам. Прочти внимательно. Те программы, которые там рекомендуются - скачай. И будет тебе счастье ( по крайней мере, хоть начнешь понимать, о чем говорить и спрашивать). Вот ссылка на учебник:
http://xtrason.mylivepage.ru/file/2344/ ... C3%2C4.rar , кстати, рекомендуемые в учебнике программы тоже есть на моем сайте.

К тому же не помешало бы и даташит на указанный МК немного покурить...

Добавлено: Вт сен 29, 2009 19:16:25
Valerian
Можно и не имея физического контакта с МК и программатором, все написать и проанализировать. Вот немного литературы по ПИКам. Прочти внимательно. Те программы, которые там рекомендуются - скачай. И будет тебе счастье ( по крайней мере, хоть начнешь понимать, о чем говорить и спрашивать). Вот ссылка на учебник:
Вы можете скачать файл с помощью секретного кода.

Добавлено: Вт сен 29, 2009 19:21:40
Igor_67
Не понял вопроса! О каком секретном коде вы говорите?

Ниже то прочитайте, надо просто тупо зарегиться. Какие проблемы?
Отсылаю на свой сайт по причине того, что емкие файлы на "Коте" не крепятся к месаге. А жаль...
Добавлено: Вт сен 29, 2009 19:25:18
Valerian
извините, разобрался - бесплатное скачивание для зарегистрированных пользователей. Большое спасибо
Добавлено: Вт сен 29, 2009 19:27:11
Igor_67
Да не за что, пользуйтесь на здоровье!
Добавлено: Вт сен 29, 2009 19:27:12
kalobyte
как-то странно выглядит все
человек учится в универе и внезапно ему дают задание, где он ничего не понимает
либо не ходил на заанятия, либо декан заставил гуманитариев изучать сею науку
но во второе я что-то слабо верю
автор, а какой вариант ответа у тебя?
Добавлено: Вт сен 29, 2009 19:29:26
Igor_67
Да какая разница? Самое главное в этой ситуёвине, что человек ХОЧЕТ разобраться! ИМХО! Ну или, по крайней мере, ему таки придется это сделать...

Добавлено: Вт сен 29, 2009 19:30:59
krant
в среде PICC
это описывается в 3 строчки (причём две из них для вас может быть позже станут как слова "Здравствуйте" перед началом разговора)
while(1){
output_high(PIN_B1);
}
где while(1) - это бесконечный цикл. если вы не знакомы с синтаксисом С, то "{" и "}" это грубо говоря "метки" которые подсказывают компилятору: "здесь начинается ("{") и заканчивается ("}") код относящийся к условию while(1)"
вторая строчка непосредственно зажигает диод на Ножке B1 (грубо говоря вместо В1 может стоять Е5, А4,В2, т.е. любой пин порта ввода-вывода).
Кстати, вместо :
output_high(PIN_B1),
так же можно писать:
output_bit(PIN_B1,1) (1 - это значение бита, либо 0 (тока нет, порт при этом может испольнять роль "минуса", либо 1 - ток есть).
так же можно зажигать весь порт целиком:
output_b(255) (число может ввариироваться от 0~255, при значении 0 не горит ниодин диод, при 255 горят все ножки, от B0 до B7).
Добавлено: Вт сен 29, 2009 19:35:39
Igor_67
На "СИ", конечно проще, но у него задание то написать на АСМе...

Добавлено: Ср сен 30, 2009 09:25:00
krant
ох моя невнимательность
Надо былобы уточнить, надо предоставить hex или же исходники тоже.
Добавлено: Ср сен 30, 2009 17:42:25
Valerian
Си как-то более приятен
А есть какие-нибудь программы для интерпретации С в асм и цифр в асм?
новая попытка. Имеет право на жизнь? В чем протестировать бы?
Код: Выделить всё
#include "P16F877A.INC"
ORG 0
START BSF STATUS,RP0
CLRF TRISB ; порты A и D на вывод
CLRF TRISD ;
BCF STATUS,RP0
BEGIN MOVLW 0xFF
MOVWF PORTB ;забили порт B еденицами(в битах нажатых кнопок должен установиться 0)
MOVLW 0x01
MOV PORTD,W
TRY MOVLW RD1
ADDLW RD2
ADDLW RD3
ADDLW RD4
JZ BEGIN
CALL DELAY
RLF PORTD
JMP @TRY
DELAY ;задержка
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
DEC W
JNZ @DELAY
END
Надо былобы уточнить, надо предоставить hex или же исходники тоже.
полный отчет с блок-схемой и словесном описании работы

Добавлено: Ср сен 30, 2009 18:32:25
krant
проверить всё это дело можешь в Proteus. Скачивай и пользуйся.
Добавлено: Ср сен 30, 2009 19:34:01
uldemir
MOVWF PORTB ;забили порт B еденицами(в битах нажатых кнопок должен установиться 0)
Порт спалишь. Это не MSC51. Port B не надо программировать на вывод. Надо на ввод.
Добавлено: Ср сен 30, 2009 20:02:09
otest
Бросилось в глаза
при переходе по CALL должен быть выход RETURN.
Добавлено: Ср сен 30, 2009 21:42:35
uldemir
Вообще-то для предотвращения армаггедона мало данных. Например не указано от чего тактируется микросхема. Кстати, мне подумалось, что в таком случае приемлемую задержку можно организовать watchdog-ом. Надо сконфигурировать пределитель на watchdog и установить коэффициент деления такой, чтобы соответствовал максимальной скорости. а дальше примерно так:
сравнить переменную delay с числом набранным кнопками (если кнопки замыкаются на массу, то предварительно инвертировать xorlw 0xff)
если больше, то обнуляем delay и сдвигаем огоньки.
Иначе инкрементируем delay.
Укладываем процессор в sleep и по побудке переходим на начало этого цикла.
Вот пример как я делал для 628-го кристалла UTP сканер (здесь были аналогичные конструкции)
Код: Выделить всё
; старт программы. начальная инициализация.
;
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_ON & _ER_OSC_CLKOUT & _LVP_OFF & _BODEN_OFF
; Настройка портов:
; RB0-7 - выходы на разъем
; RA0-4 - пока выходы висящие. кроме 1, к которому подключена кнопка
start:
page0 ; регистры 00-7f
clrf porta ;
clrf portb
page1 ; регистры 80-ff
movlw b'00000000'
movwf trisb
movlw b'00000000' | 1<<key
movwf trisa
;
movlw 1<<NOT_RBPU | 1<<PSA | 1<<PS2 | 1<<PS1 ; коэф.деления 1:64, подкл.к WDT,
movwf option_reg ; тактируется от внут., нагрузки выкл.
;
page0
;
;
clrwdt
startclock:
;
incf i
movf i, w
call scanseq
movwf portb
sleep
;
goto startclock
;
Коэффициент 1:64 - это около 1 секунды, думаю, для этой задачи я взял бы в 16 раз меньше - 1:4.
Добавлено: Ср сен 30, 2009 23:34:07
Настя
Valerian - вот вам счастье. С вас бутылка буратино.
Асменный проект, откомпилированный в MPLAB IDE v8.30
+ проект Протеуса 7.2 (SP6)
см вложенные файлы
...а чтобы вам скучно не было, кнопки на D, светодиоды на B.
Вам остается перекинуть местами линии B и D и не забыть
использовать возможность внутренних подтягивающих
резисторов на линиях порта B (перекидывать в программе).
+ картинка схема