RTV forum PL | NewsGroups PL

Projekty konwertera RS232 na I2C z AVR jak zacząć i co wykorzystać?

RS232 --> AVR --> I2C

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Projekty konwertera RS232 na I2C z AVR jak zacząć i co wykorzystać?

Minsu
Guest

Wed Aug 30, 2006 9:26 am   



Witam,

Czy ktoś ma namiar na projekt oparty o AVR, robiący za przejściówke
RS232-I2C? Ewentualnie jakieś porady, jak to szybko ugryźć?

Chciałbym przy pomocy takiego BOX-a mieć możliwość komunikacji z
układami I2C z PC/laptopa.

pozdrawiam

Michał T
Guest

Wed Aug 30, 2006 10:16 am   



Quote:
Chciałbym przy pomocy takiego BOX-a mieć możliwość komunikacji z
układami I2C z PC/laptopa.

Może programator z allegro pod RS232.

Minsu
Guest

Wed Aug 30, 2006 10:20 am   



Michał T napisał(a):
Quote:
Chciałbym przy pomocy takiego BOX-a mieć możliwość komunikacji z
układami I2C z PC/laptopa.

Może programator z allegro pod RS232.

Tylko nie powiedziałem o jednej zasadniczej rzeczy.
Bardzo prosto zrobić przejściówkę hmmm... "softową" - przekonwertować
poziomy i programowo sterować liniami bit-po-bicie. Nie wchodzi to w gre
w sytuacji, gdy samo RS jest po USB - samo opóżnienie magistrali da mi
fatalny transfer, a chodzi o np. wgrywanie softu o wielkości rzędu 1MB.

Przejściówka musi zatem realizować sama wysłanie np. bloku danych o
rozsądnej wielkości.

pozdrawiam

Michał T
Guest

Wed Aug 30, 2006 10:29 am   



Quote:
Tylko nie powiedziałem o jednej zasadniczej rzeczy.
Bardzo prosto zrobić przejściówkę hmmm... "softową" - przekonwertować
poziomy i programowo sterować liniami bit-po-bicie. Nie wchodzi to w gre w
sytuacji, gdy samo RS jest po USB - samo opóżnienie magistrali da mi
fatalny transfer, a chodzi o np. wgrywanie softu o wielkości rzędu 1MB.

Przejściówka musi zatem realizować sama wysłanie np. bloku danych o
rozsądnej wielkości.

Jakoś nie mogę Cię zrozumieć. Może sam sprawdzisz:
http://www.allegro.pl/item124351161_profesjonalny_programator_isp_si_prog_2_2_avr_pic.html

TO nie jest na USB tylko na RS232. 1MB to troszkę dużo.... Smile

Piotr
Guest

Thu Aug 31, 2006 7:39 pm   



Minsu napisał(a):
Quote:
Witam,

Czy ktoś ma namiar na projekt oparty o AVR, robiący za przejściówke
RS232-I2C? Ewentualnie jakieś porady, jak to szybko ugryźć?

Chciałbym przy pomocy takiego BOX-a mieć możliwość komunikacji z
układami I2C z PC/laptopa.

pozdrawiam

Robiłem cos takiego od A do Z (konwerter USB na I2C - ATMEGA16 i
USBN9603) juz bardzo dawno, przy SCL=800kHz transfer po USB 64kB/s w
trybie ISOC, prszy mniejszych czestotliwosciach zegara wykorzystałem
przekaz masowy. Biorąc pod uwage ze USBN9603 to starosc radziłbym terz
wykorzystac FT2232C (gotowe API udostepnia prod. dla tych co znaja C++
lub Delphi i lubią cos własnego nasmarowac) albo ARM'a AT91SAM7S64- z
wykorzystaniem CDC wtedy nie trzeba pisac driver'a a urzadznie widziane
jest jako wirtualny com, to co sobie zrobisz po stronie procesora to juz
konwersja na dowolna magistrale (no prawie....)

Minsu
Guest

Fri Sep 01, 2006 6:45 am   



Piotr napisał(a):

Quote:
Robiłem cos takiego od A do Z (konwerter USB na I2C - ATMEGA16 i
USBN9603) juz bardzo dawno, przy SCL=800kHz transfer po USB 64kB/s w
trybie ISOC, prszy mniejszych czestotliwosciach zegara wykorzystałem
przekaz masowy. Biorąc pod uwage ze USBN9603 to starosc radziłbym terz
wykorzystac FT2232C (gotowe API udostepnia prod. dla tych co znaja C++
lub Delphi i lubią cos własnego nasmarowac) albo ARM'a AT91SAM7S64- z
wykorzystaniem CDC wtedy nie trzeba pisac driver'a a urzadznie widziane
jest jako wirtualny com, to co sobie zrobisz po stronie procesora to juz
konwersja na dowolna magistrale (no prawie....)

Dzięki... Właśnie myślałem o FT232 bo jest tani i działa sprawnie.
Napisanie kodu do ATMegi w C++ dużo zajmie czasu początkującemu w AVR
(dotychczas robiłem na MCS51, ale tym razem potrzebuję czegoś szybszego)?

pozdrawiam

Taddy
Guest

Fri Sep 01, 2006 12:52 pm   



Minsu wrote:

Quote:
Witam,

Czy ktoś ma namiar na projekt oparty o AVR, robiący za przejściówke
RS232-I2C? Ewentualnie jakieś porady, jak to szybko ugryźć?

Chciałbym przy pomocy takiego BOX-a mieć możliwość komunikacji z
układami I2C z PC/laptopa.

pozdrawiam

Moze to ponizej sobie przerob/dostosuj.
Kiedys robilem cos takiego - ale nie moge znalezc wersji ostatecznej - tylko
tyle mi zostalo.

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <string.h>
#include <avr/delay.h>

#define BAUD 5 //F_CPU/((115200 * 16) - 1) //wpis do UBRR dla UART (5 -
11059200 lub 3 - 7372800)

#define TTS_BS 256
#define STT_BS 512

#define ADDRESS 0x21 // adres slave I2C

#define LED1_ON PORTB |= 0x01
#define LED1_OFF PORTB &= 0xFE

#define LED2_ON PORTB |= 0x02
#define LED2_OFF PORTB &= 0xFD

#define IRQ_LINE_ON PORTD&=0xFB //0b1111 1011
#define IRQ_LINE_OFF PORTD|=0x04 //0b0000 0100

volatile unsigned char twi_state;
volatile unsigned char twi_reg = 0;
volatile unsigned char tts_head = 0;
volatile unsigned char tts_tail = 0;
volatile unsigned int stt_head = 0;
volatile unsigned int stt_tail = 0; //Pointers to circle buffers

volatile unsigned char twi_to_ser[TTS_BS]; //Buffer for TWI->SERIAL
volatile unsigned char ser_to_twi[STT_BS]; //Buffer for SERIAL->TWI

//**************************************************************************************
//I2C
void I2C_init(void)
{
TWAR = ADDRESS<<1 ;
TWBR = 0x01;
TWCR = 0x45;
TWSR &= ~((1<<TWPS1)|(1<<TWPS0));
}

//**************************************************************************************
void port_init(void)
{
DDRB = 0x03;
PORTB = 0x00;

DDRC = 0x00;
PORTC = 0x00;

DDRD = 0x06;
PORTD = 0x05;
}

//**************************************************************************************
//RS
void USART_Init(void)
{

UBRRH = 0;
UBRRL = BAUD;

/* Set frame format: 8data, 1stop bit */
UCSRC = (1<<URSEL)|(3<<UCSZ0);

/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
}

//**************************************************************************************
void delay_ms(unsigned long ms)
{

unsigned long i;
ms *= 1000;
for (i=0; i < ms; i++)
{
_delay_us(1);
}
}

//**************************************************************************************
int main (void)
{
port_init();
twi_state = 255;

LED1_ON;
LED2_ON;

USART_Init();
I2C_init();

sei();

while(1)
{
_delay_ms(500);
_delay_ms(500);
LED1_OFF;
LED2_OFF;
}

return(0);
}
/*
void send_data (unsigned char c)
{
twi_to_ser[tts_head] = c;

tts_head++;
if (tts_head > TTS_BS)
tts_head = 0;
if (tts_head == tts_tail)
{
tts_tail++;
if (tts_tail > TTS_BS)
stt_tail = 0;
}
UCSRB |= (1<<UDRIE);
}
*/

//**************************************************************************************
INTERRUPT /*SIGNAL*/ (SIG_2WIRE_SERIAL)
{
unsigned char status = (TWSR & 0xFC);

//SLAVE TRANSMITTER MODE
//odebrano bit startu + adres + bit R
if (status == 0xA8)
{
if (twi_reg == 0)
{
if (stt_head != stt_tail)
{
TWDR = ser_to_twi[stt_tail++];

stt_tail &= (STT_BS - 1);

if (stt_head == stt_tail)
{
IRQ_LINE_OFF;
}

}
else
TWDR = 0x00;
}
else
{
if (stt_head == stt_tail)
TWDR = 0;
else
TWDR = 1;
twi_reg = 0;
}
}

//SLAVE RECEIVER MODE
//odebrano bit startu + adres + bit W
if (status == 0x60)
{
twi_state = 0; //odebrano SLA+W
}

// odebrano DATA
if (status == 0x80)
{
if (twi_state == 0) //skoro bylo SLA+W teraz odebrano rejestr
{
twi_reg = TWDR;
twi_state = 1;
}
else //skoro poprzednio byl rejestr teraz jest dana do podanego rejestru
{
if (twi_reg == 0)
{
twi_to_ser[tts_head++] = TWDR;

//tts_head &= (TTS_BS - 1);
if (tts_head == tts_tail)
{
tts_tail++;
//tts_tail &= (TTS_BS - 1);
}
UCSRB |= (1<<UDRIE);
}
if (twi_reg == 2)
{
UBRRL = TWDR;
twi_reg = 0;
}
}
}


LED2_ON;
TWCR |= 0x80;
}


//**************************************************************************************
SIGNAL (SIG_UART_RECV)
{
ser_to_twi[stt_head++] = UDR;

stt_head &= (STT_BS - 1);
if (stt_head == stt_tail)
{
stt_tail++;
stt_tail &= (STT_BS - 1);
}
LED1_ON;
IRQ_LINE_ON;
}

//**************************************************************************************
SIGNAL (SIG_UART_DATA)
{

if (tts_head != tts_tail)
{
UDR = twi_to_ser[tts_tail++];

//tts_tail &= (TTS_BS - 1);

LED1_ON;
}
else
UCSRB &= ~(1<<UDRIE);



--
Taddy

Minsu
Guest

Fri Sep 01, 2006 2:05 pm   



Taddy napisał(a):
(...)

dzięki za kod! Smile

Paweł Cern
Guest

Wed Sep 06, 2006 12:30 pm   



Użytkownik "Minsu" <minsu_REMOVE_IT_at@daeyang.cc> napisał w wiadomości
news:ed3ln6$7f2$1@inews.gazeta.pl...
Quote:
Witam,

Czy ktoś ma namiar na projekt oparty o AVR, robiący za przejściówke
RS232-I2C? Ewentualnie jakieś porady, jak to szybko ugryźć?

Chciałbym przy pomocy takiego BOX-a mieć możliwość komunikacji z układami
I2C z PC/laptopa.

pozdrawiam

Na www.opencores.org znajdziesz IP sterownika USB. Cały SOC możesz zrobić w
jakimś niewielkim FPGA (Spartan III, może nawet Spartan II). Jeśli
urządzenie ma być idiotycznie proste (bez procesora) - może nawet w jakimś
CPLD się zmieści.

Paweł

elektroda NewsGroups Forum Index - Elektronika Polska - Projekty konwertera RS232 na I2C z AVR jak zacząć i co wykorzystać?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map