PONTEIRO C.

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor msamsoniuk » 18 Out 2008 21:13

nao apenas mais legivel, mas tambem garante consitencia e facilita as alteracoes futuras!

no caso de constantes cujo valor numerico nao eh importante, a unica forma de garantir que ela vai ter o mesmo valor em todos os sub-sistemas eh usar um unico header com um unico enum definindo elas, daih vc tem uma consistencia que se mantem em todos os outros sub-sistemas a partir desta definicao principal.

jah no caso onde as constantes tem um valor importante, como um endereco de IO, se vc trocar de mcu e o endereco mudar para outro valor, vc tem apenas que mudar o define em um header e automaticamente a alteracao vai se propagar para todos os outros pontos que usam este endereco.

isso permite tambem modularizar suas funcoes: vc cria por exemplo um modulo de controle de LCD e define os pinos em funcao de abstracoes de alto nivel, por exemplo:

#define LCD_RS PTA1
#define LCD_RW PTA2
#define LCD_EN PTA3

se vc mudar de mcu e tiver que mudar de pinos, sua funcao continua perfeita, bastante alterar o define.

assim vc escreve uma vez o codigo e reutiliza eternamente o mesmo codigo! :)

chipselect escreveu:se quiser enfeitar o código (alguns dizem que é pra deixar mais legível), dá pra fazer assim:

no arquivo header:
#define LOW 0
#define MEDIUM 1
#define HIGH 2

no código ficaria assim

switch (phase) {
case LOW: Lo(); break;
case MEDIUM: Mid(); break;
case HIGH: Hi(); break;
default: Message("Invalid state!");
}


também dá pra fazer assim:

typedef enum {LOW = 0, MEDIUM = 1, HIGH = 2} TPhase;


e no código ficaria praticamente igual, só que a flag phase seria declarada assim:

TPhase phase;

phase = LOW; //ou MEDIUM ou HIGH.

switch(phase)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor fabim » 18 Out 2008 21:30

celto celto.
mais tchelo, quer dizer que eu acertei então ?

Ta celtinho a forma que eu fiz ?

Fora o gato do ultimo switch !!

eim eim ?

Fabim

OBS... a liby só vai ter um header.
NEste header, vai ter apenas
nome das SRF´s e endereços..

as SFR´s utilizadas pela usb de todos os uControladores microchip, tem o mesmo nome até os PIC24,30,32, tudo o mesmo nome, e mesma forma de tratalos..

Por isso, universal microchip...

O dany esta acabando o host em pascal para os pic32, em C, to ajudando ele..

Fabim
Editado pela última vez por fabim em 18 Out 2008 21:33, em um total de 1 vez.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor msamsoniuk » 18 Out 2008 21:33

hehehe eu nao testei no compilador, mas parece que esta certo! :)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor fabim » 19 Out 2008 16:28

1° ponteiros, risorvidos..

2° definições de tipos, risorvidos..

3° função switch, risorvidos.

4° uso de ";" no C.

eu estou meio confuso sobre o uso desse camaradinha no fechamento da chave..

observe o codigo."ja traduzidio"

Código: Selecionar todos
 void USB_Interrupt(void){
  unsigned char Tmp;

  Tmp = (UIR & UIE); // get the enabled interrupts
  while (Tmp > 0x00){

    if (Tmp.TRNIF   == 0x01) {TokenDone();}
    if (Tmp.URSTIF  == 0x01) { UsbReset();}
    if (Tmp.STALLIF == 0x01) { UsbStall();}
 // if (Tmp.UERRIF  == 0x01) {  UsbError()}//erro de pacote
    if (Tmp.IDLEIF  == 0x01) { UsbSleep();}
    if (Tmp.ACTVIF  == 0x01) { UsbActive();}
    Tmp := UIR and UIE; // pega as int ativas
  }
 
  UIR = 0;
  PIR2.USBIF = 0;
  }


mesmo sendo usado o if, no fechamento deste teste condicional "}"
não é usado o ";" ?

Quando ele deve ser usado ?

"""" pelo que pude observar, apenas em tabelas de constantes ou algo parecido como struct etc??

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor msamsoniuk » 19 Out 2008 21:15

eh mais ou menos isso... com o tempo vc pega o jeito hehehe
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor fabim » 20 Out 2008 11:38

1° ponteiros, risorvidos..

2° definições de tipos, risorvidos..

3° função switch, risorvidos.

4° uso de ";" no C, risorvidos.

5° uso do ++ no C.

Como este fonte que estou traduzindo é para mikropascal o camaradinha utilizou em varias partes libys do compilador, eu estou traduzindo para C ANSI, que foi o que eu aprendi.rsrs

Tipo.
switch ( hi(xxxx.yyyy)){

C ansi, que qualquer compilador entende.

Switch(xxxx.yyyy >> 8 ) {

Poderia ser tambem.

unsigned char besta.
besta = xxxx.yyyy >> 8;
switch(besta){

Testei das duas formas e funcionou..

uma coisa que me chamou a atenção e não consegui descobrir se todos os compiladores ANSI ou Não..

é o uso do incrementador ++.

tipo.
for (I=0 ; I = 30 ; I++){ // I++ = I + 1..
}

Se na minha lógica eu tiver um state que só incrementa I dentro da função dependendo de um fator..
o uso do
...
...
I++; // é permitido ? generico para compiladores C ?
ou tenho que fazer
I = I + 1; // para ser generico.

Pois observei que alguns compiladores não aceitam, inc(I); que é o mesmo que I++...

então.
posso utilizar o comando
I++;
assim sem estar em alguma função especifica ?

ou o comando
inc(I);
é reconhecido por todos os compiladores C ?

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor phophollety » 20 Out 2008 11:56

Opa Fabim..

Sim, é sim

i++; // é um comando universal em C, pode usar sem medo que tem que funfar

A mesma coisa que

i += 1;

//Que é a mesma coisa que

i = i + 1;

E assim por diante..

i--;

i -= 1;

i = i - 1;
"3 minutes of boring code review means 3 hours less fixing LSD (Little Stupid Detail)" Dr. Mike Smith
"Dê-me um ponto de apoio e uma alavanca e moverei o mundo" Arquimedes
"Quando vejo um Alfa Romeo passar eu tiro o meu chapéu" Henry FORD.
Avatar do usuário
phophollety
Dword
 
Mensagens: 1511
Registrado em: 15 Out 2006 13:00
Localização: Santo André São Paulo, Brasil

Mensagempor msamsoniuk » 20 Out 2008 12:20

diferentes compiladores tem diferentes facilidades atraves de macros. por exemplo, constantes tipo bit nao existem na linguagem C, mas podem ser criadas atraves de macros:

#define 0b00000000 0x00
#define 0b00000001 0x01
#define 0b00000010 0x02
...

da mesma forma que inc e dec *nao existem* na linguagem C, mas podem ser facilmente criados:

#define inc(X) X++
#define dec(X) X--

porem eh interessante saber separar o que eh um vicio de linguagem e o que nao eh. inc e dec, por exemplo, sao operadores que nao possuem muita logica no meu ponto de vista e nao passam de um vicio de linguagem introduzido por assemblers de processadores antigos.

acho que uma coisa altamente recomendavel seria vc procurar a segunda edicao do "C programming language" do kernighan e ritchie, os caras que inventaram a linguagem.

no livro vc percebe que C eh uma linguagem relativamente simples (poucas palavras reservadas) e muito flexivel (vc pode criar varias notacoes e construcoes novas ou alternativas), porem a maioria dos programadores adota o estilo usado no livro.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor phophollety » 20 Out 2008 12:23

Não entendi ao certo o que você chama de vícios mas, eu procuro usar o maior número de operadores possíveis por define, deixa o programa muito mais simples, talvez a primeiro olhar um pouco mais complicado, mas logo fica mais claro, fora a praticidade se houver necessidade de alguma alteração..

Realmente, faz sentido, pois minha primeira escola foi o ASM e depois o C mas, eu acho que é o caminho certo e natural
"3 minutes of boring code review means 3 hours less fixing LSD (Little Stupid Detail)" Dr. Mike Smith
"Dê-me um ponto de apoio e uma alavanca e moverei o mundo" Arquimedes
"Quando vejo um Alfa Romeo passar eu tiro o meu chapéu" Henry FORD.
Avatar do usuário
phophollety
Dword
 
Mensagens: 1511
Registrado em: 15 Out 2006 13:00
Localização: Santo André São Paulo, Brasil

Mensagempor msamsoniuk » 20 Out 2008 17:51

eh um vicio no sentido que a gente aprende uma linguagem nova e tenta manter a mesma notacao da linguagem antiga.

alguns exemplos tipicos:

#define begin {
#define end }
#define inc(x) x++
#define dec(x) x--

e por aih vai...

isso confunde particularmente os novatos, pois eles ainda nao sabem ainda diferenciar o que eh e o que nao eh parte da linguagem, o que eh uma biblioteca e o que eh apenas uma macro.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor fabim » 20 Out 2008 18:17

manos, o dany montou uma lógica aqui em pascal.
Que eu não tenho idéia do que ele fez, e como o mikropascal aceitou isso..

affemaria...rs

em C seria mais ou menos isto.

switch (xx){

switch (xx){}
switch (xx){}
switch (xx){


switch (xx){


defalt( blabla)
}

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Djalma Toledo Rodrigues » 20 Out 2008 18:29

fabim escreveu:....I++; // é permitido ? generico para compiladores C ?
ou tenho que fazer I = I + 1; // para ser generico.
Fabim


I ++ ; // Que 'genérico' é mais baratim... :D :D :D
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor fabim » 22 Out 2008 10:05

1° ponteiros, risorvidos..

2° definições de tipos, risorvidos..

3° função switch, risorvidos.

4° uso de ";" no C, risorvidos.

5° uso do ++ no C. risorvidos

6° tratamento de boolean no C.

Eu tenho varios programas em pascal que eu utilizava a diretiva boolean.

Tipo.

Var A : boolean;

A := true;


IF a=true then

else

end;

O pascal só entende um bool como true or false se .
true = 0xFF;
false = 0x00;

Se voce colocar bool como 0X0F, o teste retorna falso.
ou seja , qualquer valor entre 0x00 e 0xFE o pascal sabe que é falso,
se 0XFF aí sim é true..

Como é tratado com um exemplo pratico, os valores booleanos em funções de teste IF e while ..


Tks
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Sergio38br » 22 Out 2008 10:58

Código: Selecionar todos
if (<expression>)
    <statement1>
else
    <statement2>

"In the if statement, if the <expression> in parentheses is nonzero (true), control passes to <statement1>.
If the else clause is present and the <expression> is zero (false), control will pass to <statement2>.
The "else <statement2> part is optional, and if absent, a false <expression> will simply result in skipping over the <statement1>. An else always matches the nearest previous unmatched if; braces may be used to override this when necessary, or for clarity."

fonte :

http://en.wikipedia.org/wiki/C_syntax#S ... statements

Como o C é maleavel vc pode definir caso queira dois bool ( mTRUE e mFALSE)

# define mTRUE 0xFF
#define mFALSE 0x00


[ ]'s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor msamsoniuk » 22 Out 2008 11:02

em C nao existem variaveis tipo boolean, ao inves dissovc pode usar qq inteiro para expressar a validade das condicoes, sendo o zero falso e o resto verdadeiro, de modo que:

Código: Selecionar todos
if(valor)
{
  verdadeiro
}


vc pode pensar dessa forma tambem para while:

Código: Selecionar todos
while(count--)
{
  verdadeiro
}


bem melhor que pascal nehj ? mas no caso do for, tambem vale o mesmo:

Código: Selecionar todos
for(valor = 99; valor; valor--)
{
  verdadeiro
}


soh que normalmente essa notacao para o for nao eh boa! entao usa-se uma notacao com um operador condicional:

Código: Selecionar todos
for(valor = 0; valor != 100; valor++)
{
   verdadeiro que valor diferente de 100
}


isso funciona pq o operador condicional retorna 1 se a condicao for verdadeira e 0 se a condicao for falsa.

em resumo, eh levemente diferente de pascal: apenas zero realmente eh falso, o resto eh tudo verdadeiro. e isso vale de forma consistente para operandos inteiros de 1 a n bits, inclusive ponteiros!

um exemplo simples de condicional com um ponteiro:

Código: Selecionar todos
int main(int argc, char **argv)
{
  for(argc=0 ; argv[argc] ; argc++)
  {
    printf("parametro %d: %s\n", argc, argv[argc]);
  }
}


ele testa argv[argc] e soh para quando for zero.

ah sim! e nunca defina TRUE como 0xff como em pascal. se vc passar um zero em um operador not (!), ele se torna 1, nao 0xff. portanto o mais correto seria:

Código: Selecionar todos
#define FALSE 0
#define TRUE 1


mas criar defines para valores obvios nao eh muito recomendavel... pq vc escreveria:

Código: Selecionar todos
if(valor == TRUE)
{
  verdadeiro
}


se vc pode escrever:

Código: Selecionar todos
if(valor)
{
  verdadeiro
}


fabim escreveu:1° ponteiros, risorvidos..

2° definições de tipos, risorvidos..

3° função switch, risorvidos.

4° uso de ";" no C, risorvidos.

5° uso do ++ no C. risorvidos

6° tratamento de boolean no C.

Eu tenho varios programas em pascal que eu utilizava a diretiva boolean.

Tipo.

Var A : boolean;

A := true;


IF a=true then

else

end;

O pascal só entende um bool como true or false se .
true = 0xFF;
false = 0x00;

Se voce colocar bool como 0X0F, o teste retorna falso.
ou seja , qualquer valor entre 0x00 e 0xFE o pascal sabe que é falso,
se 0XFF aí sim é true..

Como é tratado com um exemplo pratico, os valores booleanos em funções de teste IF e while ..


Tks
Editado pela última vez por msamsoniuk em 22 Out 2008 11:53, em um total de 1 vez.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

AnteriorPróximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

x