АППАРАТНЫЙ I2C (TWI). Как использовать???
АППАРАТНЫЙ I2C (TWI). Как использовать???
Контроллер ATMega8. Необходимо обмениваться данными с часами реального времени DS1307. Пишу в CodeVisionAVR.
После включения интерфейса, в код ничего не добавляется. НИЧЕГО. Никаких доп. библиотек и т.д. Как использовать??? Можно конечно программный, но зачем, если есть аппаратный. Как использовать аппаратный I2C ?
После включения интерфейса, в код ничего не добавляется. НИЧЕГО. Никаких доп. библиотек и т.д. Как использовать??? Можно конечно программный, но зачем, если есть аппаратный. Как использовать аппаратный I2C ?
Нельзя всё знать, достаточно понимать.
- Реклама
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
как так не добавляется????
У меня всё добавилось!
У меня всё добавилось!
Код: Выделить всё
#asm
.equ __i2c_port=0x12 ;PORTD
.equ __sda_bit=0
.equ __scl_bit=1
#endasm
#include <i2c.h>В поисках истины человек развивается.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
я конечно не занимался практическим примением, но читал немного теории
там нужно по адресу вызывать нужное тебе устройство.
там нужно по адресу вызывать нужное тебе устройство.
В поисках истины человек развивается.
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
Это когда ты выбрал то что указано на второй картинке (см. выше). А я говорю про первую!!!vitalik_1984 писал(а):как так не добавляется????
У меня всё добавилось!Код: Выделить всё
#asm .equ __i2c_port=0x12 ;PORTD .equ __sda_bit=0 .equ __scl_bit=1 #endasm #include <i2c.h>
Нельзя всё знать, достаточно понимать.
- Pavel_1978
- Опытный кот
- Сообщения: 830
- Зарегистрирован: Пт ноя 16, 2007 11:21:37
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
это как раз програмный добавляется, сижу тоже пытаюсь вкурить как запустить аппаратный.vitalik_1984 писал(а):как так не добавляется????
У меня всё добавилось!Код: Выделить всё
#asm .equ __i2c_port=0x12 ;PORTD .equ __sda_bit=0 .equ __scl_bit=1 #endasm #include <i2c.h>
есть хидер от Danko как раз для опроса DS1307, но у меня с ним не компилируется.
Код: Выделить всё
#define TWEN 2
#define TWIE 0
#define TWINT 7
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWWC 3
void twi_start(void)
{
TWCR = (1<<TWEA)|(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {; }
}
void twi_stop(void) {
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
void twi_write(unsigned char _data)
{
TWDR = _data;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {;}
}
unsigned char twi_read(unsigned char _ack) {
unsigned char _data;
if (_ack==1)
{
TWCR = (1<<TWEA)|(1<<TWINT) | (1<<TWEN);
}
else
{
TWCR = (1<<TWINT) | (1<<TWEN);
}
while (!(TWCR & (1<<TWINT)))
{
}
_data = TWDR;
return _data;
}
void rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out) {
rs&=3;
if (sqwe) rs|=0x10;
if (out) rs|=0x80;
twi_start();
twi_write(0xd0);
twi_write(7);
twi_write(rs);
twi_stop();
}
void rtc_set_time(unsigned char hour,unsigned char min,unsigned char sec) {
twi_start();
twi_write(0xd0);
twi_write(0);
twi_write(sec);
twi_write(min);
twi_write(hour);
twi_stop();
}
void rtc_set_date(unsigned char date,unsigned char month,unsigned char year) {
twi_start();
twi_write(0xd0);
twi_write(4);
twi_write(date);
twi_write(month);
twi_write(year);
twi_stop();
}
void rtc_get_time(unsigned char *hour,unsigned char *min,unsigned char *sec) {
twi_start();
twi_write(0xd0);
twi_write(0);
twi_start();
twi_write(0xd1);
*sec=twi_read(1);
*min=twi_read(1);
*hour=twi_read(0);
twi_stop();
}
void rtc_get_date(unsigned char *date,unsigned char *month,unsigned char *year) {
twi_start();
twi_write(0xd0);
twi_write(4);
twi_start();
twi_write(0xd1);
*date=twi_read(1);
*month=twi_read(1);
*year=twi_read(0);
twi_stop();
}
unsigned char rtc_read(unsigned char address) {
unsigned char data;
twi_start();
twi_write(0xd0);
twi_write(address);
twi_start();
twi_write(0xd1);
data=twi_read(0);
twi_stop();
return data;
}
void rtc_write(unsigned char address, unsigned char data) {
twi_start();
twi_write(0xd0);
twi_write(address);
twi_write(data);
twi_stop();
}
- Реклама
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
на первой картинке это связь два провода,а I2C дополнительная функция его как я понял.
это два инициализация двухпроводной связи:;
А это ваши библиотеки:)
это два инициализация двухпроводной связи:
Код: Выделить всё
// 2 Wire Bus initialization
// Generate Acknowledge Pulse: On
// 2 Wire Bus Slave Address: 12h
// General Call Recognition: On
// Bit Rate: 62,500 kHz
TWSR=0x00;
TWBR=0x00;
TWAR=0x25;
TWCR=0x45А это ваши библиотеки:)
Код: Выделить всё
// LM75 Temperature Sensor functions
#include <lm75.h>
// DS1307 Real Time Clock functions
#include <ds1307.h>В поисках истины человек развивается.
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
I2C это программная реализация, если вдруг аппаратной пользоваться по каким-то причинам не хочется.
в спорах рождается ИСТИНА [AND] flud.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
Pavel_1978 писал(а):vitalik_1984 писал(а):как так не добавляется????
У меня всё добавилось!Код: Выделить всё
#asm .equ __i2c_port=0x12 ;PORTD .equ __sda_bit=0 .equ __scl_bit=1 #endasm #include <i2c.h>
это как раз програмный добавляется, сижу тоже пытаюсь вкурить как запустить аппаратный.
BEFORE #include -ING THIS FILE YOU
MUST DECLARE THE I/O ADDRESS OF THE
DATA REGISTER OF THE PORT AT WHICH
THE I2C BUS IS CONNECTED AND
THE DATA BITS USED FOR SDA & SCL
насколько я понимаю это написано,что шина I2C подключается к нужному порту.
Последний раз редактировалось vitalik_1984 Вс ноя 21, 2010 12:06:53, всего редактировалось 1 раз.
В поисках истины человек развивается.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
вот ваша библа уж не знаю это аппаратный или какой там код реализации
DS1307.LIB
DS1307.LIB
Код: Выделить всё
/*
CodeVisionAVR C Compiler
(C) 1998-2005 Pavel Haiduc, HP InfoTech S.R.L.
Dallas Semiconductors DS1307 I2C Bus Real Time Clock functions
*/
#include <i2c.h>
#include <bcd.h>
unsigned char rtc_read(unsigned char address)
{
unsigned char data;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_start();
i2c_write(0xd1);
data=i2c_read(0);
i2c_stop();
return data;
}
void rtc_write(unsigned char address,unsigned char data)
{
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_write(data);
i2c_stop();
}
void rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out)
{
rs&=3;
if (sqwe) rs|=0x10;
if (out) rs|=0x80;
i2c_start();
i2c_write(0xd0);
i2c_write(7);
i2c_write(rs);
i2c_stop();
}
void rtc_get_time(unsigned char *hour,unsigned char *min,unsigned char *sec)
{
i2c_start();
i2c_write(0xd0);
i2c_write(0);
i2c_start();
i2c_write(0xd1);
*sec=bcd2bin(i2c_read(1));
*min=bcd2bin(i2c_read(1));
*hour=bcd2bin(i2c_read(0));
i2c_stop();
}
void rtc_set_time(unsigned char hour,unsigned char min,unsigned char sec)
{
i2c_start();
i2c_write(0xd0);
i2c_write(0);
i2c_write(bin2bcd(sec));
i2c_write(bin2bcd(min));
i2c_write(bin2bcd(hour));
i2c_stop();
}
void rtc_get_date(unsigned char *date,unsigned char *month,unsigned char *year)
{
i2c_start();
i2c_write(0xd0);
i2c_write(4);
i2c_start();
i2c_write(0xd1);
*date=bcd2bin(i2c_read(1));
*month=bcd2bin(i2c_read(1));
*year=bcd2bin(i2c_read(0));
i2c_stop();
}
void rtc_set_date(unsigned char date,unsigned char month,unsigned char year)
{
i2c_start();
i2c_write(0xd0);
i2c_write(4);
i2c_write(bin2bcd(date));
i2c_write(bin2bcd(month));
i2c_write(bin2bcd(year));
i2c_stop();
}В поисках истины человек развивается.
- Pavel_1978
- Опытный кот
- Сообщения: 830
- Зарегистрирован: Пт ноя 16, 2007 11:21:37
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
Тогда получается что непосредственно аппаратное дерганье описано в этой части кода:vitalik_1984 писал(а):вот ваша библа уж не знаю это аппаратный или какой там код реализации
DS1307.LIB
Код: Выделить всё
#define TWEN 2
#define TWIE 0
#define TWINT 7
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWWC 3
void twi_start(void)
{
TWCR = (1<<TWEA)|(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {; }
}
void twi_stop(void) {
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
void twi_write(unsigned char _data)
{
TWDR = _data;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {;}
}
unsigned char twi_read(unsigned char _ack) {
unsigned char _data;
if (_ack==1)
{
TWCR = (1<<TWEA)|(1<<TWINT) | (1<<TWEN);
}
else
{
TWCR = (1<<TWINT) | (1<<TWEN);
}
while (!(TWCR & (1<<TWINT)))
{
}
_data = TWDR;
return _data;
}
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
так вам чего нужно то? вот вам функции для работы с часами:
даже просто добавив DS1307.LIB
автоматически добавится <i2c.h>
Код: Выделить всё
rtc_get_time
rtc_set_time
rtc_get_date
rtc_set_date
автоматически добавится <i2c.h>
В поисках истины человек развивается.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
Вот пример из ЦВАВР:
можно и этим примером воспользоваться:)
заморочились программный, аппаратный.
Код: Выделить всё
The FAT access functions require the presence of a Real Time Clock in the system, in order to be able to set the time stamp of files or directories.
//функции доступа к фат требуют присутствия часов реального врмени,чтоб устанавливать временные штампы для файлов или папок.
The following pointers to functions, that allow reading the time and date from the Real Time Clock, are declared in the ff.h header file:
Следующие указатели нафункции, позволяющие читать время и дату с часов, прописаны в ff.h файле:
void (*prtc_get_time) (unsigned char *hour, unsigned char *min, unsigned char *sec)
pointer to a Real Time Clock function used for reading time.
указатель для времени
void (*prtc_get_date) (unsigned char *date, unsigned char *month, unsigned int *year)
pointer to a Real Time Clock function used for reading date.
указатель для даты
On program startup these pointers need to be initialized to point to the appropriate RTC functions, like in the following example:
при старте программы эти указатели должны быть инициализированы как в следующем примере:
/* FAT on MMC/SD/SD HC card support */
#include <ff.h>
/* PCF8563 RTC functions*/
//функции часов реального времени
#include <PCF8563.h>
/* The PCF8563 RTC on the bus is connected to ATmega128 PORTD
часы подключены к шине I2C портД
SDA - PORTD.1
SCL - PORTD.0
*/
#asm
.equ __i2c_port=0x12
.equ __sda_bit=1
.equ __scl_bit=0
#endasm
void main(void)
{
/* init the PCF8563 RTC
инициализация часов реального времени */
rtc_init(0,RTC_CLKOUT_OFF,RTC_TIMER_OFF);
/* init the pointer to the RTC function used for reading time
указатель для времени*/
prtc_get_time=
(void (*)(unsigned char *,unsigned char *,unsigned char *))
rtc_get_time;
/* init the pointer to the RTC function used for reading time
указатель для даты */
prtc_get_date=
(void (*)(unsigned char *,unsigned char *,unsigned int *))
rtc_get_date;
/* follows the rest of the program */
/* ... */
}
заморочились программный, аппаратный.
В поисках истины человек развивается.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
#define TWEN 2
#define TWIE 0
#define TWINT 7
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWWC 3
это биты для работы с TWI
например
Bit 4 – TWSTO: TWI STOP Condition Bit
бит остановки шины
читайте даташит
#define TWIE 0
#define TWINT 7
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWWC 3
это биты для работы с TWI
например
Bit 4 – TWSTO: TWI STOP Condition Bit
бит остановки шины
читайте даташит
В поисках истины человек развивается.
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
скажите пожалуйсто,а как апаратный I2C использовать в пик?
читал датащит,но не совсем все понятно,точнее совсем ничего не понятно
читал датащит,но не совсем все понятно,точнее совсем ничего не понятно
- Pavel_1978
- Опытный кот
- Сообщения: 830
- Зарегистрирован: Пт ноя 16, 2007 11:21:37
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
Это то я прекрасно понимаю, просто не понятно почему при вставке выше выложенного кода в программу выдается куча ошибок при попытке компиляции...vitalik_1984 писал(а):#define TWEN 2....
это биты для работы с TWI
например
Bit 4 – TWSTO: TWI STOP Condition Bit
бит остановки шины
читайте даташит
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
А что конкретно пишет компилятор?
мне он написал, что биты переопределены и все.А когда стер
#define TWEN 2
#define TWIE 0
#define TWINT 7
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWWC 3
написал, что все ОК
мне он написал, что биты переопределены и все.А когда стер
#define TWEN 2
#define TWIE 0
#define TWINT 7
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWWC 3
написал, что все ОК
В поисках истины человек развивается.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
Попробуй так:
всё прекрасно компилируется, правда работает или нет вам выяснять:)
А потом может и мне придется...
Код: Выделить всё
/*****************************************************
Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 1,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
// Declare your global variables here
void twi_stop(void){
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
void twi_start(void)
{
TWCR = (1<<TWEA)|(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {;}
}
void twi_write(unsigned char _data)
{
TWDR = _data;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))) {;}
}
unsigned char twi_read(unsigned char _ack) {
unsigned char _data;
if (_ack==1)
{
TWCR = (1<<TWEA)|(1<<TWINT) | (1<<TWEN);
}
else
{
TWCR = (1<<TWINT) | (1<<TWEN);
}
while (!(TWCR & (1<<TWINT))) {;}
_data = TWDR;
return _data;
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// 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=0x00;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// 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;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=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;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=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;
SFIOR=0x00;
// 2 Wire Bus initialization
// Generate Acknowledge Pulse: Off
// 2 Wire Bus Slave Address: 0h
// General Call Recognition: Off
// Bit Rate: 33,333 kHz
TWSR=0x00;
TWBR=0x07;
TWAR=0x00;
TWCR=0x04;
while (1)
{
// Делай тут что хочешь...
};
}А потом может и мне придется...
В поисках истины человек развивается.
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
Спасибо!!! Плату почти развел. На днях спаяю, буду пробовать.vitalik_1984 писал(а):Попробуй так:
...
всё прекрасно компилируется, правда работает или нет вам выяснять:)
А потом может и мне придется...
Только надо адрес DS1307 вписать в генератор кода: 1101000 или 68 (hex)
Нельзя всё знать, достаточно понимать.
- Danko
- Сверлит текстолит когтями
- Сообщения: 1287
- Зарегистрирован: Пн окт 13, 2008 11:45:54
- Откуда: РФ, Крым, г.Бахчисарай
- Контактная информация:
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
этот вопрос уже в форуме поднимался, но mr_smit будьте готовы к тому, что в приведенном коде есть грабли
Если Вам попадется глючная DS1307, а такое к сожалению часто бывает, плохой контакт, подтягивающий резистор оборван и Ваша программа зависнет на указанной строке.
Код: Выделить всё
while (!(TWCR & (1<<TWINT))) {;}Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Re: АППАРАТНЫЙ I2C (TWI). Как использовать???
скажите пожалуйсто,а как апаратный I2C использовать в пик?
читал датащит,но не совсем все понятно,точнее совсем ничего не понятно
читал датащит,но не совсем все понятно,точнее совсем ничего не понятно


