Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Tiago Shimizu

Enc28j60 + pic18f2550 + c18

Recommended Posts

Olá pessoal, estou tendo problemas em configurar um módulo ENC28J60 em um microcontrolador 18F2550 no C18. Basicamente preciso abrir um socket de comunicação entre o pic e o pc para obter algumas informações. Utilizo um cristal de 20MHz e meu código está assim:

#include <p18f2550.h>

#define _XTAL_FREQ 20000000      // cristal de 20 Mhz
#pragma config FOSC = HS
#pragma config CPUDIV = OSC1_PLL2
#pragma config WDT = OFF
#pragma config PBADEN = OFF
#pragma config LVP = OFF
#pragma config PWRT = ON
#pragma config DEBUG= OFF
#pragma config MCLRE = OFF 
  
#pragma udata
void YourLowPriorityISRCode();
void YourHighPriorityISRCode();
#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS	0x08
#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS	    0x18

#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
void Remapped_High_ISR (void)
{
     _asm goto YourHighPriorityISRCode _endasm
}
#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
void Remapped_Low_ISR (void)
{
     _asm goto YourLowPriorityISRCode _endasm
}
#pragma code

#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode()
{   
    
}	
#pragma interruptlow YourLowPriorityISRCode
void YourLowPriorityISRCode()
{
  TickUpdate();
}
  
void main(void)
{
  static TICK t = 0;
  while (1) 
  {
     TickInit();
     InitAppConfig();
     StackInit();
     while (1) 
     {
        if (TickGet() - t >= TICK_SECOND / 2ul) 
        {
           t = TickGet();
        }

        StackTask();
        StackApplications();
        #if defined(STACK_USE_TCP_SERVER)
          ServerSocketTCP();
        #endif
     }
  }
}
  
static ROM BYTE SerializedMACAddress[6] = {MY_DEFAULT_MAC_BYTE1, MY_DEFAULT_MAC_BYTE2, MY_DEFAULT_MAC_BYTE3,
    MY_DEFAULT_MAC_BYTE4, MY_DEFAULT_MAC_BYTE5, MY_DEFAULT_MAC_BYTE6};

void InitAppConfig(void) {
    AppConfig.Flags.bIsDHCPEnabled = TRUE;
    AppConfig.Flags.bInConfigMode = TRUE;
    memcpypgm2ram((void*) &AppConfig.MyMACAddr, (ROM void*) SerializedMACAddress, sizeof (AppConfig.MyMACAddr));
    memcpypgm2ram(AppConfig.NetBIOSName, (ROM void*) MY_DEFAULT_HOST_NAME, 16);
    FormatNetBIOSName(AppConfig.NetBIOSName);
    AppConfig.MyIPAddr.Val = MY_DEFAULT_IP_ADDR_BYTE1 | MY_DEFAULT_IP_ADDR_BYTE2 << 8ul | MY_DEFAULT_IP_ADDR_BYTE3 << 16ul | MY_DEFAULT_IP_ADDR_BYTE4 << 24ul;
    AppConfig.DefaultIPAddr.Val = AppConfig.MyIPAddr.Val;
    AppConfig.MyMask.Val = MY_DEFAULT_MASK_BYTE1 | MY_DEFAULT_MASK_BYTE2 << 8ul | MY_DEFAULT_MASK_BYTE3 << 16ul | MY_DEFAULT_MASK_BYTE4 << 24ul;
    AppConfig.DefaultMask.Val = AppConfig.MyMask.Val;
    AppConfig.MyGateway.Val = MY_DEFAULT_GATE_BYTE1 | MY_DEFAULT_GATE_BYTE2 << 8ul | MY_DEFAULT_GATE_BYTE3 << 16ul | MY_DEFAULT_GATE_BYTE4 << 24ul;
    AppConfig.PrimaryDNSServer.Val = MY_DEFAULT_PRIMARY_DNS_BYTE1 | MY_DEFAULT_PRIMARY_DNS_BYTE2 << 8ul | MY_DEFAULT_PRIMARY_DNS_BYTE3 << 16ul | MY_DEFAULT_PRIMARY_DNS_BYTE4 << 24ul;
    AppConfig.SecondaryDNSServer.Val = MY_DEFAULT_SECONDARY_DNS_BYTE1 | MY_DEFAULT_SECONDARY_DNS_BYTE2 << 8ul | MY_DEFAULT_SECONDARY_DNS_BYTE3 << 16ul | MY_DEFAULT_SECONDARY_DNS_BYTE4 << 24ul;
}

void ServerSocketTCP(void) {
    WORD lenA;
    BYTE i;
    static DWORD timeout[SERVER_CONNS];
    static TCP_SOCKET MySocket[SERVER_CONNS];
    //unsigned char buf[253];
    unsigned char buf[];
    static enum _TCPServerState {
        SM_HOME = 0,
        SM_LISTENING,

    } maquina_estado_servidor = SM_HOME;

    //maquina de estado
    switch (maquina_estado_servidor) {
            //----------------------------------------------------------------------
        case SM_HOME:
            for (i = 0; i < SERVER_CONNS; i++) {
                //faz alocação de de buffer para os sockets
                MySocket[i] = TCPOpen(0, TCP_OPEN_SERVER, SERVER_PORT, TCP_PURPOSE_GENERIC_TCP_SERVER);
                timeout[i] = TickGet();
            }
            maquina_estado_servidor = SM_LISTENING;
            break;
            //----------------------------------------------------------------------
        case SM_LISTENING:
            for (i = 0; i < SERVER_CONNS; i++) {
                if (TCPIsConnected(MySocket[i])) {

                    lenA = TCPIsGetReady(MySocket[i]);

                    //se passou 15 segundos e nao recebeu nada desconecta
                    if (TickGet() - timeout[i] >= TICK_SECOND * 15) {
                        TCPDisconnect(MySocket[i]);
                    }
                } else {
                    timeout[i] = TickGet();
                }
            }
            break;
            //----------------------------------------------------------------------
    }
}

O arquivo HardwareProfile.h está assim:

#ifndef __HARDWARE_PROFILE_H
#define __HARDWARE_PROFILE_H

#include "GenericTypeDefs.h"
#include "Compiler.h"

#define GetSystemClock()  (20000000ul)   // Hz
#define GetInstructionClock() (GetSystemClock()/4)
#define GetPeripheralClock()  (GetSystemClock()/4)

//ENC28J60 I/O pins
#define ENC_RST_TRIS	(TRISCbits.TRISC0)
#define ENC_RST_IO		(LATCbits.LATC0)
#define ENC_CS_TRIS		(TRISCbits.TRISC1)
#define ENC_CS_IO		(LATCbits.LATC1)
#define ENC_SCK_TRIS	(TRISBbits.TRISB1)
#define ENC_SDI_TRIS	(TRISBbits.TRISB0)
#define ENC_SDO_TRIS	(TRISCbits.TRISC7)
#define ENC_SPI_IF		(PIR1bits.SSPIF)
#define ENC_SSPBUF		(SSPBUF)
#define ENC_SPISTAT		(SSPSTAT)
#define ENC_SPISTATbits	(SSPSTATbits)
#define ENC_SPICON1		(SSPCON1)
#define ENC_SPICON1bits	(SSPCON1bits)
#define ENC_SPICON2		(SSPCON2)

Alguém poderia me ajudar?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Pessoal, já não sei mais se estou fazendo certo agora.... ou se meus cálculos estão certos. 

    Estou utilizando um cristal de 20MHz. Até onde sei, para microcontroladores da família 18F, o cálculo seria:

    // Fmaq = Fosc / 4 => Fmaq = 20MHz / 4 => 5MHz
    #define GetSystemClock()  (20000000ul)   // 20MHz
    #define GetInstructionClock() (GetSystemClock()/4) // 5MHz
    #define GetPeripheralClock()  (GetSystemClock()/4) // 5MHz

    Nessas configurações, o ENC28J60 começa a querer comunicar mas logo em seguida desliga. Agora, se altero o valor de divisão do GetSystemClock() de 4 para valores bem mais altos, 40 por exemplo, ele começa a comunicar com o PC, fica uns 2 segundos, e cai a comunicação.

    Estou certo em meus cálculos?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×