Ir ao conteúdo
  • Cadastre-se

PIC Configuração do PORTC em PIC


wBB

Posts recomendados

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
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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ç

Link para o comentário
Compartilhar em outros sites

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!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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ç

 

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
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

 

 

Link para o comentário
Compartilhar em outros sites

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!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...