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

Проблем с компилатора ccs, mikroc
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=7407
Страница 1 от 1

Автор:  kalinskia [ Нед Дек 20, 2009 7:21 pm ]
Заглавие:  Проблем с компилатора ccs, mikroc

Здравейте на всички! Бихте ли ми помогнали с отстраняването на следната грешка:
#include"16F876A.h"
#use delay(clock=4000000)
#fuses NOWDT,XT, NOPUT, NOPROTECT
#define DS1307_SDA PIN_C4
#define DS1307_SCL PIN_C3
#use i2c(master, sda=DS1307_SDA, scl=DS1307_SCL)

void read_ds1307();

int8 sec;
void main()
{
while(1)
{
sec=read_ds1307(0);
}
}

BYTE read_DS1307(byte address)
{
BYTE data;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_start();
i2c_write(0xd1);
data=i2c_read(0);
i2c_stop();
return(data);
}

Това е част от кода за RTC със ds1307. Компилатора (използвам mplab с CCS_PCWH_v4.023) ми изкарва грешка " Error 58 "C:\Users\Kalin\Desktop\parno.c" Line 16(18,19): Expecting a close paren
1 Errors, 1 Warnings." на реда " sec=read_ds1307(0);"
Когато компилирам кода в CCS_PCWH_v4.023 без да го прекарвам през mplab няма проблеми.
Къде греша?
Благодаря ви предварително!!!

Автор:  perlsite [ Нед Дек 20, 2009 8:10 pm ]
Заглавие: 

Незнам този компилатор до колко адекватни съобщения издава, но стандартният С език е чувствителен към малки/големи букви и има разлика между read_ds1307 и read_DS1307. Да не говорим, че прототипа тотално не съвпада.

Edit: Всъщност съобщението си е точно. Първоначално не го прочетох внимателно а то показва, че компилатора очаква след отварящата скоба веднага затваряща, защото прототипа ти не посочва параметри. С други думи поправи си прототипа и преименувай или прототипа или реализацията на функцията да имат еднакви имена (ds vs DS).

Автор:  kalinskia [ Нед Дек 20, 2009 8:17 pm ]
Заглавие: 

perlsite написа:
Незнам този компилатор до колко адекватни съобщения издава, но стандартният С език е чувствителен към малки/големи букви и има разлика между read_ds1307 и read_DS1307. Да не говорим, че прототипа тотално не съвпада.


В конкретния случай не е от големината на буквите...

Автор:  perlsite [ Нед Дек 20, 2009 8:21 pm ]
Заглавие: 

Виж едита ми - докато поправях си писал и ти мнение :)

Автор:  bobyper [ Нед Дек 20, 2009 8:26 pm ]
Заглавие:  Re: Проблем с компилатора ccs

kalinskia написа:
...използвам mplab с CCS_PCWH_v4.023...


Под-добре смени версията че 4.023 е бая бъгава. Да не се натъкнеш на други бъгове.

Автор:  kalinskia [ Нед Дек 20, 2009 8:32 pm ]
Заглавие: 

Бихте ли препоръчали читава версия и как да модифицирам кода за да се оправят нещата.

Автор:  Zeus [ Нед Дек 20, 2009 8:32 pm ]
Заглавие: 

void main()
{
while(1)
{
sec=read_ds1307(0);
}
}

Последната скоба ти затваря главната процедура main. После имаш още . Не трябва ли след последната скоба да свършват писаниците?

P.S. Премести main() най-отдолу и пробвай пак да компилираш.

Автор:  kalinskia [ Нед Дек 20, 2009 8:59 pm ]
Заглавие: 

Благодаря на всички Ви! Нещата се оправиха след като преместих main() най-отдолу, незнайно защо.

Автор:  perlsite [ Нед Дек 20, 2009 9:09 pm ]
Заглавие: 

Защото прототипа ти е грешен, както ти обясних вече (ако ти е грешен прототипа кода в main() не може да намери използваната функция, но когато преместиш кода на main() след пълната дефиниция на ds1307(), то вече самият прототип не е нужен за да се компилира кода).
В GCC, както и в VC този код гърми и се оправя както вече споменах, CCS може и да не е следва никакви стандарти...

Автор:  kalinskia [ Нед Дек 20, 2009 11:00 pm ]
Заглавие: 

Няма да пускам нова тема...Можете ли да ми помогнете с примерен код за lcd hd44780 2X16 CCS?Ще ползвам такъв дисплей за визуализация на информация, но незнам как да го управлявам с тия компилатори.
Досега съм се занимавал само с асемблер и ми е малко сложно с началото с това С.

Автор:  Zeus [ Нед Дек 20, 2009 11:23 pm ]
Заглавие: 

В инсталационната директория на компилатора в папка Drivers намираш файла LCD.c и го включваш към твоята програма, като ползваш неговите функции. Разгледай го, в него е описано и на кой порт кои крачета се вързват от дисплея

Нещо подобно:

void main()
{
#include <LCD.c>
...
lcd_init();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("12345678");
}

Автор:  RM [ Сря Дек 23, 2009 9:47 pm ]
Заглавие: 

Код:
void read_ds1307();

По принцип това е обявяване на функция която няма дефиниран, или не връща резултат.

Цитат:
BYTE read_DS1307(byte address)
{
.....
.....
}


Тука вече има дефиниран връщан резултат от тип BYTE (въпреки че не видях typedef или #byte)
Мисля че щом е обявена функця, преди mine(){...}
тялото на функцията може да бъде и след затварящите скоби на mine.
Освен ако CCS са на друго мнение :oops:

Автор:  sv_shady [ Чет Дек 24, 2009 1:35 pm ]
Заглавие: 

Вярно е, че ако напишеш прототип на функцията преди main() можеш да сложиш където искаш, ССS си го поддържа това. Обаче тези две функции
Код:
void read_ds1307();
BYTE read_DS1307(byte address)
{
.....
.....
}


са различни, макар и с едно име - нарича се предефиниране. Затова прототипа трябва да е
Код:
BYTE read_DS1307(byte);

Автор:  kalinskia [ Пон Дек 28, 2009 1:34 am ]
Заглавие:  Сега проблем с mikroc

Кода съм го изтеглил от техния сайт
/*
* Project name:
RTC2_Read (Reading date/time data from DS1307 through I2C)
* Copyright:
(c) MikroElektronika, 2005-2009
* Revision History:
20090504:
- Author: Igor Stancic;
* Description:
This project is simple demonstration how to read date and time from DS1307
RTC (real-time clock). The code MCU use MSSP module at PORTC.
Date and time are printed at LCD.
* Test configuration:
MCU: PIC16F887
Dev.Board: EasyPIC5
Oscillator: HS, 8.000MHz
Ext. Modules: IC RTC (DS1307), LCD 2x16 chars
SW: mikroC PRO v1.65
* NOTES:
- For proper I2C communication, pins on PORTC must be in the pull-up mode,
RC3 - pin 6 DS1307 - SCL,
RC4 - pin 5 DS1307 - SDA,
and the LEDs on board switched OFF!
*/

unsigned char sec, min1, hr, week_day, day, mn, year;
char *txt, tnum[4];

// 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;
// End LCD module connections

void Zero_Fill(char *value) { // fill text repesentation
if (value[1] == 0) { // with leading zero
value[1] = value[0];
value[0] = 48;
value[2] = 0;
}
}//~

//--------------------- Reads time and date information from RTC (DS1307)
void Read_Time(char *sec, char *min, char *hr, char *week_day, char *day, char *mn, char *year) {
I2C1_Start();
I2C1_Wr(0xD0);
I2C1_Wr(0);
I2C1_Repeated_Start();
I2C1_Wr(0xD1);
*sec =I2C1_Rd(1);
*min =I2C1_Rd(1);
*hr =I2C1_Rd(1);
*week_day =I2C1_Rd(1);
*day =I2C1_Rd(1);
*mn =I2C1_Rd(1);
*year =I2C1_Rd(0);
I2C1_Stop();
}//~

//-------------------- Formats date and time
void Transform_Time(char *sec, char *min, char *hr, char *week_day, char *day, char *mn, char *year) {
*sec = ((*sec & 0x70) >> 4)*10 + (*sec & 0x0F);
*min = ((*min & 0xF0) >> 4)*10 + (*min & 0x0F);
*hr = ((*hr & 0x30) >> 4)*10 + (*hr & 0x0F);
*week_day =(*week_day & 0x07);
*day = ((*day & 0xF0) >> 4)*10 + (*day & 0x0F);
*mn = ((*mn & 0x10) >> 4)*10 + (*mn & 0x0F);
*year = ((*year & 0xF0)>>4)*10+(*year & 0x0F);
}//~

//-------------------- Output values to LCD
void Display_Time(char sec, char min, char hr, char week_day, char day, char mn, char year) {
switch(week_day){
case 1: txt="Sun"; break;
case 2: txt="Mon"; break;
case 3: txt="Tue"; break;
case 4: txt="Wed"; break;
case 5: txt="Thu"; break;
case 6: txt="Fri"; break;
case 7: txt="Sat"; break;
}
LCD_Out(1,1,txt);
Lcd_Chr(1, 6, (day / 10) + 48); // Print tens digit of day variable
Lcd_Chr(1, 7, (day % 10) + 48); // Print oness digit of day variable
Lcd_Chr(1, 9, (mn / 10) + 48);
Lcd_Chr(1,10, (mn % 10) + 48);
Lcd_Chr(1,15, year + 48); // Print year vaiable + 8 (start from year 2008)

Lcd_Chr(2, 6, (hr / 10) + 48);
Lcd_Chr(2, 7, (hr % 10) + 48);
Lcd_Chr(2, 9, (min / 10) + 48);
Lcd_Chr(2,10, (min % 10) + 48);
Lcd_Chr(2,12, (sec / 10) + 48);
Lcd_Chr(2,13, (sec % 10) + 48);

}//~

//------------------ Performs project-wide init
void Init_Main() {
ANSEL=0;
ANSELH=0;

Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD display
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off

I2C1_Init(100000); // initialize I2C
LCD_Chr(1,8,'.');
LCD_Chr(1,11,'.');
txt = "Time:";
LCD_Out(2,1,txt);
LCD_Chr(2,8,':');
LCD_Chr(2,11,':');
txt = "200";
LCD_Out(1,12,txt);
LCD_Cmd(_LCD_CURSOR_OFF);
}//~

//----------------- Main procedure
void main() {
Init_Main(); // perform initialization
while (1) {
Read_Time(&sec,&min1,&hr,&week_day,&day,&mn,&year); // read time from RTC(DS1307)
Transform_Time(&sec,&min1,&hr,&week_day,&day,&mn,&year); // format date and time
Display_Time(sec, min1, hr, week_day, day, mn, year); // prepare and display on LCD
Delay_ms(1000); // wait 1s
}
}//

но това което имам на симулация е :
Изображение
Задал съм ds1307 да се Update–ва от pc-то...пробвах с най-различни компилатори на mikroc но резултатът беше един и същ.
Можете ли да ми помогнете и този път?

Автор:  kalinskia [ Вто Дек 29, 2009 12:21 am ]
Заглавие: 

Никой ли не може да помогне? Бях гледал, че и други хора са го имали този проблем, но така и не можах да разбера как е бил решен!

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