Dúvidas...

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Dúvidas...

Mensagempor btpavao » 08 Out 2010 17:47

Galera,

Tenho um polling SPI entre 2 18F, funciona legal quando o polling ocorre a cada 60ms, porém qdo eu diminuo o tempo do polling para 20ms o slave perde o sincronismo e trava tudo. O PIC mestre roda com cristal de 25MHz, e escravo com um de 20MHz. No Mestre tenho uma interrupção de timer que gera o polling. No escravo a recepção é feita no while do main. Depois de fritar o tico e teco, desconfio que o problema é a recepção do escravo, pois ela é feita no while do main, acho que ele não é rápido o suficiente para receber o polling, sendo assim, tentei habilitar a interrupção da SPI, mas sem sucesso. Segue o código onde habilito a interrupção

Código: Selecionar todos
void ConfigInt (void)
{
   IPEN = 1;   //Habilita interrupção por prioridade
   PEIE = 1;   //Habilita Interrupção dos periféricos
   SSPIF = 0;    //Desenecessário
   
   SSPIP = 1;   //Configura interrupção MSSP de alta prioridade
   SSPIE = 1;   //Habilita interrupção por MSSP

   GIE = 1;   //Ativa  interrupção Global
}   


E o código do que eu faço qdo ocorre a interrupção

Código: Selecionar todos
void interrupt HighISR()
{
   if(SSPIF == 0)
   {
      //RecebeDadoSPI();
      Led ^= 1;
      SSPIF = 0;   
   }   
}


Se alguem puder dar uma idéia, ou achar algum erro no código....

Valeu!!!
btpavao
Bit
 
Mensagens: 37
Registrado em: 18 Set 2009 13:46

Mensagempor Fandango » 12 Out 2010 16:50

Cara, não entendi direito, mas independente disso...
- As linhas da SPI estão com resistores de pullup?
- Já colocou o osciloscópio para analisar o sincronismo?
... e assim falou Zaratustra !
Fandango
Byte
 
Mensagens: 187
Registrado em: 11 Jun 2007 22:13
Localização: SC - Brasil

Mensagempor btpavao » 13 Out 2010 08:08

Fandango,

Não coloquei os resistores, pois na documentação de SPI não fala nada sobre, mas vou fazer um teste, não custa nada. Coloquei o osciloscópio, no SDO do mestre tá tudo certo, no SDO do escravo, ele replica os dados que recebeu, com um ciclo de clock atrasado, acredito que está certo...

Valeu!
btpavao
Bit
 
Mensagens: 37
Registrado em: 18 Set 2009 13:46

Mensagempor Fandango » 13 Out 2010 08:51

Como pullup pode usar algo entre 4K7 e 8K2 para VCC = 5V. Observe que existe uma relação entre os valores adotados e as taxas de comunicação (no Google encontra bastante informação a respeito). Particularmente uso 5K6 com VCC = 3,3V e 4K7 com VCC = 5V para as taxas que pratico. Acredito que a maior influência está no tempo de subida (rise time), que pode ser observada no osciloscópio. O ideal é que a borda seja o mais reta possível.

De todas maneiras, creio que o seu problema esteja mais relacionado com o pooling do slave do que com as bordas. Sinceramente acho que o melhor seria usar interrupção.

Outra coisa que me ocorreu... procure definir as variáveis usadas dentro da interrupção como voláteis (aquelas que vierem a ser acessadas fora dela).

Quanto ao seu código, vou deixar por conta dos colegas mais experientes, porque eu teria que estudar o datasheet e estou meio que sem tempo.
... e assim falou Zaratustra !
Fandango
Byte
 
Mensagens: 187
Registrado em: 11 Jun 2007 22:13
Localização: SC - Brasil

Mensagempor proex » 13 Out 2010 09:15

SPI não precisa de Pull Ups.

.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor btpavao » 13 Out 2010 17:39

Testei com os resistores e continuou na mesma. No código que postei, eu coloquei errado, no if, a condição tem que ser == 1 pq qdo ocorre a interrupção o PIC seta esse flag, mas mesmo assim ainda não funciona. Tem algum erro no código que configura a interrupção???

Código: Selecionar todos
void interrupt HighISR()
{
   if(SSPIF == 1)
   {
      //RecebeDadoSPI();
      Led ^= 1;
      SSPIF = 0;   
   }   
}


Tks!
btpavao
Bit
 
Mensagens: 37
Registrado em: 18 Set 2009 13:46


Voltar para PIC

Quem está online

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

x