Отговори на тема  [ 15 мнения ] 
Проблем с компилатора ccs, mikroc 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 19, 2008 12:22 pm
Мнения: 47
Мнение Проблем с компилатора 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 няма проблеми.
Къде греша?
Благодаря ви предварително!!!


Последна промяна kalinskia на Вто Дек 29, 2009 12:19 am, променена общо 1 път



Нед Дек 20, 2009 7:21 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пон Апр 17, 2006 1:44 pm
Мнения: 291
Мнение 
Незнам този компилатор до колко адекватни съобщения издава, но стандартният С език е чувствителен към малки/големи букви и има разлика между read_ds1307 и read_DS1307. Да не говорим, че прототипа тотално не съвпада.

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


Последна промяна perlsite на Нед Дек 20, 2009 8:20 pm, променена общо 1 път



Нед Дек 20, 2009 8:10 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 19, 2008 12:22 pm
Мнения: 47
Мнение 
perlsite написа:
Незнам този компилатор до колко адекватни съобщения издава, но стандартният С език е чувствителен към малки/големи букви и има разлика между read_ds1307 и read_DS1307. Да не говорим, че прототипа тотално не съвпада.


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


Нед Дек 20, 2009 8:17 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пон Апр 17, 2006 1:44 pm
Мнения: 291
Мнение 
Виж едита ми - докато поправях си писал и ти мнение :)


Нед Дек 20, 2009 8:21 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Яну 31, 2006 11:11 pm
Мнения: 295
Местоположение: София
Мнение Re: Проблем с компилатора ccs
kalinskia написа:
...използвам mplab с CCS_PCWH_v4.023...


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


Нед Дек 20, 2009 8:26 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 19, 2008 12:22 pm
Мнения: 47
Мнение 
Бихте ли препоръчали читава версия и как да модифицирам кода за да се оправят нещата.


Нед Дек 20, 2009 8:32 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Окт 03, 2006 11:58 am
Мнения: 924
Местоположение: Ботевград
Мнение 
void main()
{
while(1)
{
sec=read_ds1307(0);
}
}

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

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


Нед Дек 20, 2009 8:32 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 19, 2008 12:22 pm
Мнения: 47
Мнение 
Благодаря на всички Ви! Нещата се оправиха след като преместих main() най-отдолу, незнайно защо.


Нед Дек 20, 2009 8:59 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пон Апр 17, 2006 1:44 pm
Мнения: 291
Мнение 
Защото прототипа ти е грешен, както ти обясних вече (ако ти е грешен прототипа кода в main() не може да намери използваната функция, но когато преместиш кода на main() след пълната дефиниция на ds1307(), то вече самият прототип не е нужен за да се компилира кода).
В GCC, както и в VC този код гърми и се оправя както вече споменах, CCS може и да не е следва никакви стандарти...


Нед Дек 20, 2009 9:09 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 19, 2008 12:22 pm
Мнения: 47
Мнение 
Няма да пускам нова тема...Можете ли да ми помогнете с примерен код за lcd hd44780 2X16 CCS?Ще ползвам такъв дисплей за визуализация на информация, но незнам как да го управлявам с тия компилатори.
Досега съм се занимавал само с асемблер и ми е малко сложно с началото с това С.


Нед Дек 20, 2009 11:00 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Окт 03, 2006 11:58 am
Мнения: 924
Местоположение: Ботевград
Мнение 
В инсталационната директория на компилатора в папка Drivers намираш файла LCD.c и го включваш към твоята програма, като ползваш неговите функции. Разгледай го, в него е описано и на кой порт кои крачета се вързват от дисплея

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

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


Нед Дек 20, 2009 11:23 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 7:26 pm
Мнения: 673
Мнение 
Код:
void read_ds1307();

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

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


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

_________________
Вниманиене съмвишист....ИЙ.


Сря Дек 23, 2009 9:47 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

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


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

_________________
Българският портал за РОБОТИКА


Чет Дек 24, 2009 1:35 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 19, 2008 12:22 pm
Мнения: 47
Мнение Сега проблем с 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 но резултатът беше един и същ.
Можете ли да ми помогнете и този път?


Пон Дек 28, 2009 1:34 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 19, 2008 12:22 pm
Мнения: 47
Мнение 
Никой ли не може да помогне? Бях гледал, че и други хора са го имали този проблем, но така и не можах да разбера как е бил решен!


Вто Дек 29, 2009 12:21 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 15 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни