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:  
wBB

PIC Configuração do PORTC em PIC

Recommended Posts

Estou querendo apenas setar o bit 1 do PORTC num PIC18F46K80 (44 pinos), mas acho que estou deixando escapar alguma configuração (o bit 2 por exemplo, não tem problema e funciona normal). Estou usando o oscilador interno do microcontrolador e MikroC como IDE.

Gostaria de uma orientação se está correto o que estou fazendo ou se falta algo?

void main() {
    T0CON  = 0x82; 		// 0b10000010        Habilita contagem do Timer0
                   		//                   Seta Timer0 com 8bits
                   		//                   Clock proveniente do ciclo de máquina interno
                   		//                   Incrementa na borda de subida do pino T0CKI (indiferente neste caso)
                   		//                   Habilita prescaler
                   		//                   Configura prescaler em 1:8

    INTCON = 0xE0; 		// 0b11100000        Habilita a interrupção global;
                   		//                   Habilita periféricos;
                   		//                   Habilita estouro do Timer0;
                   		//                   Zera flag de estouro do Timer0 (bit 2)
    
    PMD0    = 0xFF;		// Desabilita os comparadores
    TRISC   = 0x00;		// Configura todo o PORTC como saídas
    
    LATC.B1 = 1;		// Seta o bit 1 do PORTC
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por intuição, que tal PORTC.B1=1 ?

 

Obvio d+?. Então vamos tentar agregar algo não tão intuitivo e que serve pra virtualmente qualquer mc (acho que já disse isso hoje)
 

#define setbit(var,bitno) ((var) |= 1 << (bitno))
#define clrbit(var,bitno) ((var) &= ~(1 << (bitno)))
//...
setbit(PORTC,1);
//...
clrbit(PORTC.1);

abç

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Grato Isadora, eu já havia tentado isso e não funcionou também. Essa família de PICs tem um registrador PORTC para INPUTs e outro registrador LATC para OUTPUTs, conforme indicação do datasheet. 

    latc.png

    adicionado 10 minutos depois

     

    Acabei de descobrir o problema. A configuração "SOSC Power Selection Mode" estava em "High Power SOSC circuit selected" e deveria estar em "Digital (SCLKI) mode". Essa alteração fez com que "LATC.B1 = 1" funcionasse. Ainda não sei quais as implicações dessa mudança...

    Obrigado!

    Editado por wBB

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    legal mano! Não sabia disso que o pic tinha evoluído. Como você pareceu legal vamos tentar agregar algo como inverter um bit numa variável:

    #define xorbit(var,bitno) ((var) ^= 1 << (bitno))

    Neste caso, percebamos que tal "evolução" não foi nada boa pois não deve funcionar se direto no port, afinal IN e OUT são variáveis de periféricos diferentes, portanto endereços diferentes

    xorbit(PORTC,1); // não deve funcionar

    Deve funcionar só em variável da ram mesmo. Pena. Vai dificultar algum pisca led (sou phd nele).

    E qual a vantagem disso? Além de funcionar em qualquer mc, também funciona em qualquer compilador. Altas migrações.

    Mas enfim, há alternativas.

     

    1 hora atrás, wBB disse:

    Ainda não sei quais as implicações dessa mudança...

    Tamo junto

    abç

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Neste link abaixo foi onde encontrei até agora a única explicação para essa alteração da família 16F para a 18F, em relação a existência desses dois registradores de inputs e outputs separados nos PORTx da família 18F (anexei um PDF da página tb para documentar aqui no forum). 

    https://download.mikroe.com/documents/compilers/mikroc/pic/help/rmw.htm

     

     

    Read_Write_18FXX Family.pdf

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    1 hora atrás, wBB disse:

    alteração da família 16F para a 18F

    ahh (não vi o pdf ainda)... Pensei esta mudança que era exclusiva pro 18f66k80. Então, o seguinte.. pode ser questão de compilador. Pois já cuspi bits e engoli (ieca) com sucesso prum 18f252. P.ex..

    PORTC=0x55;
    status=PORTB;
    RC1=1;
    RC2^=1;
    botao0=RA0;
    //etc...

    ...de boa. Nem dei bola pra esse tal de latc

    Compilador hitech-c

     

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Realmente existem diferenças na interpretação de código em um ou outro ambiente. Por exemplo, se você usar o registrador PORTC para setar ou resetar um bit no MPLab, vai funcionar tal como você sugeriu. Já no MikroC, que é o que estou usando, o datasheet é interpretado de forma mais rígida. Dessa forma, o MikroC não vai dar um "jeitinho" para fazer as coisas funcionarem caso deixemos de seguir o datasheet a risca. 

    Pelo menos entendo que é isso que ocorre (baseado em minha pouca experiência).

     

    valeu!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Tá válido. No entanto penso que é só questão de ponto de vista. Compiladores seguem o ds a risca sim muito + o mplab que é  ´filho da mãe´ dos mc's em questão. O mikroc é ótimo pra quem ta aprendendo pois mostra direitinho a localização do bit no registro. Mas em algum momento da evolução isso pode não ser totalmente necessário o que   dificultar alguma eventual migração. Um caminho do meio é usar as diretivas #if def #endif e afins mas isso está fugindo ao controle do tema...

    Bits escovados? kk

    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

    ×