Форум РадиоКот https://radiokot.ru/forum/ |
|
Проект на PIC16F628 https://radiokot.ru/forum/viewtopic.php?f=58&t=114220 |
Страница 1 из 1 |
Автор: | ser82g [ Чт мар 05, 2015 17:42:28 ] |
Заголовок сообщения: | Проект на PIC16F628 |
Здравствуйте, подскажите, пожалуйста, нужно создать схему: 1 . На вход 1 приходит один импульс на выходе образуется 1-15 импульсов (выбирается двумя кнопками + -) с частотой 1 герц 2. Есть еще одна кнопка при нажатии, на которую импульсы идут постоянно. 3. И еще один вход 2 если на нем логическая 1 то при подаче импульса на вход 1 на входе ничего не происходит. Желательно на PIC16F628 (просто есть в наличии). Сам ни разу не программировал, если можно, то с проектом в Proteus. Заранее благодарен. P.S. Извините если что-то не понятно написал, подскажите пожалуйста очень нужно. |
Автор: | pyzhman [ Чт мар 05, 2015 18:21:12 ] |
Заголовок сообщения: | Re: Проект на PIC16F628 |
Бюджет есть? |
Автор: | ser82g [ Чт мар 05, 2015 18:31:31 ] |
Заголовок сообщения: | Re: Проект на PIC16F628 |
Не бюджета нет, сам помогаю бесплатно. Просто хочется немного разобраться. |
Автор: | Аlex [ Чт мар 05, 2015 20:03:14 ] |
Заголовок сообщения: | Re: Проект на PIC16F628 |
В чём хочется разобраться ? И что Вам подсказать ? Вопросы где ? |
Автор: | ser82g [ Чт мар 05, 2015 20:10:37 ] |
Заголовок сообщения: | Re: Проект на PIC16F628 |
Хотя бы какие-то примеры, с таким принципом работы |
Автор: | Аlex [ Чт мар 05, 2015 20:23:53 ] |
Заголовок сообщения: | Re: Проект на PIC16F628 |
С каким принципом ? Примеров работ с кнопками, с выводами, миганием лампочек и т.д... просто уйма в интернете. Начинайте делать, появятся конкретные вопросы - задавайте. А пока от Вас видны только хотелки... ![]() |
Автор: | ser82g [ Вт мар 10, 2015 13:22:19 ] |
Заголовок сообщения: | Re: Проект на PIC16F628 |
Здравствуйте, написал пробную версию программы (в proteus работает), посмотрите, может где-то что-то лишнего написал. И самое главное подскажите, пожалуйста, как переменную kol_imp сначала считать с EEprom, а потом при каждом изменении туда записать, что-то не могу понять. Заранее благодарен. |
Автор: | ser82g [ Вт мар 10, 2015 13:38:14 ] |
Заголовок сообщения: | Re: Проект на PIC16F628 |
Код: #include <pic.h>
__CONFIG (INTIO & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS); void podgot (void); //функция подгатовки микропроцессора void imp_cet (void); //функция импульса void plys (void); //функция увеличение количества импульсов void minys (void); //функция уменьшение импульсов void proka (void); //функция постоянных импульсов void otab (void); //функция отображение количества импульсов unsigned char kol_imp; //глобальная переменная количество импульсов bit nac1; bit nac2; bit nac3; bit nac4; void main (void) { podgot(); //вызов функции подготовки микропроцессора kol_imp = 2; //установка глобальной переменной otab(); //отображение количества импульсов while (1) //бесконечный цикл { if ((RA1 == 1) & (nac1==0) & (RA5==1)) imp_cet(); else if (RA1 == 0) nac1=0; if ((RA2 == 1) & (nac2==0)) plys(); else if (RA2 == 0) nac2=0; if ((RA3 == 1) & (nac3==0)) minys(); else if (RA3 == 0) nac3=0; if ((RA4 == 1) & (RA5 ==1)) proka (); if (RA5 == 0) RA7 = 1; else RA7 = 0; } } //////////////////////////////////////////////////////////////////////////// void podgot (void) { TRISA = 0b00011110; // направление работы ножек порта А TRISB = 0b00000000; // направление работы ножек порта B CMCON = 0x07; // отключение компараторов PORTA = 0b00000000; // чистим порты A PORTB = 0b00000000; // чистим порты B RBPU = 0; // подтягивающие R (1-откл, 0-вкл) } /////////////////////////////////////////////////////////////////////////// void imp_cet (void) { unsigned int sader_r; //задержка работы светодиода unsigned int sader_p; //задержка не работы светодиода unsigned int kol_imp_tem; //количество импульсов локальная переменная чтобы не менять глобальную kol_imp_tem = kol_imp; //перенос количества импульсов с глобальной переменной в локальную nac1=1; while (kol_imp_tem != 0) //цикл по количеству импульсов { RA0 = 1; //включение светодиода sader_r = 8000; //задержка работы светодиода while (sader_r-->0); //цикл задержки работы светодиода RA0 = 0; //выключение светодиода sader_p = 20000; //задержка выключенного светодиода while (sader_p-->0); //цикл задержки выключенного светодиода kol_imp_tem=kol_imp_tem - 1; //уменьшение количества импульсов светодиода } } ///////////////////////////////////////////////////////////////////////////// void plys (void) { nac2 = 1; if (kol_imp < 19) { kol_imp = kol_imp + 1; otab(); } } //////////////////////////////////////////////////////////////////////////// void minys (void) { if (kol_imp > 0) { nac3 = 1; kol_imp = kol_imp - 1; otab(); } } ////////////////////////////////////////////////////////////////////////// void proka (void) { unsigned int sader_r; //задержка работы светодиода unsigned int sader_p; //задержка не работы светодиода RA0 = 1; //включение светодиода sader_r = 8000; //задержка работы светодиода while (sader_r-->0); //цикл задержки работы светодиода RA0 = 0; //выключение светодиода sader_p = 20000; //задержка выключенного светодиода while (sader_p-->0); //цикл задержки выключенного светодиода } ///////////////////////////////////////////////////////////////////////// void otab (void) { switch (kol_imp) { case 0: PORTB = 0b00111111; break; case 1: PORTB = 0b00000110; break; case 2: PORTB = 0b01011011; break; case 3: PORTB = 0b01001111; break; case 4: PORTB = 0b01100110; break; case 5: PORTB = 0b01101101; break; case 6: PORTB = 0b01111101; break; case 7: PORTB = 0b00000111; break; case 8: PORTB = 0b01111111; break; case 9: PORTB = 0b01101111; break; case 10: PORTB = 0b10111111; break; case 11: PORTB = 0b10000110; break; case 12: PORTB = 0b11011011; break; case 13: PORTB = 0b11001111; break; case 14: PORTB = 0b11100110; break; case 15: PORTB = 0b11101101; break; case 16: PORTB = 0b11111101; break; case 17: PORTB = 0b10000111; break; case 18: PORTB = 0b11111111; break; case 19: PORTB = 0b11101111; break; } } |
Автор: | Аlex [ Вт мар 10, 2015 13:43:43 ] |
Заголовок сообщения: | Re: Проект на PIC16F628 |
http://ww1.microchip.com/downloads/en/D ... 40044G.pdf стр. №91 По-Русски по EEPROM - http://www.microchip.ru/files/d-sheets-rus/pic16_7.pdf Ну и вот, в целом - http://www.microchip.ru/lit/?mid=1x0 Извините, но переписывать сюда, уже кем то переписанное, вряд ли кто будет. Читайте... |
Автор: | ser82g [ Вт мар 10, 2015 15:49:30 ] |
Заголовок сообщения: | Re: Проект на PIC16F628 |
Все прочитал, вот так получилось (в proteus работает), подскажите, я правильно все понял? И еще подскажите, если в память надо записать большое число (больше 255) как это правильно делается? Код: #include <pic.h>
__CONFIG (INTIO & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS); void podgot (void); //функция подгатовки микропроцессора unsigned char ee_read(unsigned char adres); //функция чтения EEPROM unsigned char ee_write(unsigned char data, unsigned char adres); //функция записи EEPROM void imp_cet (void); //функция импульса void plys (void); //функция увеличение количества импульсов void minys (void); //функция уменьшение импульсов void proka (void); //функция постоянных импульсов void otab (void); //функция отображение количества импульсов unsigned char kol_imp; //глобальная переменная количество импульсов bit nac1; bit nac2; bit nac3; bit nac4; void main (void) { podgot(); //вызов функции подготовки микропроцессора kol_imp = ee_read(0x00); if ((kol_imp >19) | (kol_imp < 0)) kol_imp =1; otab(); //отображение количества импульсов while (1) //бесконечный цикл { if ((RA1 == 1) & (nac1==0) & (RA5==1)) imp_cet(); else if (RA1 == 0) nac1=0; if ((RA2 == 1) & (nac2==0)) plys(); else if (RA2 == 0) nac2=0; if ((RA3 == 1) & (nac3==0)) minys(); else if (RA3 == 0) nac3=0; if ((RA4 == 1) & (RA5 ==1)) proka (); if (RA5 == 0) RA7 = 1; else RA7 = 0; } } //////////////////////////////////////////////////////////////////////////// void podgot (void) { TRISA = 0b00011110; // направление работы ножек порта А TRISB = 0b00000000; // направление работы ножек порта B CMCON = 0x07; // отключение компараторов PORTA = 0b00000000; // чистим порты A PORTB = 0b00000000; // чистим порты B RBPU = 0; // подтягивающие R (1-откл, 0-вкл) } /////////////////////////////////////////////////////////////////////////// unsigned char ee_read(unsigned char adres) { EEADR = adres; RD = 1; return EEDATA; } /////////////////////////////////////////////////////////////////////////// unsigned char ee_write(unsigned char data, unsigned char adres) { GIE=0; EEADR=adres; EEDATA=data; WREN=1; EECON2=0x55; EECON2=0xAA; WR=1; GIE=1; } /////////////////////////////////////////////////////////////////////////// void imp_cet (void) { unsigned int sader_r; //задержка работы светодиода unsigned int sader_p; //задержка не работы светодиода unsigned int kol_imp_tem; //количество импульсов локальная переменная чтобы не менять глобальную kol_imp_tem = kol_imp; //перенос количества импульсов с глобальной переменной в локальную nac1=1; while (kol_imp_tem != 0) //цикл по количеству импульсов { RA0 = 1; //включение светодиода sader_r = 8000; //задержка работы светодиода while (sader_r-->0); //цикл задержки работы светодиода RA0 = 0; //выключение светодиода sader_p = 20000; //задержка выключенного светодиода while (sader_p-->0); //цикл задержки выключенного светодиода kol_imp_tem=kol_imp_tem - 1; //уменьшение количества импульсов светодиода } } ///////////////////////////////////////////////////////////////////////////// void plys (void) { nac2 = 1; if (kol_imp < 19) { kol_imp = kol_imp + 1; otab(); ee_write(kol_imp, 0x00); } } //////////////////////////////////////////////////////////////////////////// void minys (void) { if (kol_imp > 0) { nac3 = 1; kol_imp = kol_imp - 1; otab(); ee_write(kol_imp, 0x00); } } ////////////////////////////////////////////////////////////////////////// void proka (void) { unsigned int sader_r; //задержка работы светодиода unsigned int sader_p; //задержка не работы светодиода RA0 = 1; //включение светодиода sader_r = 8000; //задержка работы светодиода while (sader_r-->0); //цикл задержки работы светодиода RA0 = 0; //выключение светодиода sader_p = 20000; //задержка выключенного светодиода while (sader_p-->0); //цикл задержки выключенного светодиода } ///////////////////////////////////////////////////////////////////////// void otab (void) { switch (kol_imp) { case 0: PORTB = 0b00111111; break; case 1: PORTB = 0b00000110; break; case 2: PORTB = 0b01011011; break; case 3: PORTB = 0b01001111; break; case 4: PORTB = 0b01100110; break; case 5: PORTB = 0b01101101; break; case 6: PORTB = 0b01111101; break; case 7: PORTB = 0b00000111; break; case 8: PORTB = 0b01111111; break; case 9: PORTB = 0b01101111; break; case 10: PORTB = 0b10111111; break; case 11: PORTB = 0b10000110; break; case 12: PORTB = 0b11011011; break; case 13: PORTB = 0b11001111; break; case 14: PORTB = 0b11100110; break; case 15: PORTB = 0b11101101; break; case 16: PORTB = 0b11111101; break; case 17: PORTB = 0b10000111; break; case 18: PORTB = 0b11111111; break; case 19: PORTB = 0b11101111; break; } } |
Автор: | ser82g [ Вт мар 10, 2015 17:53:09 ] |
Заголовок сообщения: | Re: Проект на PIC16F628 |
Ну хоть одним глазком кто-нибудь гляньте, все ли правильно я понял по EEPROM |
Автор: | Аlex [ Вт мар 10, 2015 22:56:37 ] |
Заголовок сообщения: | Re: Проект на PIC16F628 |
Если всё записывается и читается, то правильно ![]() Если нужно работать с числами, размером больше 1 байта - делите число на несколько байтов. Это же логично ![]() |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |