Entrar    Registrar

Attiny I2C

Software e Hardware para ATMEL

Moderadores: guest2003, 51, brasilma

  • Autor
    Mensagem

Attiny I2C

Mensagempor longo.251272 » 30 Set 2020 17:05

Boa tarde pessoal,

Estou tentando usar um Attiny84A como escravo numa rede I2C, quero usar ele como um ADC via I2C.
A principio estou usando a biblioteca USI TWI Slave driver,
inclui a configuração do Attiny84A

#if defined( __AVR_ATtiny84__ )
# define DDR_USI DDRA //DDRB
# define PORT_USI PORTA //PORTB
# define PIN_USI PINA //PINB
# define PORT_USI_SDA PA6 //PB0
# define PORT_USI_SCL PA4 //PB2
# define PIN_USI_SDA PINA6 //PINB0
# define PIN_USI_SCL PINA4 //PINB2
# define USI_START_COND_INT USISIF //was USICIF jjg
# define USI_START_VECTOR USI_START_vect
# define USI_OVERFLOW_VECTOR USI_OVF_vect
#endif

No main.c está esse código

Código: Selecionar todos
   // Own TWI slave address
   // Endereço do escravo TWI próprio
   // slaveAddress = 0x10;
   slaveAddress = 0x92;
   usiTwiSlaveInit(slaveAddress);

   // Set global interrupt enable
   sei();
   
   // This loop runs forever. If the TWI Transceiver is busy the execution will just continue doing other operations.
   // Este loop é executado para sempre. Se o TWI Transceiver estiver ocupado, a execução continuará fazendo outras operações.
   for(;;)
   {
      wdt_reset();

      if(usiTwiDataInReceiveBuffer())
      {
         
         Set_Down_Bit( PORTB, Saida_A0 );
         
         temp = usiTwiReceiveByte();
         
         switch (temp)
         {
            case 0x92: Set_Down_Bit( PORTB, Saida_A1 ); break;
            case 0x40: Set_Down_Bit( PORTB, Saida_A2 ); break;
            
            usiTwiTransmitByte(distance);
         }
         //       usiTwiTransmitByte(distance);
      }

      // Do something else while waiting for the TWI transceiver to complete.
      // Faça outra coisa enquanto espera a conclusão do transceptor TWI.
      
      asm volatile ("NOP" ::);
   }

   return 0;
}


Porém não está nem acionando o led1 que indica o recebimento de dados.

Alguém pode ajudar ?
longo.251272
Byte
 
Mensagens: 270
Registrado em: 08 Nov 2011 11:58
Localização: São Paulo - SP

Re: Attiny I2C

Mensagempor tronico » 01 Out 2020 10:24

Olá, você já verificou o que o mestre está enviando ? Tens um analizador lógico para verificar o que está sendo enviado pela I2C ?
tronico
Byte
 
Mensagens: 102
Registrado em: 08 Set 2011 07:48
Localização: Blumenau SC

Re: Attiny I2C

Mensagempor longo.251272 » 01 Out 2020 13:23

Bom dia, estou verificando com um osciloscópio.

Capturar.PNG


O mestre deve estar tudo ok porque ele funciona com o PCF8591, um conversor AD/DA com comunicação I2C. Preciso substituir o PCF pra trabalhar com 10 bits de resolução.

Hoje resolvi tentar usar esse exemplo, https://www.instructables.com/ATTiny-USI-I2C-The-detailed-in-depth-and-infor/

Mas sem sucesso. Sempre que ocorre a interrupção abaixo o controlador reseta.
Apanhando um bocado.

Código: Selecionar todos
ISR(USI_START_vect)
{
   Set_Down_Bit( PORTB, Saida_A1 );
   
   USI_I2C_Slave_State = USI_SLAVE_CHECK_ADDRESS;
   USI_SET_SDA_INPUT();
   // wait for SCL to go low to ensure the Start Condition has completed (the
   // start detector will hold SCL low ) - if a Stop Condition arises then leave
   // the interrupt to prevent waiting forever - don't use USISR to test for Stop
   // Condition as in Application Note AVR312 because the Stop Condition Flag is
   // going to be set from the last TWI sequence
   while((PIN_USI & (1 << PIN_USI_SCL)) && !((PIN_USI & (1 << PIN_USI_SDA))));
   if(!(PIN_USI & (1 << PIN_USI_SDA)))
   {
      // a Stop Condition did not occur
      USICR = USI_SLAVE_STOP_NOT_OCCUR_USICR;
   }
   else
   {
      // a Stop Condition did occur
      USICR = USI_SLAVE_STOP_DID_OCCUR_USICR;
   }
   USISR = USI_SLAVE_CLEAR_START_USISR;
}
Você não está autorizado a ver ou baixar esse anexo.
longo.251272
Byte
 
Mensagens: 270
Registrado em: 08 Nov 2011 11:58
Localização: São Paulo - SP

Re: Attiny I2C

Mensagempor longo.251272 » 01 Out 2020 15:47

Como estou sem depurador coloquei leds pra identificar oque está ocorrendo.
O USI_START_VECTOR está sendo acionado e o USI_OVERFLOW_VECTOR também, porém não tenho nada no buffer. Talvez o endereço do escravo não está batendo.

Agora vou tentar achar uma alternativa pra verificar oque está acontecendo.
longo.251272
Byte
 
Mensagens: 270
Registrado em: 08 Nov 2011 11:58
Localização: São Paulo - SP

Re: Attiny I2C

Mensagempor longo.251272 » 02 Out 2020 10:42

Capturar.PNG


Na foto acima do analisador lógico o endereço enviado é 0x92. Alguém pode me confirmar isso ?
Você não está autorizado a ver ou baixar esse anexo.
longo.251272
Byte
 
Mensagens: 270
Registrado em: 08 Nov 2011 11:58
Localização: São Paulo - SP

Re: Attiny I2C

Mensagempor longo.251272 » 02 Out 2020 11:08

Já descobri o erro, não é 0x92 e sim 0x49. O primeiro bit é desconsiderado.

Obrigado pessoal.
longo.251272
Byte
 
Mensagens: 270
Registrado em: 08 Nov 2011 11:58
Localização: São Paulo - SP

Re: Attiny I2C

Mensagempor longo.251272 » 08 Out 2020 16:15

Capturar.JPG


Boa tarde,

Estou com dificuldade pra achar uma solução pra comunicação ficar compatível com o PCF8591.
O I2C do pcf sempre que mandar 1 byte de 8 bits tem que gerar um pulso no clock, o Attiny está considerando como dado pro próximo byte e este erro fica acumulativo pra o outro byte.

Por exemplo na Imagem acima estou enviando pro PCF 0x92 e 0x40, o PCF funciona perfeito, mas no Attiny ele está recebendo 0x92 e 0xA0,

0x40 - 0100-0000
0xA0 - 1010-0000 ( ele está incluindo o 9 clock aqui )

Alguém tem alguma sugestão de como corrigir isso ?

Obrigado pela atenção
Você não está autorizado a ver ou baixar esse anexo.
longo.251272
Byte
 
Mensagens: 270
Registrado em: 08 Nov 2011 11:58
Localização: São Paulo - SP

Re: Attiny I2C

Mensagempor denis » 08 Out 2020 16:47

O 9 clock que você disse seria o ACK do PCF que neste caso é o ACK do Attiny (Slave), correto?
O Attiny envia o ACK quando é chamado pelo Master?
denis
Byte
 
Mensagens: 240
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: Attiny I2C

Mensagempor longo.251272 » 09 Out 2020 14:55

denis escreveu:O 9 clock que você disse seria o ACK do PCF que neste caso é o ACK do Attiny (Slave), correto?
O Attiny envia o ACK quando é chamado pelo Master?


7 Bits de endereço
1 Bit indicando leitura ou escrita.
1 Bit de reconhecimento. Este é o nono Bit.
8 Bits de Dado
1 Bit de reconhecimento - O nono.
8 Bits de Dado
1 Bit de reconhecimento - O nono.

Esse nono bit vem do mestre. Um microcontrolador da família 51.
Tirei esse nono bit gerado pelo mestre, mas ai o PCF não funciona e o attiny sim, porém eu preciso que os funcione nos dois e como não posso mudar o PCF preciso fazer com que o attiny exclua esse nono bit dos dados. Vou tentar o modo USIWM[1:0] = 3
longo.251272
Byte
 
Mensagens: 270
Registrado em: 08 Nov 2011 11:58
Localização: São Paulo - SP

Re: Attiny I2C

Mensagempor denis » 09 Out 2020 15:55

Veja na imagem abaixo.

O bit 9 que você se refere é enviado do Slave para o Master.
Você está dizendo que este bit é enviado pelo 8051, mas na verdade quem envia este bit é o Slave.


Imagem

https://www.ti.com/lit/an/slva704/slva704.pdf
Página 7
denis
Byte
 
Mensagens: 240
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: Attiny I2C

Mensagempor longo.251272 » 09 Out 2020 16:21

Isso que não estou entendendo. Porque o 8051 comunica com o PCF e uma Eeprom sem problema enviando esse nono bit, se eu tiro da erro na comunicação. O PCF não responde.
No I2C do 8051 sempre ele manda um clock e um delay a cada 8 bits transmitido.

Estou pensando em fazer I2C no attiny na unha para excluir esse nono bit dos dados.
longo.251272
Byte
 
Mensagens: 270
Registrado em: 08 Nov 2011 11:58
Localização: São Paulo - SP

Re: Attiny I2C

Mensagempor denis » 09 Out 2020 19:09

Esta certo, o 8051 manda o clock mas o PCF manda o bit de ACK.
denis
Byte
 
Mensagens: 240
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: Attiny I2C

Mensagempor Vicente » 10 Out 2020 03:27

Este é um fragmento em asm de um master e um slave atmega8 rodando em 8MHz, talvez seja útil:
Os programas completos estão nesse meu projeto com um master e quatro slaves:
https://calc128964.blogspot.com/2020/01 ... ue_29.html


MASTER:

;clock twi
ldi r16,50 ;120us
out twbr,r16
ldi r16,0 ;0: twps = 1
out twsr,r16

;1º byte
ldi r17,0x55 ;0x55 = byte = dado transmitido
ldi r18,0x02 ;0x02 = endereço 1
rcall transmite_byte

;2º byte
ldi r17,0xaa ;0xaa = byte = dado transmitido
ldi r18,0x02 ;0x02 = endereço 1
rcall transmite_byte

transmite_byte:
;1
ldi r16,0xe4 ;0xe4 = start
out twcr,r16
;2
espera1:
in r16,twcr ;pronto
sbrs r16,twint
rjmp espera1
;3
out twdr,r18 ;r18 = endereço sla+w
ldi r16,0xc4 ;0xc4 = twint transmite
out twcr,r16
;4
espera2:
in r16,twcr ;pronto
sbrs r16,twint
rjmp espera2
;5
out twdr,r17 ;r17 = byte transmitido
ldi r16,0xc4 ;0xc4 = twint transmite
out twcr,r16
;6
espera3:
in r16,twcr ;pronto
sbrs r16,twint
rjmp espera3
;7
ldi r16,0xd4 ;0xd4 = stop
out twcr,r16

;desliga twi
in r16,twcr
andi r16,0xfb ;0xfb = zera twen = desliga twi
out twcr,r16

ret

;------------------------------------------------------------------------------------
SLAVE:
rcall recebe_byte
cpi r17,0x55 ;0x55 1º byte dado
breq recebeu
rjmp nao_recebeu
recebeu:
sbi portb,0
nao_recebeu:

rcall recebe_byte
cpi r17,0xaa ;0xaa 2º byte dado
breq recebeu2
rjmp nao_recebeu2
recebeu2:
sbi portb,0
nao_recebeu2:



;Recebe Byte r17

recebe_byte:
ldi r16,0x02 ;0x02 = endereço = 1
out twar,r16

ldi r16,0x44 ;0x44 = inicio
out twcr,r16
espera1:
in r16,twcr ;pronto
sbrs r16,twint
rjmp espera1

ldi r16,0xc4 ;0xc4 = liga twint
out twcr,r16
espera2:
in r16,twcr ;pronto
sbrs r16,twint
rjmp espera2

in r17,twdr ;dado recebido

;desliga twi
in r16,twcr
andi r16,0xfb ;0xfb = zera twen
out twcr,r16

ret
Vicente
Bit
 
Mensagens: 29
Registrado em: 24 Fev 2017 20:39

Re: Attiny I2C

Mensagempor denis » 10 Out 2020 14:08

Infelizmente eu não posso te ajudar.
Não conheço Assembly o suficiente.
denis
Byte
 
Mensagens: 240
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: Attiny I2C

Mensagempor longo.251272 » 13 Out 2020 12:10

Resolvi o problema usando as alterações feita pelo Donblake - https://www.avrfreaks.net/forum/8-bit-c ... ic&t=48395

Próximo passo fazer o escravo transmitir.
longo.251272
Byte
 
Mensagens: 270
Registrado em: 08 Nov 2011 11:58
Localização: São Paulo - SP

Próximo

Voltar para AVR

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante