PONTEIRO C.

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor fabim » 24 Out 2008 07:58

Bom dia camarradas..
Então,,,
Realmente eu fiz o seguinte.
*.C = funções e procedimentos..
*.H = var´s e contantes do sistema..

Fiz um teste rapidinho.
MikroC, C18, hiteck.

Todos compilaram belezinha, roconheceram a sintaxi sem problema e sem erro desta forma que eu fiz.

Eu organizei direitinho..

meu o que esta me intrigando agora, que esta havendo um erro que não vem ao caso agora..

Tem uma parte do fonte onde tem os procedimentos no fonte em pascal.

O Dany simplesmente colocou à cima de algumas variaveis o seguinte comando.

Const XXXXXXX : ^byte;

Que em C seria o mesmo que;

Unsigned char const *XXXXXXXX;

XXXXXXX = nome da const..<<

Eu abri o asm pra dar uma olhada, e vi que isto esta criando uma alocação na ram, e ele esta usando como ponteiro, mais não ví lógica nisso...

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 Sergio38br » 24 Out 2008 08:28

Dei uma olhada no codigo do dany, no MikroP o projeto compilou sem nenhum warming??

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

Mensagempor fabim » 24 Out 2008 08:33

meu aquilo não são erros.
São avisos de conversão implicita.
Tipo.
Você coloca uma int dentro de um byte.
Observe que o valor que estava na int é menor que 255, ou seja cabe dentro do byte.
Mesmo assim é uma conversão implicita.
Você converteu um tipo de variavel para outra..

Nos compiladores mikroE, todos !!
Você pode desconsiderar isto.. Ele esta apenas de avisando..

Sobre a liby, acho que no máximo até amanhã eu ja acabo tudo..

estou acertando algumas coisas, tirando alguns gatos.
E acertando algumas lógicas que ele usou.
Tipo, o buffer para EP.
Ao invés dele utilizar a escrita e leitura direta dos buffer´s, ele criou os buffer´s e os arrays de escrita e leitura.
Quando ele manda escrever.
Pega_meu_buffer, Joga para, Buffer_EPI

São algumas perdas de tempo desnecessarias, é aquela mania sabe.
Á eu tenho um uC com 24K livre, toném aí..
Vou socar funções pra todo lado e que se fodra..

Né assim não, os manos, esquecem que isto exerce peso na perda de tempo de processamento..

Desta forma, eu estou enxugando varias coisas desnecessarias.

Mais o grossão funcional, eu acabando ja disponibilizo pro pessoar daqui.

Vai servir para.

18F2455,4455,2550,4550

Para os outros, basta reindereçar algum sfr..

Fabim

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 Sergio38br » 24 Out 2008 08:56

Acho que não fiz entender.... sobre tua pergunta aquela const, aparece algum warning??

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

Mensagempor fabim » 24 Out 2008 09:12

Sergio38br escreveu:Dei uma olhada no codigo do dany, no MikroP o projeto compilou sem nenhum warming??

{ ]'s
Sergio


hehe, cabecinha...rs
olha só o que você escreveu...rsrs

Sim compila sem pau, meu problema é que a logica usada para aquela:.
Const XXXXXXX : ^byte.
Esta pegando algum dado errado, pelo seu endereço..
Sei la que porqueira é esta.

Vou socar um display, e ficar vendo o que esta havendo dentro do menino,,

abraços

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 fabim » 26 Out 2008 13:14

todos os paus das funções e procedimentos foram sanados...

Estou agora tentando entender sobre a definição volatile...

No pascal.
Digo que PORTB EX:

CONST
PORTB : BYTE; absolute 0x0005 ; volatile.

Ou seja dei um nome para o endereço 0x0005 e avisei o compilador que é um SFR volatil..

Como ficaria isto no 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 msamsoniuk » 26 Out 2008 13:44

volatile eh um atributo das variaveis indicando que o compilador nao deve otimizar essa variavel como registro. isso eh particulamente importante no caso de processadores com IO mapeado em memoria como 68xx e 68xxx. por exemplo:

Código: Selecionar todos
int *port_a = endereco_port_a;

pisca_led()
{
  porta_a = 0;
  while(1) *porta_a ^= 1;
}


nao vai piscar o pino 0 da porta a em um compilador otimizado pq ele vai mover 0 para um registro e ficar fazendo o xor apenas no registro. ele espera mover para o endereco no fim do while, para otimizar, mas isso nunca acontece...

para resolver isso, coloca-se um volatile:

Código: Selecionar todos
volatile int *port_a = endereco_port_a;

pisca_led()
{
  porta_a = 0;
  while(1) *porta_a ^= 1;
}


assim apos cada operacao a variavel na memoria eh atualizada. isso tambem eh particularmente importante no caso de semaforos e spinlocks, onde multiplas threads se sincronizam atraves de uma variavel na memoria e ela tem que ter atributo volatile para garantir a atualizacao instantanea.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor fabim » 26 Out 2008 16:19

tudo bem, tchelo.?!
Então manito, isso aí eu ja tinha entendido..

Meu problema é como definir isto.

Peguei um exemplo que o jean me passou, mais o mikroC não esta entendendo.
Defini desta forma ó...

unsigned int register volatile
BDEP0OUTStat absolute 0x0400;

peguei o exemplo no .def dos pic´s que tem na pasta def´s do mikroC.
Mais o compilador esta me dizendo isso aqui ó

numero da mensagem de erro = 11
mensagem. ";" expected but volatile found
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 » 26 Out 2008 18:46

acho que uma variavel nao pode ao mesmo tempo ser "register" e "volatile"! :)

fabim escreveu:tudo bem, tchelo.?!
Então manito, isso aí eu ja tinha entendido..

Meu problema é como definir isto.

Peguei um exemplo que o jean me passou, mais o mikroC não esta entendendo.
Defini desta forma ó...

unsigned int register volatile
BDEP0OUTStat absolute 0x0400;

peguei o exemplo no .def dos pic´s que tem na pasta def´s do mikroC.
Mais o compilador esta me dizendo isso aqui ó

numero da mensagem de erro = 11
mensagem. ";" expected but volatile found
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor fabim » 26 Out 2008 19:13

então velhinho..
Olha um exemplo de como funciona a definição no mikroC, esta diretiva eu peguei do def P18F4550.C..
Look....

Código: Selecionar todos
 unsigned short register volatile
  ADCON0       absolute 0x0FC2;
unsigned short register
  ADCON1       absolute 0x0FC1,
  ADCON2       absolute 0x0FC0;
unsigned short register volatile
  ADRES      absolute 0x0FC3;
unsigned short register volatile
  ADRESH       absolute 0x0FC4;
unsigned short register volatile
  ADRESL       absolute 0x0FC3;
unsigned short register
  BAUDCON      absolute 0x0FB8,
  BSR      absolute 0x0FE0,
  CCP1AS       absolute 0x0FB6;


Viu só..??

no fonte do mikropascal as diretivas que eu preciso saber como vão ficar em C, são estes.

Código: Selecionar todos
var
    BDEP0OUTStat : byte; absolute $400; volatile;
    BDEP0OUTCnt  : byte; absolute $401; volatile;
    BDEP0OUTAdr  : word; absolute $402; volatile;

    BDEP0INStat  : byte; absolute $404; volatile;
    BDEP0INCnt   : byte; absolute $405; volatile;
    BDEP0INAdr   : word; absolute $406; volatile;

    BDEP1OUTStat : byte; absolute $408; volatile;
    BDEP1OUTCnt  : byte; absolute $409; volatile;
    BDEP1OUTAdr  : word; absolute $40A; volatile;

    BDEP1INStat  : byte; absolute $40C; volatile;
    BDEP1INCnt   : byte; absolute $40D; volatile;
    BDEP1INAdr   : word; absolute $40E; volatile;


ó dia, ó noite, ó azar, eu sabia que isto não ia dar certo...
né não LIPE...
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 » 26 Out 2008 22:57

entao, pense bem sobre o que eu falei ali em cima: uma variavel com atributo register diz ao compilador que vc quer ela em um registro interno e nao na memoria; uma variavel com atributo volatile diz ao compilador que vc quer ela na memoria e nao em um registro.

acho que isso permite concluir que register e volatile sao coisas divergentes...

outro detalhe: hoje em dia a maioria dos compiladores otimiza automaticamente variaveis para register sem vc pedir, copiando da stack apenas os parametros na entrada da funcao e devolvendo para a stack apenas o parametro de retorno. isso torna o atributo register totalmente obsoleto, na minha opiniao, mas isso obviamente nao eh muito legal no caso de IO mapeado em memoria, por isso surgiu o atributo volatile.

portanto, teste descartar o atributo register e deixe apenas volatile.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor fabim » 27 Out 2008 07:01

hum, tendi...
Mais tchelo, como ficaria em C apenas passando como volatile.??
Tudo que eu faço da errado...
erro, erro missing";', erro de lógica incorreta etc etc etc
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 fabim » 27 Out 2008 14:15

volatile . risorvidos...

mais olha agora que saco.
Lembra lá atras sobre definição de tipos..

então..
tem uma parte do fonte que é assim.

typedef struct TBufferDescriptor{ // definí um tipo
unsigned short Status;
unsigned short ByteCount;
unsigned int Address;
};
struct TBufferDescriptor BufferDescriptor; // liguei bufferdes ao Tbuffe

ou seja, o bufferdescriptor tem dois short´s e um int.

Em uma parte do programa ele precisa pegar o endereço do bufferdescriptor e colocar no endereçador de um ponteiro para poder copiar as informações dos 4 bytes para outro lugar..

Esta desta forma.

if (Src != 0){ // copy endpoint descriptor
Dst = &BufferDescriptor;
//pega endereço da var bufferDescriptor e coloca no apontador
//
for (I = 0 ; I = (sizeof(BufferDescriptor) - 1); I++){
*Dst = *Src; // copia dados = 4 bytes
Dst++;
Src++;
}
}


estou meio perdidão agóra,..

O erro que aponta para linha, Dst = &BufferDescriptor;
É.!
illegal pointer conversion:[?T67] to [DST].
MEssage number, 11..

Alguém entendeu ?
Pelo que percebi, ele esta tentando mover letra e numero para o DST ?

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 fabim » 27 Out 2008 14:53

dxeu colocar a rotina inteira para que possam entender.

aqui eu preciso definir uma estrutura do tipo
TBufferDescriptor

e depois linkar com a variavel própriamente dita
BufferDescriptor

Observem que na rotina, ele precisa pegar o endereço do BufferDescriptor, que na verdade é uma estrutura.
Ou seja, ele vai pegar o endereço de alocação na ram do primeito byte, epois vai mover estes dados para outra variavel..





Código: Selecionar todos
void CopyBufferDescriptor(void){
unsigned short *Src, *Dst;
unsigned short Tmp, I;

  Src = 0;

  Tmp = ((USTATCopy >> 2) & 0x1F); // get Endpoint and direction
  switch (Tmp){
  case  0: // EP0 OUT
       Src = &BDEP0OUTStat;
  break;
  case  1: // EP0 IN
       Src = &BDEP0INStat;
  break;
  case  2: // EP1 OUT
       Src = &BDEP1OUTStat;
  break;
  case  3: // EP1 IN
       Src = &BDEP1INStat;
  break;
  }

  if (Src != 0){  // copy endpoint descriptor
    Dst = &BufferDescriptor;

    for (I = 0 ; I = (sizeof(BufferDescriptor) - 1)); I++){
      *Dst = *Src;
      Dst++;
      Src++;
    }
  }
}
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 barboza » 27 Out 2008 16:23

é pq Dst é um ponteiro para o tipo unsigned short e não do mesmo tipo da estrutura.

Tente declarar assim:

struct TBufferDescriptor *Dst, &Src;
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

AnteriorPróximo

Voltar para PIC

Quem está online

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

x