Página 1 de 1

UMA DÚVDA DE AMADOR EM "C"

MensagemEnviado: 19 Dez 2016 14:14
por Vonnilmam
Pessoal, como vocês fazem para criar um loop para a verificação de um port no PIC, usando o mikroc,

Em asm eu faria assim:

asm code
; ' essa rotina de exemplo pega o valor do PORTB, carrega numa variavel temporária (variavel_portb), depois faz a comparação com outra variavel que será um espelho
; de bkp, ela garante (temp_portb) que só irá passar um dado, quando o port b mudar de estado, é tipo um filtro'.

ver_port:
; "PUXA CONSTANTEMENTE PORTB PARA A VARIÁVEL "
movf portb, w
movwf variavel_portb

; " VERIFICA SE HOUVE ALTERAÇÃO NO PORTB"

movf variavel_portb, w
subwf temp_portb, w
btfsc status, z
goto ver_port ; looping, só sai dele quando portb for alterada.
movf variavel_portb, w
movwf temp_portb
; ....executa outras coisas


Como se faz isso em "C"...
obrigado

Re: UMA DÚVDA DE AMADOR EM "C"

MensagemEnviado: 19 Dez 2016 15:17
por andre_luis
Não seria algo do tipo ?
( não foi testado... )

cpp code
// dentro da função init()
int8 iValorAtual = PORTB ;
int8 iValorAnterior = iValorAtual ;

// dentro do loop main()
iValorAtual = PORTB ;
if ( iValorAtual == iValorAnterior )
{
faz_isso() ;
}
else
{
faz_aquilo() ;
}
iValorAnterior = iValorAtual ;

Re: UMA DÚVDA DE AMADOR EM "C"

MensagemEnviado: 19 Dez 2016 20:47
por Vonnilmam
Então andré, eu cheguei a uma conclusão parecida com sua sugestão!

Só queria saber se é usual utilizar esse conceito, veja abaixo:

"essa rotina faz a leitura do portB, compara o resultado anterior com o resultado atual contido no portB, caso sejam iguais não entra na rotina de execução, simplesmente volta para o looping, "olhando" para o portB. Caso os dados sejam diferente "portB e Variavel", aí executa a rotina de tratamento de posicionamento do LCD em questão. Através do SWITCH CASE, eu consigo delimitar posições no LCD, para criar vários pontos de ação, e cada ponto de ação pode ter até 256 posições diferentes e se notarem, estou utilizando apenas um porte (portB) 8 bits para controlar várias posições no LCD (nessa rotina estou apenas utilizando duas posições). O protocolo ficou assim: Envia-se primeiro o byte de controle e depois logo em seguida envia-se o byte de dados, simples e funcional, detalhe, não precisa de de tempo entre controle e dado, o programinha faz essa diferenciação pela mudança de estado no portB...

Quem desejar pode utilizar essa rotina livremente:

Obrigado.

cpp code
// ---------------------------------------------
// LOOPING PRINCIPAL
// ---------------------------------------------
while(1)
// ESSA ROTINA FICA COMPARANDO O BUS DATA E CASO OS DADOS SEJAM IGUAIS
// NÃO EXECUTA NADA, PORÉM SE ALTERAR, EXECUTA AS ROTINAS SEGUINTES.
{

loop_busdata:
#include "leit_port_bus.h"// faz a leitura do bus de dados externo.
compare = datain; // datain é a variavel que recebe o port B
if (compare == temp)
{
}
else
{

if (compare == 255)
{
sel_bpm = 1; // seleciona a columa BPM no lcd
goto loop_busdata; // ponto do looping, é aqui minha dúvida, isso é correto?
}
else
{
temp = compare;
switch (sel_bpm)
{
case 1:
bpm = temp;
func_bpm(); // Essa função escreve no LCD a posição BPM (char bpm).
sel_bpm = 0;
break;
default:
tempadres_mem = temp * 16;
adres_mem = tempadres_mem;
#include "buffer_texto.h"
Lcd_Out(2,1, txt);
break;
}
}
}
temp = compare;
delay_ms(50);
}

Re: UMA DÚVDA DE AMADOR EM "C"

MensagemEnviado: 19 Dez 2016 21:07
por andre_luis
Como voce disse que está aprendendo C, aqui vao algumas sugestões:

1) A utilização de diretiva include no meio do programa nao é uma boa pratica, já que "esconde" dependencias externas (arquivos).
2) Também, a utilização da instrução goto, apesar de permitida na linguagem, não é uma boa pratica em programação estruturada, já que as camadas do programa passam a ter 'atalhos'.

Re: UMA DÚVDA DE AMADOR EM "C"

MensagemEnviado: 19 Dez 2016 22:08
por Vonnilmam
Sim, estou tentando aprender, por isso estou pedindo dicas de vocês que são veteranos.

Eu fico muito grato andré, pela dica, é justamente isso que eu estava querendo ouvir, ou seja, até que ponto algumas coisas são legais ou não utilizar.

No caso, vasculhando o manual da mikroc, ví a instrução GOTO, logo precisei dela dentro dessa rotina, pois não ví uma opção mais simples, já que precisava ficar fazendo um loop no PORTE...

Só para tirar a dúvida, quando o amigo diz, não ser legal utilizar o GOTO, quer dizer que é proibido, dá algum BUG em programas mais complexos? Ou apenas naõ é muito recomendado, porém é totalmente viável a utilização.

Respondendo a sua pergunta, SIM, estou me preparando para aprender C, e quero aprender a forma correta, pois tenho intenção de realizar rotinas mais complexas.

Hoje estou mexendo com os pics da vida, no caso o 18f4520, mas estou de olho nos cortex da STM e ARM, pois o projeto que pretendo desenvolver, ou melhor dizendo MIGRAR o atual feito em ASM, vai necessitar de VELOCIDADE de processamento e ví que esses ARMs além de velocidade tem alguns drivers interessantes e tudo por um preço muito animador...Um ST32F03, custa 4 reais na prateleira, enquanto um pic18 custa 20 conto...avi... :cry:

Re: UMA DÚVDA DE AMADOR EM "C"

MensagemEnviado: 20 Dez 2016 07:25
por andre_luis
quer dizer que é proibido, dá algum BUG em programas mais complexos? Ou apenas naõ é muito recomendado, porém é totalmente viável a utilização.


Exatamente, se voce quizer utilizar é um recurso disponivel da linguagem, entretanto pra alguém debugar um programa cheio de atalhos é um sacrifício. No seu caso, por estar tudo dentro da mesma função não é problema, mas ainda assim é uma pratica que se pensasse mais um pouco poderia fazer de uma forma diferente. Desse modo, se parte do seu código não estiver funcionando direito, voce mata apenas aquela seção substituindo por outra rotina, sem impactar no que está amarrado á ela com goto's.

Re: UMA DÚVDA DE AMADOR EM "C"

MensagemEnviado: 20 Dez 2016 07:41
por eletroinf
Tu pode ainda usar o MISRA C como referência.
Tem as versões mais antigas pela WEB:

caxapa.ru/thumbs/468328/misra-c-2004.pdf

https://pt.wikipedia.org/wiki/MISRA_C

A regra 14.4 diz "The goto statement shall not be used."

Re: UMA DÚVDA DE AMADOR EM "C"

MensagemEnviado: 20 Dez 2016 10:08
por Vonnilmam
Olá amigos,

Sim, eu entendi. Pelo que entendi, algumas coisas em C, podem ser utilizadas, porém com cautela, como é o caso do GOTO, o ideal é usar pouco, acredito que só em casos especificos, já no meu caso o usei apenas uma vez.

Acho que o mesmo se aplica a declarações, globais e locais.

Muito obrigado pelas dicas.

Re: UMA DÚVDA DE AMADOR EM "C"

MensagemEnviado: 20 Dez 2016 10:10
por Vonnilmam
Interessante esse material, eletroinf


Eu comprei um livro, enorme, chamado de a BIBLIA DO C.

faz tempo que o tenho guardado, será que ele é uma boa para ter de referencia.?

Obrigado,

Re: UMA DÚVDA DE AMADOR EM "C"

MensagemEnviado: 20 Dez 2016 10:22
por andre_luis
Vonnilmam escreveu:Pelo que entendi, algumas coisas em C, podem ser utilizadas, porém com cautela, como é o caso do GOTO,


Sim, e eu estendo em menor escala o raciocinio também para os ponteiros, sempre que puder não os utilizar, tipo: "Use por sua própria conta e risco"