Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Помощ за програма на PIC16F877
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=13566
Страница 1 от 2

Автор:  miro_9703 [ Нед Фев 08, 2015 4:38 pm ]
Заглавие:  Помощ за програма на PIC16F877

Здравейте, тъй като така да се каже реших вече да си правя разни схемички с PIC-ове разбрах, че е време да започна и програмите за тях да си пиша и т.н, но преди това си свалих Proteus 8 и там си пускам разни симулации на схеми от интернет и се опитвам да си обесня как работят и т.н. Днес намерих една схема на кодова брава и реших да и пусна симулация в Proteus. Направих си схемата в протеус, но когато стигнах до програмата за PIC-а - ударих на камък. Схемата е от тук: http://latesteeprojects.blogspot.com/20 ... 6f887.html и както виждате по-надолу на страницата е даден само код, който незнам какво да го правя, къде да го въвеждам и т.н. В протеус до сега като пусках симулации на схемите с PIC задавах пътя до .hex файла и всичко работеше, но сега нямам .hex файл и въпроса ми е можете ли да ми обясните как аджеба се конвертира този код, за да получа .hex файла, който ми е нужен.

Автор:  pechkov [ Нед Фев 08, 2015 6:39 pm ]
Заглавие:  Re: Помощ за програма на PIC16F877

miro_9703 написа:
... как аджеба се конвертира този код, за да получа .hex файла, който ми е нужен.


Това е "сорс код", т.е. първоизточника на програмата, който се пише от човек. Писането се прави в т.нар. "развойна среда", и след това с инструментите на тази развойна среда се "компилира" до машинен код - .hex файл. Получения hex файл се прехвърля към процесора чрез програматор (допълнително устройство), и едва тогава процесора ще може самостоятелно да изпълни въпросната програма.

microC вероятно е средата на Mikro Elektronika, можеш да изтеглиш оттам съвсем свободно. Работи безплатно за проекти до 2000 програмни думи. Ако искаш да правиш по-големи проекти - може да купиш лиценз, или... така де. :)

Това е от мен засега. Питай нещо конкретно.

Автор:  miro_9703 [ Нед Фев 08, 2015 7:42 pm ]
Заглавие:  Re: Помощ за програма на PIC16F877

Благодаря за отговора. Свалих програмата от сайта, инсталирах я и я стартирах. След като я стартирах ми излезна това:
1. Изображение
Отляво в менюто натиснах на "New project"
След това ми излезна това: Изображение
промените който съм направил тук е само на полето Project folder и Device name
След като натиснах на бутона Next излезна това:
Изображение
тук не съм променял нищо, просто дадах Next
След което излезна това:
Изображение
също нищо не променях, просто дадах Next и излезна това:
Изображение
просто цъкнах на Finish.
След което се появи едно поле:
Изображение
предполагам тук трябва да сложа кода от страницата където е ? След това какво се прави ?

Автор:  amdatlon [ Нед Фев 08, 2015 9:25 pm ]
Заглавие:  Re: Помощ за програма на PIC16F877

http://www.google.bg/search?q=mikroc++v ... =2&tbm=vid

Автор:  miro_9703 [ Нед Фев 08, 2015 10:24 pm ]
Заглавие:  Re: Помощ за програма на PIC16F877

Разбрах го как става, но дава тази грешка:
Код:
0 1 mikroCPIC1618.exe -MSF -DBG -pP16F877 -DL -O11111114 -fo8 -N"C:\Users\Miro\Desktop\MyProject.mcppi" -SP"C:\Users\Public\Documents\Mikroelektronika\mikroC PRO for PIC\defs\" -SP"C:\Users\Public\Documents\Mikroelektronika\mikroC PRO for PIC\Uses\P16\" -SP"C:\Users\Miro\Desktop\" "MyProject.c" "__Lib_Math.mcl" "__Lib_MathDouble.mcl" "__Lib_System.mcl" "__Lib_Delays.mcl" "__Lib_CType.mcl" "__Lib_CString.mcl" "__Lib_CStdlib.mcl" "__Lib_CMath.mcl" "__Lib_MemManager.mcl" "__Lib_Conversions.mcl" "__Lib_Sprinti.mcl" "__Lib_Sprintl.mcl" "__Lib_Time.mcl" "__Lib_Trigonometry.mcl" "__Lib_Button.mcl" "__Lib_Keypad4x4.mcl" "__Lib_Manchester.mcl" "__Lib_OneWire.mcl" "__Lib_PS2.mcl" "__Lib_Sound.mcl" "__Lib_SoftI2C.mcl" "__Lib_SoftSPI.mcl" "__Lib_SoftUART.mcl" "__Lib_ADC_A_C.mcl" "__Lib_EEPROM.mcl" "__Lib_FLASH_RW.mcl" "__Lib_I2C_c34.mcl" "__Lib_PWM_c21.mcl" "__Lib_SPI_c345.mcl" "__Lib_UART_c67.mcl" "__Lib_PortExpander.mcl" "__Lib_CANSPI.mcl" "__Lib_CF.mcl" "__Lib_GlcdFonts.mcl" "__Lib_Glcd.mcl" "__Lib_LcdConsts.mcl" "__Lib_Lcd.mcl" "__Lib_RS485.mcl" "__Lib_S1D13700.mcl" "__Lib_T6963C.mcl" "__Lib_SPIGlcd.mcl" "__Lib_SPILcd.mcl" "__Lib_SPILcd8.mcl" "__Lib_SPIT6963C.mcl" "__Lib_EthEnc28j60.mcl" "__Lib_EthEnc24j600.mcl" "__Lib_TouchPanel.mcl" 
0 1139 Available RAM: 352 [bytes], Available ROM: 8192 [bytes] 
0 122 Compilation Started MyProject.c
110 324 Undeclared identifier 'ANSEL' in expression MyProject.c
111 324 Undeclared identifier 'ANSELH' in expression MyProject.c
113 324 Undeclared identifier 'c1on_bit' in expression MyProject.c
114 324 Undeclared identifier 'c2on_bit' in expression MyProject.c
0 102 Finished (with errors): 08 ôåâð 2015, 21:23:14 MyProject.mcppi

Опитах с друг код, който го имам компилиран от интернет свален ... имам целия проект и опитах да го компилирам него да видя дали не греша аз някъде, но той се компилира без проблем. Този код който аз искам да компилирам и ми трябва дава грешката по-горе ... Кода е този:
Код:
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);



}

Не съм го писал аз !

Автор:  pechkov [ Нед Фев 08, 2015 10:46 pm ]
Заглавие:  Re: Помощ за програма на PIC16F877

В проекта е използван PIC16F887, а ти си заложил PIC16F877. Дори да са с идентични размери на корпуса и брой пинове - може да им се различават регистрите и функционалните характеристики. Например виждам в кода "ANSEL" и "ANSELH", които два регистъра при PIC16F887 управляват аналогово-цифровите входове. Обаче при PIC16F877, такива регистри няма. Добре е да изтеглиш документацията за процесора с който ще работиш, за да имаш откъде да проверяваш имената на регистрите за управление. Малко по-подробно бих могъл да ти помогна по скайп, ако имаш време. Скайпа ми е "pechkov".

П.П. c1on_bit=0 е по същата причина, касае компараторите, които при двата модела чипове също се различават.

Автор:  miro_9703 [ Нед Фев 08, 2015 10:58 pm ]
Заглавие:  Re: Помощ за програма на PIC16F877

Благодаря ти ! Въобще не съм забелязал, че съм задал друг микроконтролер ...... Всичко тръгна.

П.П: Скайпа ти го имам :) Веднъж пак ми помага по скайп за едно захранване :)

Автор:  pechkov [ Нед Фев 08, 2015 11:22 pm ]
Заглавие:  Re: Помощ за програма на PIC16F877

Аха, сещам се. :) Обърнатия транзистор.

В такива случаи помни следното: Връзвай смело схемата, каквото е излишно - ще изгори.

Господи, помогни, и заземи.
:D

Автор:  miro_9703 [ Пон Фев 09, 2015 12:48 am ]
Заглавие:  Re: Помощ за програма на PIC16F877

Дам. Правилно се сети :D
Сега един надявам се последен въпрос ....
Значи, намерих в интернет една схема на брояч с 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, контролера и той.

Автор:  pechkov [ Пон Фев 09, 2015 1:02 am ]
Заглавие:  Re: Помощ за програма на PIC16F877

Такова забавяне от порядъка на 2-3 секунди не е реално за такава програма, въпреки, че е зле написана, и вероятно се дължи на симулацията.

С кварц на 4 MHz, и да следи за три пина дали има "0" или "1" на тях - процесора ще има време да прочете "Под игото" между всяко натискане, и докато отпуснеш бутона - ще му остане време и за кафе. Просто нещата не са същите на симулация. Огледай програматорите, които са достъпни в момента, вземи си една-две "breadboard", купи малко части, и действай.
:)

Автор:  miro_9703 [ Пон Фев 09, 2015 7:35 pm ]
Заглавие:  Re: Помощ за програма на PIC16F877

Здравей отново. Значи забавянето е от самата симулация, а реално може би няма да го има това забавяне. Сега искам да те питам този програматор: http://tpetrov.com/search.php?prod=%D0% ... SERIAL+V.3 дали си заслужава парите ? Благодаря !

Автор:  ike [ Пон Фев 09, 2015 8:54 pm ]
Заглавие:  Re: Помощ за програма на PIC16F877

не

Автор:  pechkov [ Пон Фев 09, 2015 11:28 pm ]
Заглавие:  Re: Помощ за програма на PIC16F877

miro_9703 написа:
... този програматор: ... дали си заслужава парите ? Благодаря !


Това е простичкия за изпълнение JDМ Programmer. Имам такъв, купувах го преди много време от Елимекс за 8 лв, но сега цената му е повече от максимума за такова изделие. Работи ба-а-а-а-а-а-авно, поддържаните чипове са малко, и имах проблеми със софтуера му под Windows 7, но не съм търсил решение.

Ползвам Brenner, имам два Brenner8, които вече не ползвам, сглобявах за продажба и няколко броя Brenner8P9smd (имам още три налични мисля), но по магазините се намират и вече на доста поносима цена програматорите на Microchip - PicKit2 и PicKit3. За тях може да разкаже някой по-запознат, който има такива, и може да сподели възможностите за ъпдейт на фирмуера, табличката с поддържани чипове, и функционалността им като дебъгери и серийни портове.

Разработчиците от Mikro Elektronika имат и развойни платки с вградени програматори, като техните платки в комбинация с техните развойни среди (mikroC например) имат възможност за дебъгване. Както споменах, програматорите на Microchip могат същото с тяхната среда за програмиране - MPLAB. Но за това - пак някой, дето им познава възможностите.

Т.е. ако ще работиш с mikroC, тогава платка от Mikro Elektronika ще ти даде по-добри възможности, но евентуално ще ти струва по-скъпо. А ако опиташ да програмираш под MPLAB (на асемблер) - тогава пък програматорите PicKit ще са по-доброто решение. Аз лично пиша на mikroBasic, не ползвам дебъгер, нито пък правя симулации с Proteus (или каквото и да е такова), и съответно правя нещата по трудния начин, но така пък програматора Brenner ми върши същата работа.

Това е като информация засега. :) Питай нещо по-конкретно.

Автор:  Cekins [ Вто Фев 10, 2015 12:21 am ]
Заглавие:  Re: Помощ за програма на PIC16F877

Пиккит си е класика - винаги ще поддържа всичко. Няма смисъл да обяснявам защо. Дебъг се прави в мплаб но не е задължително да се пише в него. Аз пък ползвам Протон и си дебъгвам в мплаб. Компилатора генерира нужния файл и няма проблеми.

Автор:  eng.komitov [ Пон Дек 21, 2015 11:59 am ]
Заглавие:  Re: Помощ за програма на PIC16F877

здравейте, моя проблем е следния при опит да компилирам сорс кода, който е на C (има и условно асемблиране) компилатора MPLAB C18 ми дава синтактична грешка на 33 ред в main (на компютъра компютъра в къщи), компилирането е провалено, а грешки няма(на компютъра в офиса). Прикачил съм файловете от папката с проекта за PIC18F67J60, за да се компилира на друг компютър (ако проблема е в MPLAB-а на компютрите, които съм пробвал) или да се открият грешки, които не разрешават компилирането.
Благодаря предварително.
Прикачени файлове:
timer_us.c [309 Байта]
350 пъти
Прикачени файлове:
timer_isr.c [157 Байта]
346 пъти
Прикачени файлове:
print_screen.c [1.03 KiB]
337 пъти
Прикачени файлове:
send_ASCII_to_2ndrow.c [1.47 KiB]
332 пъти
Прикачени файлове:
send_command.c [298 Байта]
335 пъти
Прикачени файлове:
menu_isr.c [198 Байта]
342 пъти
Прикачени файлове:
menu.c [10.83 KiB]
347 пъти
Прикачени файлове:
main.c [5.83 KiB]
345 пъти
Прикачени файлове:
LCD_instr.c [186 Байта]
331 пъти
Прикачени файлове:
LCD_init.c [481 Байта]
337 пъти
Прикачени файлове:
LCD_DATA.c [196 Байта]
325 пъти
Прикачени файлове:
init_ds18b20.c [350 Байта]
328 пъти
Прикачени файлове:
clock_32TCYx.c [287 Байта]
340 пъти
Прикачени файлове:
clock_isr.c [155 Байта]
332 пъти

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/