|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 3:20 pm
Помощ за програма на PIC16F877
| Автор |
Съобщение |
|
miro_9703
Ранг: Новодошъл
Регистриран на: Чет Авг 15, 2013 3:07 am Мнения: 101 Местоположение: град Рудозем
|
 Помощ за програма на PIC16F877
Здравейте, тъй като така да се каже реших вече да си правя разни схемички с PIC-ове разбрах, че е време да започна и програмите за тях да си пиша и т.н, но преди това си свалих Proteus 8 и там си пускам разни симулации на схеми от интернет и се опитвам да си обесня как работят и т.н. Днес намерих една схема на кодова брава и реших да и пусна симулация в Proteus. Направих си схемата в протеус, но когато стигнах до програмата за PIC-а - ударих на камък. Схемата е от тук: http://latesteeprojects.blogspot.com/20 ... 6f887.html и както виждате по-надолу на страницата е даден само код, който незнам какво да го правя, къде да го въвеждам и т.н. В протеус до сега като пусках симулации на схемите с PIC задавах пътя до .hex файла и всичко работеше, но сега нямам .hex файл и въпроса ми е можете ли да ми обясните как аджеба се конвертира този код, за да получа .hex файла, който ми е нужен.
_________________ Тате, днес единствено аз отговорих на въпроса на учителката. -Браво сине, и какъв беше въпроса ? -Кой не си е написал домашното?
|
| Нед Фев 08, 2015 4:38 pm |
|
 |
|
pechkov
Ранг: Напреднал
Регистриран на: Пет Фев 14, 2014 4:45 pm Мнения: 439 Местоположение: Монтана
|
 Re: Помощ за програма на PIC16F877
Това е "сорс код", т.е. първоизточника на програмата, който се пише от човек. Писането се прави в т.нар. "развойна среда", и след това с инструментите на тази развойна среда се "компилира" до машинен код - .hex файл. Получения hex файл се прехвърля към процесора чрез програматор (допълнително устройство), и едва тогава процесора ще може самостоятелно да изпълни въпросната програма. microC вероятно е средата на Mikro Elektronika, можеш да изтеглиш оттам съвсем свободно. Работи безплатно за проекти до 2000 програмни думи. Ако искаш да правиш по-големи проекти - може да купиш лиценз, или... така де.  Това е от мен засега. Питай нещо конкретно.
_________________ Не карай по-бързо от своя ангел-пазител!
|
| Нед Фев 08, 2015 6:39 pm |
|
 |
|
miro_9703
Ранг: Новодошъл
Регистриран на: Чет Авг 15, 2013 3:07 am Мнения: 101 Местоположение: град Рудозем
|
 Re: Помощ за програма на PIC16F877
Благодаря за отговора. Свалих програмата от сайта, инсталирах я и я стартирах. След като я стартирах ми излезна това: 1.  Отляво в менюто натиснах на "New project" След това ми излезна това:  промените който съм направил тук е само на полето Project folder и Device name След като натиснах на бутона Next излезна това:  тук не съм променял нищо, просто дадах Next След което излезна това:  също нищо не променях, просто дадах Next и излезна това:  просто цъкнах на Finish. След което се появи едно поле:  предполагам тук трябва да сложа кода от страницата където е ? След това какво се прави ?
_________________ Тате, днес единствено аз отговорих на въпроса на учителката. -Браво сине, и какъв беше въпроса ? -Кой не си е написал домашното?
|
| Нед Фев 08, 2015 7:42 pm |
|
 |
|
amdatlon
Ранг: Почетен член
Регистриран на: Чет Мар 19, 2009 8:33 pm Мнения: 804
|
 Re: Помощ за програма на PIC16F877
|
| Нед Фев 08, 2015 9:25 pm |
|
 |
|
miro_9703
Ранг: Новодошъл
Регистриран на: Чет Авг 15, 2013 3:07 am Мнения: 101 Местоположение: град Рудозем
|
 Re: Помощ за програма на PIC16F877
Разбрах го как става, но дава тази грешка: Опитах с друг код, който го имам компилиран от интернет свален ... имам целия проект и опитах да го компилирам него да видя дали не греша аз някъде, но той се компилира без проблем. Този код който аз искам да компилирам и ми трябва дава грешката по-горе ... Кода е този:  |  |  |  | Код: unsigned short kp; char code1[15] ,user1[4];
int i = 0, j, cnt;
int w1;
//keypad module connections char keypadPort at PORTD; //end keypad module connections
//lcd module connections sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; //
void code_enter(){ kp = 0; //Reset key code variable //wait for key to be pressed and released do //kp = Keypad_Key_Press(); // store key code in kp variable kp = Keypad_Key_Click(); // store key code in kp variable while (!kp); //prepare value for output, transform key to it's ASCII value switch (kp){ case 1: kp = 49; break; // 1 case 2: kp = 50; break; // 2 case 3: kp = 51; break; // 3 //case 4: kp = 65; break; // A for 4x4 pad case 5: kp = 52; break; // 4 case 6: kp = 53; break; // 5 case 7: kp = 54; break; // 6 //case 8: kp = 66; break; // B for 4x4 pad case 9: kp = 55; break; // 7 case 10: kp = 56; break; // 8 case 11: kp = 57; break; // 9 //case 12: kp = 67; break; // C for 4x4 pad case 13: kp = 42; break; // * case 14: kp = 48; break; // 0 case 15: kp = 35; break; // # //case 16: kp = 67; break; // D for 4x4 pad }
code1[i] = kp; Lcd_Chr(2, i+1, code1[i]); //Print key ASCII value on Lcd i++; }
//20ms delay function no need of it
void code_read(){ //read data from eeprom Delay_ms(20); user1[0] = EEPROM_Read(0x00); // Read data from address 0 Delay_ms(20); user1[1] = EEPROM_Read(0x01); // Read data from address 1 Delay_ms(20); user1[2] = EEPROM_Read(0x02); // Read data from address 2 Delay_ms(20); user1[3] = EEPROM_Read(0x03); // Read data from address 3 Delay_ms(20); }
void code_write(){ //write data to eeprom Delay_ms(20); EEPROM_Write(0x00,code1[0]); // Write data to address 0 Delay_ms(20); EEPROM_Write(0x01,code1[1]); // Write data to address 1 Delay_ms(20); EEPROM_Write(0x02,code1[2]); // Write data to address 2 Delay_ms(20); EEPROM_Write(0x03,code1[3]); // Write data to address 3 }
void change_code(){ Lcd_Cmd(_LCD_CLEAR); // clear display Lcd_Out(1,1, "Enter New Code:");
i = 0;
code_enter(); code_enter(); code_enter(); code_enter();
code_write(); delay_ms(20); code_read(); delay_ms(20);
Lcd_Cmd(_LCD_CLEAR); // clear display Lcd_Out(1,1, "New Code Set"); Delay_ms(5000); }
void main(){ ADCON1 != 0x07; Keypad_Init(); // Initialize Keypad ANSEL = 0; // Configure AN pins as digital I/O ANSELH = 0;
c1on_bit=0; // disable comparator c2on_bit=0;
TRISC = 0x00; PORTC = 0x00;
Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // Clear display Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
code_read();
Lcd_Cmd(_LCD_CLEAR); //clear display Lcd_Cmd(_LCD_CURSOR_OFF); // cursor off //Lcd_Out(1, 1, msg1); //Delay_ms(500);
Lcd_Cmd(_LCD_CLEAR); // Clear display Lcd_Out(1, 5, "Ozyegin"); // Write message text on LCD Lcd_Out(2, 4, "University"); delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR); Lcd_Out(1, 1, "Digital Lock By:"); Lcd_Out(2, 1, "Waqas Hussain"); delay_ms(2000);
cnt = 0;
L1: do{ Lcd_Cmd(_LCD_CLEAR); Lcd_Out(2, 3, "Press *"); i = 0; code_enter(); if(code1[0] == 42){ // * Lcd_Cmd(_LCD_CLEAR); // clear display Lcd_Out(1, 1, "Enter Code"); //delay_ms(500); i = 0; code_enter(); code_enter(); code_enter(); code_enter(); code_enter(); if(code1[0] == '1' && code1[1] == '2' && code1[2] == '3' && code1[3] == '4' && code1[4] == '5' ){ // master code code_enter(); if(code1[5] == 35){ // # change_code();
} } else if(cnt<3 && code1[0] == user1[0] && code1[1] == user1[1] && code1[2] == user1[2] && code1[3] == user1[3] && code1[4] == 35){ // save password verification
Lcd_Cmd(_LCD_CLEAR); //Lcd clear Lcd_out(1,4,"Door Open"); //Door Open
EEPROM_Read(0x21); w1 = 1; Delay_ms(20); EEPROM_Write(0X21, w1); Delay_ms(20); EEPROM_Read(0x21);
//move stepper motor to ON position PORTC=0x03; Delay_ms(500); PORTC=0x06; Delay_ms(500); PORTC=0x0C; Delay_ms(500); PORTC=0x09; Delay_ms(500);
Delay_ms(5000); //goto L1;
LCD_Cmd(_LCD_CLEAR); Lcd_out(1,4,"Door Close");
EEPROM_Read(0x21); w1 = 0; Delay_ms(20); EEPROM_Write(0x21, w1); Delay_ms(20); EEPROM_Read(0x21);
//move stepper motor to OFF position PORTC=0x0C; Delay_ms(500); PORTC=0x06; Delay_ms(500); PORTC=0x03; Delay_ms(500); PORTC=0x09; Delay_ms(500);
Delay_ms(2000); //goto L1; }
else{ cnt++; Lcd_Cmd(_LCD_CLEAR); //clear display Lcd_Out(1, 1, "Wrong Password"); Delay_ms(2000); //goto L1; } if(cnt>=3) goto L1;
} }while(1);
}
|  |  |  |  |
Не съм го писал аз !
_________________ Тате, днес единствено аз отговорих на въпроса на учителката. -Браво сине, и какъв беше въпроса ? -Кой не си е написал домашното?
|
| Нед Фев 08, 2015 10:24 pm |
|
 |
|
pechkov
Ранг: Напреднал
Регистриран на: Пет Фев 14, 2014 4:45 pm Мнения: 439 Местоположение: Монтана
|
 Re: Помощ за програма на PIC16F877
В проекта е използван PIC16F887, а ти си заложил PIC16F877. Дори да са с идентични размери на корпуса и брой пинове - може да им се различават регистрите и функционалните характеристики. Например виждам в кода "ANSEL" и "ANSELH", които два регистъра при PIC16F887 управляват аналогово-цифровите входове. Обаче при PIC16F877, такива регистри няма. Добре е да изтеглиш документацията за процесора с който ще работиш, за да имаш откъде да проверяваш имената на регистрите за управление. Малко по-подробно бих могъл да ти помогна по скайп, ако имаш време. Скайпа ми е "pechkov".
П.П. c1on_bit=0 е по същата причина, касае компараторите, които при двата модела чипове също се различават.
_________________ Не карай по-бързо от своя ангел-пазител!
|
| Нед Фев 08, 2015 10:46 pm |
|
 |
|
miro_9703
Ранг: Новодошъл
Регистриран на: Чет Авг 15, 2013 3:07 am Мнения: 101 Местоположение: град Рудозем
|
 Re: Помощ за програма на PIC16F877
Благодаря ти ! Въобще не съм забелязал, че съм задал друг микроконтролер ...... Всичко тръгна. П.П: Скайпа ти го имам  Веднъж пак ми помага по скайп за едно захранване 
_________________ Тате, днес единствено аз отговорих на въпроса на учителката. -Браво сине, и какъв беше въпроса ? -Кой не си е написал домашното?
|
| Нед Фев 08, 2015 10:58 pm |
|
 |
|
pechkov
Ранг: Напреднал
Регистриран на: Пет Фев 14, 2014 4:45 pm Мнения: 439 Местоположение: Монтана
|
 Re: Помощ за програма на PIC16F877
Аха, сещам се.  Обърнатия транзистор. В такива случаи помни следното: Връзвай смело схемата, каквото е излишно - ще изгори. Господи, помогни, и заземи. 
_________________ Не карай по-бързо от своя ангел-пазител!
|
| Нед Фев 08, 2015 11:22 pm |
|
 |
|
miro_9703
Ранг: Новодошъл
Регистриран на: Чет Авг 15, 2013 3:07 am Мнения: 101 Местоположение: град Рудозем
|
 Re: Помощ за програма на PIC16F877
Дам. Правилно се сети  Сега един надявам се последен въпрос .... Значи, намерих в интернет една схема на брояч с PIC18F452 и реших да си я направя в Proteus и да и пусна симулация. Схемата е тази: http://1.bp.blogspot.com/-4qk4sCMqWaA/T ... th+lcd.jpg Програмата е тази:  |  |  |  | Код: //LCD pinout settings sbit LCD_RS at RD5_bit; sbit LCD_EN at RD4_bit; sbit LCD_D7 at RD3_bit; sbit LCD_D6 at RD2_bit; sbit LCD_D5 at RD1_bit; sbit LCD_D4 at RD0_bit;
//Pin direction sbit LCD_RS_Direction at TRISD5_bit; sbit LCD_EN_Direction at TRISD4_bit; sbit LCD_D7_Direction at TRISD3_bit; sbit LCD_D6_Direction at TRISD2_bit; sbit LCD_D5_Direction at TRISD1_bit; sbit LCD_D4_Direction at TRISD0_bit;
//inputs from buttons sbit up_counter at RB7_bit; sbit down_counter at RB6_bit; sbit reset_counter at RB5_bit;
//functions to perform different tasks void increment_counts(void); void decrement_counts(void); void reset_counts(void); void print_counts(void);
//Global variables unsigned int my_counts; unsigned int pre_counts; bit old_b1; bit old_b2; bit old_b3; char*text="WELCOME"; char*text1="counts=";
void main() { Lcd_init(); //initialize LCD connected to PORTD TrisB = 0xE0; //last three pins as input and other are output. 11100000 PortB = 0xE0; up_counter = 1; down_counter = 1; reset_counter = 1; my_counts = 0; pre_counts = 0; old_b1 = 1; old_b2 = 1; old_b3 = 1; Lcd_Cmd(_LCD_CLEAR); //Clear display Lcd_Out(1,6,text); //Print text to LCD, 2nd row, 1st column Lcd_Out(2,1,text1); //Print text to LCD, 2nd row, 1st column while(1){ if(up_counter == 0 && old_b1 == 1) increment_counts(); if(down_counter == 0 && old_b2 == 1) decrement_counts(); if(reset_counter == 0 && old_b3 == 1) reset_counts();
if(pre_counts != my_counts) print_counts(); pre_counts = my_counts; old_b1 = up_counter; old_b2 = down_counter; old_b3 = reset_counter; } } void increment_counts(void) { my_counts++; if(my_counts >= 10000) my_counts=0; }
void decrement_counts(void) { if(my_counts >= 0) my_counts--; }
void reset_counts(void) { my_counts = 0; }
void print_counts(void) { unsigned int temp; unsigned char lcd_out_char; lcd_out_char = (my_counts/1000)+48; temp = my_counts % 1000; Lcd_Chr(2, 11, lcd_out_char); lcd_out_char = (temp/1000)+48; temp = temp % 100; Lcd_Chr_Cp(lcd_out_char); lcd_out_char = (temp % 10)+48; Lcd_Chr_Cp(lcd_out_char); }
|  |  |  |  |
Схемата тръгна, но като натисна бутона да отчете +1 го прави със забавяне. Дори и друг бутон да натисна той се отчита, но може би с 2-3 секунди забавяне. Въпроса ми е може ли да се промени това и да го отчита веднага след като се натисне бутона ? Някъде бях чел, че това забавяне се избягва като се промени честотата на кварца или на микроконтролера. Вярно ли е това ? В момента кварца е на 4MHz, контролера и той.
_________________ Тате, днес единствено аз отговорих на въпроса на учителката. -Браво сине, и какъв беше въпроса ? -Кой не си е написал домашното?
|
| Пон Фев 09, 2015 12:48 am |
|
 |
|
pechkov
Ранг: Напреднал
Регистриран на: Пет Фев 14, 2014 4:45 pm Мнения: 439 Местоположение: Монтана
|
 Re: Помощ за програма на PIC16F877
Такова забавяне от порядъка на 2-3 секунди не е реално за такава програма, въпреки, че е зле написана, и вероятно се дължи на симулацията. С кварц на 4 MHz, и да следи за три пина дали има "0" или "1" на тях - процесора ще има време да прочете "Под игото" между всяко натискане, и докато отпуснеш бутона - ще му остане време и за кафе. Просто нещата не са същите на симулация. Огледай програматорите, които са достъпни в момента, вземи си една-две "breadboard", купи малко части, и действай. 
_________________ Не карай по-бързо от своя ангел-пазител!
|
| Пон Фев 09, 2015 1:02 am |
|
 |
|
miro_9703
Ранг: Новодошъл
Регистриран на: Чет Авг 15, 2013 3:07 am Мнения: 101 Местоположение: град Рудозем
|
 Re: Помощ за програма на PIC16F877
Здравей отново. Значи забавянето е от самата симулация, а реално може би няма да го има това забавяне. Сега искам да те питам този програматор: http://tpetrov.com/search.php?prod=%D0% ... SERIAL+V.3 дали си заслужава парите ? Благодаря !
_________________ Тате, днес единствено аз отговорих на въпроса на учителката. -Браво сине, и какъв беше въпроса ? -Кой не си е написал домашното?
|
| Пон Фев 09, 2015 7:35 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: Помощ за програма на PIC16F877
не
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Пон Фев 09, 2015 8:54 pm |
|
 |
|
pechkov
Ранг: Напреднал
Регистриран на: Пет Фев 14, 2014 4:45 pm Мнения: 439 Местоположение: Монтана
|
 Re: Помощ за програма на PIC16F877
Това е простичкия за изпълнение JDМ Programmer. Имам такъв, купувах го преди много време от Елимекс за 8 лв, но сега цената му е повече от максимума за такова изделие. Работи ба-а-а-а-а-а-авно, поддържаните чипове са малко, и имах проблеми със софтуера му под Windows 7, но не съм търсил решение. Ползвам Brenner, имам два Brenner8, които вече не ползвам, сглобявах за продажба и няколко броя Brenner8P9smd (имам още три налични мисля), но по магазините се намират и вече на доста поносима цена програматорите на Microchip - PicKit2 и PicKit3. За тях може да разкаже някой по-запознат, който има такива, и може да сподели възможностите за ъпдейт на фирмуера, табличката с поддържани чипове, и функционалността им като дебъгери и серийни портове. Разработчиците от Mikro Elektronika имат и развойни платки с вградени програматори, като техните платки в комбинация с техните развойни среди (mikroC например) имат възможност за дебъгване. Както споменах, програматорите на Microchip могат същото с тяхната среда за програмиране - MPLAB. Но за това - пак някой, дето им познава възможностите. Т.е. ако ще работиш с mikroC, тогава платка от Mikro Elektronika ще ти даде по-добри възможности, но евентуално ще ти струва по-скъпо. А ако опиташ да програмираш под MPLAB (на асемблер) - тогава пък програматорите PicKit ще са по-доброто решение. Аз лично пиша на mikroBasic, не ползвам дебъгер, нито пък правя симулации с Proteus (или каквото и да е такова), и съответно правя нещата по трудния начин, но така пък програматора Brenner ми върши същата работа. Това е като информация засега.  Питай нещо по-конкретно.
_________________ Не карай по-бързо от своя ангел-пазител!
|
| Пон Фев 09, 2015 11:28 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: Помощ за програма на PIC16F877
Пиккит си е класика - винаги ще поддържа всичко. Няма смисъл да обяснявам защо. Дебъг се прави в мплаб но не е задължително да се пише в него. Аз пък ползвам Протон и си дебъгвам в мплаб. Компилатора генерира нужния файл и няма проблеми.
|
| Вто Фев 10, 2015 12:21 am |
|
 |
|
eng.komitov
Ранг: Минаващ
Регистриран на: Нед Окт 25, 2015 1:42 pm Мнения: 23
|
 Re: Помощ за програма на PIC16F877
здравейте, моя проблем е следния при опит да компилирам сорс кода, който е на C (има и условно асемблиране) компилатора MPLAB C18 ми дава синтактична грешка на 33 ред в main (на компютъра компютъра в къщи), компилирането е провалено, а грешки няма(на компютъра в офиса). Прикачил съм файловете от папката с проекта за PIC18F67J60, за да се компилира на друг компютър (ако проблема е в MPLAB-а на компютрите, които съм пробвал) или да се открият грешки, които не разрешават компилирането. Благодаря предварително.
|
| Пон Дек 21, 2015 11:59 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|