АППАРАТНЫЙ I2C (TWI). Как использовать???

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

АППАРАТНЫЙ I2C (TWI). Как использовать???

Сообщение mr_smit »

Контроллер ATMega8. Необходимо обмениваться данными с часами реального времени DS1307. Пишу в CodeVisionAVR.

После включения интерфейса, в код ничего не добавляется. НИЧЕГО. Никаких доп. библиотек и т.д. Как использовать???
Untitled-1.jpg
(89.31 КБ) 735 скачиваний
Можно конечно программный, но зачем, если есть аппаратный.
Untitled-2.jpg
(89.89 КБ) 653 скачивания
Как использовать аппаратный I2C ?
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: АППАРАТНЫЙ I2C (TWI). Как использовать???

Сообщение vitalik_1984 »

как так не добавляется????
У меня всё добавилось!

Код: Выделить всё

#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). Как использовать???

Сообщение vitalik_1984 »

я конечно не занимался практическим примением, но читал немного теории
там нужно по адресу вызывать нужное тебе устройство.
В поисках истины человек развивается.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: АППАРАТНЫЙ I2C (TWI). Как использовать???

Сообщение mr_smit »

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). Как использовать???

Сообщение Pavel_1978 »

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). Как использовать???

Сообщение vitalik_1984 »

на первой картинке это связь два провода,а 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>
В поисках истины человек развивается.
Реклама
Аватара пользователя
demson
IT KT
Сообщения: 1309
Зарегистрирован: Пн авг 25, 2008 08:49:33
Контактная информация:

Re: АППАРАТНЫЙ I2C (TWI). Как использовать???

Сообщение demson »

I2C это программная реализация, если вдруг аппаратной пользоваться по каким-то причинам не хочется.
в спорах рождается ИСТИНА [AND] flud.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: АППАРАТНЫЙ I2C (TWI). Как использовать???

Сообщение vitalik_1984 »

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). Как использовать???

Сообщение vitalik_1984 »

вот ваша библа уж не знаю это аппаратный или какой там код реализации

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). Как использовать???

Сообщение Pavel_1978 »

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). Как использовать???

Сообщение vitalik_1984 »

так вам чего нужно то? вот вам функции для работы с часами:

Код: Выделить всё

rtc_get_time
rtc_set_time
rtc_get_date
rtc_set_date
даже просто добавив DS1307.LIB
автоматически добавится <i2c.h>
В поисках истины человек развивается.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: АППАРАТНЫЙ I2C (TWI). Как использовать???

Сообщение vitalik_1984 »

Вот пример из ЦВАВР:

Код: Выделить всё

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). Как использовать???

Сообщение vitalik_1984 »

#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
бит остановки шины
читайте даташит
В поисках истины человек развивается.
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: АППАРАТНЫЙ I2C (TWI). Как использовать???

Сообщение vovik15 »

скажите пожалуйсто,а как апаратный I2C использовать в пик?
читал датащит,но не совсем все понятно,точнее совсем ничего не понятно
Аватара пользователя
Pavel_1978
Опытный кот
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Re: АППАРАТНЫЙ I2C (TWI). Как использовать???

Сообщение Pavel_1978 »

vitalik_1984 писал(а):#define TWEN 2....

это биты для работы с TWI
например
Bit 4 – TWSTO: TWI STOP Condition Bit
бит остановки шины
читайте даташит
Это то я прекрасно понимаю, просто не понятно почему при вставке выше выложенного кода в программу выдается куча ошибок при попытке компиляции...
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: АППАРАТНЫЙ I2C (TWI). Как использовать???

Сообщение vitalik_1984 »

А что конкретно пишет компилятор?

мне он написал, что биты переопределены и все.А когда стер
#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). Как использовать???

Сообщение vitalik_1984 »

Попробуй так:

Код: Выделить всё

/*****************************************************
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)
      {
      // Делай тут что хочешь...
      };
}
всё прекрасно компилируется, правда работает или нет вам выяснять:)
А потом может и мне придется...
В поисках истины человек развивается.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: АППАРАТНЫЙ I2C (TWI). Как использовать???

Сообщение mr_smit »

vitalik_1984 писал(а):Попробуй так:

...

всё прекрасно компилируется, правда работает или нет вам выяснять:)
А потом может и мне придется...
Спасибо!!! Плату почти развел. На днях спаяю, буду пробовать.

Только надо адрес DS1307 вписать в генератор кода: 1101000 или 68 (hex)
Нельзя всё знать, достаточно понимать.
Аватара пользователя
Danko
Сверлит текстолит когтями
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай
Контактная информация:

Re: АППАРАТНЫЙ I2C (TWI). Как использовать???

Сообщение Danko »

этот вопрос уже в форуме поднимался, но mr_smit будьте готовы к тому, что в приведенном коде есть грабли

Код: Выделить всё

while (!(TWCR & (1<<TWINT))) {;}
Если Вам попадется глючная DS1307, а такое к сожалению часто бывает, плохой контакт, подтягивающий резистор оборван и Ваша программа зависнет на указанной строке.
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: АППАРАТНЫЙ I2C (TWI). Как использовать???

Сообщение vovik15 »

скажите пожалуйсто,а как апаратный I2C использовать в пик?
читал датащит,но не совсем все понятно,точнее совсем ничего не понятно
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»