UMA DÚVDA DE AMADOR EM "C"

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

UMA DÚVDA DE AMADOR EM "C"

Mensagempor Vonnilmam » 19 Dez 2016 14:14

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
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

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

Mensagempor andre_luis » 19 Dez 2016 15:17

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 ;
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

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

Mensagempor Vonnilmam » 19 Dez 2016 20:47

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);
}
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

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

Mensagempor andre_luis » 19 Dez 2016 21:07

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'.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

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

Mensagempor Vonnilmam » 19 Dez 2016 22:08

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:
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

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

Mensagempor andre_luis » 20 Dez 2016 07:25

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.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

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

Mensagempor eletroinf » 20 Dez 2016 07:41

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."
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

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

Mensagempor Vonnilmam » 20 Dez 2016 10:08

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.
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

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

Mensagempor Vonnilmam » 20 Dez 2016 10:10

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,
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

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

Mensagempor andre_luis » 20 Dez 2016 10:22

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"
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ


Voltar para PIC

Quem está online

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

cron

x