реклама на сайте
подробности

 
 
> Две шины данных на одном порту
TriS
сообщение Jul 25 2010, 08:48
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 21-07-10
Пользователь №: 58 536



Помогите найти ошибку!!!!
Использую две шины I2C и 1-Wire на одном порту, использую микросхему часов ds1307(I2C) и 2 датчика температуры ds1820(1-wire),
так вот сначала инициализирую шину 1-wire, определяю кол-во устройств ds1820 на ней.... определяется ноль, затем инициализирую шину I2C, по ней прекрасно общаюсь с ds 1307.

CODE
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc,
<span name="mcb_s" id="multishop1" style="overflow:hidden; zoom:1; display:inline; margin: 0px; padding: 0px;
" class="wbc_wrapped_word">HP InfoTech s</span>.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 10.07.2010
Author : NeVaDa
Company : Company
Comments:


Chip type : ATmega8515
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 128
*****************************************************/

#include <mega8515.h>

// 1-wire
#asm
.equ __w1_port=0x1b //PORTA
.equ __w1_bit=2
#endasm
#include <1wire.h>

// I2C Bus functions
#asm
.equ __i2c_port=0x1b //PORTA
.equ __sda_bit=0
.equ __scl_bit=1
#endasm
#include <i2c.h>


// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 //PORTC
#endasm
#include <lcd.h>


#include <ds1307.h>
#include <ds1820.h>
#include <delay.h>
#include <stdio.h>
#include <string.h>

//#include <eeprom.h>

#define lcd_segment 16

/* maximum number of DS1820/DS18S20 connected to the 1 Wire bus */
#define MAX_DEVICES 8
unsigned char rom_code[MAX_DEVICES][9];
unsigned char devices;



unsigned char hour,minute,sek; //часы, минуты, секунды
unsigned char day,month,year; //день, месяц, год


int menu=1;
int menu_time=0;

int i=0;
int update=1000; // период обновлений

char auto_ind[5]="";



unsigned char lcd_buffer[lcd_segment*2];


unsigned char t_stab=22;


void lcd_menu_time(void)
{
if (i>update)
{
i=0;
switch (menu_time)
{
case 1:
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer, "Setup Hour:\r\nH=%i",hour);
lcd_puts(lcd_buffer);
break;
case 2:
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer, "Setup Min:\r\nM=%i",minute);
lcd_puts(lcd_buffer);
break;
case 3:
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer, "Setup Sec:\r\nS=%i",sek);
lcd_puts(lcd_buffer);
break;
case 4:
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer, "Setup Date:\r\nD=%i",day);
lcd_puts(lcd_buffer);
break;
case 5:
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer, "Setup Month:\r\nM=%i",month);
lcd_puts(lcd_buffer);
break;
case 6:
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer, "Setup Year:\r\nY=%i",year);
lcd_puts(lcd_buffer);
break;
case 7:
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer, "Save Setup?\r\n+ Yes, - No");
lcd_puts(lcd_buffer);
break;
default:;
}
}
}

void lcd_cond()
{
unsigned char k,j;
int temp;

if (i>update)
{
i=0;



if (devices>0)
{
//PINA.3=0xfe;
}
else
{
//PINA.3=0xff;

sprintf(lcd_buffer,"No find");
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(200);
}

lcd_clear();

if (devices)
{
for (k=0;k<devices;k++)
{
sprintf(lcd_buffer,"Device #%u ROM\nCode is:",k+1);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(200);
lcd_clear();
for (j=0;j<8;j++)
{
sprintf(lcd_buffer,"%02X ",rom_code[k][j]);
lcd_puts(lcd_buffer);
if (j==3) lcd_gotoxy(0,1);
};
delay_ms(200);
};





for (k=0;k<devices;)
{
temp=ds1820_temperature_10(&rom_code[k][0]);
j='+';
if (temp<0)
{
j='-';
temp=-temp;
};
sprintf(lcd_buffer,"t%u=%c%i.%u\xdfC",++k,j,temp/10,temp%10);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(800);
};

}

// sprintf(lcd_buffer, "U:%i%cC, S:%i%cC\r\nT=%i%cC %s",31,0xdf,tem,0xdf,t_stab,0xdf,auto_ind);
}

}

void lcd_time(void)
{
if (i>update)
{
i=0;

rtc_get_time(&hour,&minute,&sek); //считать время
rtc_get_date(&day,&month,&year); //считать дату

lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("");
//lcd_putchar(hour/10+16+hour%10);

lcd_putchar(hour/10+0x30);
lcd_putchar(hour%10+0x30);

lcd_putchar(':');
lcd_putchar(minute/10+0x30);
lcd_putchar(minute%10+0x30);
lcd_putchar(':');
lcd_putchar(sek/10+0x30);
lcd_putchar(sek%10+0x30);


lcd_gotoxy(0,1);
lcd_putsf("");
lcd_putchar(day/10+0x30);
lcd_putchar(day%10+0x30);
lcd_putchar('-');
lcd_putchar(month/10+0x30);
lcd_putchar(month%10+0x30);
lcd_putchar('-');
lcd_putchar(year/10+0x30);
lcd_putchar(year%10+0x30);
}
}







void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
//DDRA=0x0D;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0xFF;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Port E initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTE=0x00;
DDRE=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
EMCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;


// LCD module initialization
lcd_init(lcd_segment);

sprintf(lcd_buffer,"Init 1-wire");
lcd_puts(lcd_buffer);
w1_init();

devices=w1_search(0xf0,rom_code);
lcd_clear();
sprintf(lcd_buffer,"%u DS1820\nDevice detected",devices);
lcd_puts(lcd_buffer);
delay_ms(100);


// I2C Bus initialization
i2c_init();

rtc_init(0,1,0);
rtc_set_date(01,01,10); //установить дату: день,месяц,год
rtc_set_time(23,59,00); //установить время: часы, минуты, секунды


while (1)
{
i++;

if (menu_time==0)
switch (menu)
{
case 0:lcd_time(); break;
case 1:lcd_cond(); break;
default:;
}



if (PINB.0==0) // если нажата кнопка Time/Kond
{
delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
menu++;
if (menu>=2) menu=0;
}

// Настройки часов
if(menu==0)
{
if (PINB.1==0)
{
menu_time++;
if (menu_time>7) menu_time=7;
delay_ms(250);
}


if (menu_time!=0) lcd_menu_time();


//-------------------------------------------
if ((menu_time==1)&(PINB.2==0))
{
hour++;
if (hour==24||hour==255) hour=0;
// if (hour>23) hour=0;
delay_ms(250);
}

if ((menu_time==1)&(PINB.3==0))
{
hour--;
if (hour==24||hour==255) hour=0;
//if (hour<0) hour=23;
delay_ms(250);
}
//-------------------------------------------
if ((menu_time==2)&(PINB.2==0))
{
minute++;
// if (minute>59) minute=0;
delay_ms(250);
}

if ((menu_time==2)&(PINB.3==0))
{
minute--;
//if (minute<0) minute=59;
delay_ms(250);
}
//-------------------------------------------
if ((menu_time==3)&(PINB.2==0))
{
sek++;
//if (sek>59) hour=0;
delay_ms(250);
}

if ((menu_time==3)&(PINB.3==0))
{
sek--;
//if (sek<0) sek=59;
delay_ms(250);
}
//-------------------------------------------

//-------------------------------------------
if ((menu_time==4)&(PINB.2==0))
{
day++;
// if (day>31) day=0;
delay_ms(250);
}

if ((menu_time==4)&(PINB.3==0))
{
day--;
// if (day<0) day=31;
delay_ms(250);
}
//-------------------------------------------
if ((menu_time==5)&(PINB.2==0))
{
month++;
// if (month>12) month=0;
delay_ms(250);
}

if ((menu_time==5)&(PINB.3==0))
{
month--;
// if (month<0) month=12;
delay_ms(250);
}
//-------------------------------------------
if ((menu_time==6)&(PINB.2==0))
{
year++;
// if (year>59) year=0;
delay_ms(250);
}

if ((menu_time==6)&(PINB.3==0))
{
year--;
// if (year<0) year=59;
delay_ms(250);
}
//-------------------------------------------


//-------------------------------------------
if ((menu_time==7)&(PINB.2==0))
{
rtc_set_date(day,month,year); //установить дату: день,месяц,год
rtc_set_time(hour,minute,sek); //установить время: часы, минуты, секунды
menu_time=0;
delay_ms(250);
}

if ((menu_time==7)&(PINB.3==0))
{ menu_time=0;
delay_ms(250);
}
//-------------------------------------------

if (menu_time!=0)
{
if (hour==24||hour==255) hour=0;
if (minute==60||minute==255) minute=0;
if (sek==60||sek==255) sek=0;

if (day==31||day==255) day=0;
if (month==13||month==255) month=0;
if (year==99||year==255) year=0;
}


}


// Настройки кондея
if(menu==1)
{
if (PINB.1==0)
{

if (strcmp (auto_ind,"")==0)
{
strcpy(auto_ind,"Auto");
// PINA.2=0xfe;

}
else
{
strcpy(auto_ind,"");
// PINA.2=0xff;

}
delay_ms(250);
}

if (PINB.2==0)
{
t_stab++;
if (t_stab>30) t_stab=30;
delay_ms(250);
}

if (PINB.3==0)
{
t_stab--;
if (t_stab<15) t_stab=15;
delay_ms(250);
}

}

}
}
Причина редактирования: Редактирование цитаты исходника.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
TriS
сообщение Jul 25 2010, 09:49
Сообщение #2





Группа: Участник
Сообщений: 9
Регистрация: 21-07-10
Пользователь №: 58 536



Нашел вот что:

PLEASE MAKE SURE THAT THE CKSEL0..3 FUSE
BITS ARE PROGRAMMED TO USE THE EXTERNAL
3.6864MHz CLOCK SOURCE OF THE STK500 AND NOT
THE INTERNAL 1MHz OSCILLATOR.
The ATmega8515 chip comes from the factory
with CKSEL0..3 fuse bits set to use the
internal 1 MHz oscillator.

The DS1820/18S20 sensors are connected to
bit 6 of PORTA of the ATmega8515 as follows:

[DS1820/18S20] [STK500 PORTA HEADER]
1 GND - 9 GND
2 DQ - 7 PA6
3 VDD - 10 +5V

All the temperature sensors must be connected
in parallel

AN 4.7k PULLUP RESISTOR MUST BE CONNECTED
BETWEEN DQ (PA6) AND +5V !


В свойствах проекта поменял частоту на 3.6864MHz , выставил фьюзы CKSEL0..3, но все равно на шине датчики не обнаруживаются
Go to the top of the page
 
+Quote Post
miksergei
сообщение Jul 25 2010, 13:25
Сообщение #3





Группа: Новичок
Сообщений: 9
Регистрация: 25-02-09
Пользователь №: 45 328



Цитата(TriS @ Jul 25 2010, 12:49) *
Нашел вот что:

В свойствах проекта поменял частоту на 3.6864MHz , выставил фьюзы CKSEL0..3, но все равно на шине датчики не обнаруживаются


От частоты кварца не зависит. Пробуйте отлаживать по частям, был у меня геморой с тем, что часовая микруха не возвращала время, только 1-й раз при иничиализации. С датчиками температуры проще, они вроде работали, только с редкими сбоями, возвращали -999. Конкретнее что у Вас не обнаруживается? То что все весит на одном порте, это не страшно.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.029 секунд с 7
ELECTRONIX ©2004-2016