Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
fabiano aladin

Como desligar interrupção através de um botão?

Recommended Posts

 Fiz um programa pra ligar e desligar usando o mesmo botão , consigo ligar , porém na hora de desligar não executa a tarefa, tentei de várias maneiras , desbilitando interrupção  ,usando swicht , dentro e fora da interrupção , fazendo funão fora e nada!

Tô enviando  o programa para ver se alguém consegue visualizar meu erro , e me corrigir!

 Agradeço a ajuda de todos , tenho esclarecido muitas dúvidas aqui no fórum.

 

desligabotao.txt

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usando um pouquinho de técnicas digitais, voce pode transformar seu sistema de botão numa maquinha de estados com duas sitações possiveis : Estado LIgado e Estado Desligado, a transição de um estado para o outro é feita no pressionamento do botao, veja;

 

#INCLUDE <16f628A.h>#FUSES NOWDT#FUSES XT#FUSES NOPUT#FUSES NOLVP#FUSES NOCPD#FUSES NOMCLR#FUSES PROTECT#USE DELAY(clock=4000000)#USE FAST_IO(#define ESTADO_LIGADO 0x01#define ESTADO_DESLIGADO 0x02/*************************Todos os contadores**********************************//******************************************************************************/int32 cont_1;int32 cont_2;int32 cont_3;INT32 CONT_4;int8  bEstado = DESLIGADO;/****************************interrupção******************************//******************************************************************************/#INT_TIMER1VOID frequencias(void)   {      set_timer1(65500-get_timer1());      cont_1++;      cont_2++;      cont_3++;   }VOID main(){      cont_1=0;      cont_2=0;      cont_3=0;      set_tris_b(0b00100000);      output_low(PIN_B3);      setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);      set_timer1(65500);      enable_interrupts(GLOBAL);      disable_interrupts(INT_TIMER1);      WHILE (true)      {           if(input(PIN_B5)==1)           {               //checa estado atual:               if(bEstado == ESTADO_LIGADO) bEstado = ESTADO_DESLIGADO;               else bEstado = ESTADO_LIGADO;           }           //nesse switch voce processa o estado:           switch(bEstado)           {               case ESTADO_LIGADO: //faz alguma coisa               break;                             case ESTADO_DESLIGADO: //faz outra coisa               break;               default: //trata valores errados               break;            }      }      }

Veja se compreendeu bem a ideia.

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@fabiano aladin e @

 

Só complementando a responta. Vi um detalhe pequeno no código:

 

Essa parte do código:

if(input(PIN_B5)==1)

Isso é redundante. Quando você faz um IF assim: 

if(input(PIN_B5))

Você já está perguntando se a entrada é 1 (nível alto).

!input(PIN_XX) --> Nível baixo
input(PIN_XX) --> Nível alto

 

Ou seja, nao precisa colocar == alguma coisa depois.

 

A função input:

 

value = input (pin)

 

Retorna:

 

0 (ou FALSE) se o pino está em nível baixo.

1 (ou TRUE) se o pino está em nível alto.

 

Exemplos:

 

while ( !input(PIN_B1) );// Espera B1 ir para nível alto if( input(PIN_A0) )   printf("A0 está em nível alto\r\n"); int16 i=PIN_B1;while(!i);//Espera B1 ir para nível alto

 

Falou

Editado por MatheusLPS

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Pessoal vou testar desse jeito , mas tentei fazer algo parecido antes mais não igual , e meu problema é que não desligava, a porta de saída continuava em nível 1 , alterava minha frequência de saída toda porém nada de desligar a porta , entrava só quando botão estava em 1, mas colocando ele em 0 continuava ligado.

     O código é exatamente esse , a interrupção somente para intervalo de tempo .Desse modo consigo cancelar a interrupção e desligar a porta?

    Obrigado pela ajuda.

    Editado por fabiano aladin

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @MatheusLPS,

    Porisso que eu nunca vou entender essa linguagem..... Tem muita maneira de se fazer a mesma coisa kkkk !

    Paulo

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @fabiano aladin

     

    Como vai você? Bão d+?? Vamos lá.....

     

    Sério que não entendi nada do que você disse no seu último post. Reformule sua dúvida por favor,. Sei que você me enviou uma MP assim:

     

     

     

    Matheus conseguir fazer a frequência de 1k depois de um segundo ela passa para 500hz , meu problema é que ligo através de um botão mas não consigo desligar , como vou ter que fazer mais frequências e todas selecionadas por botão ,como faço para desligar a interrupção e deixar a porta de sáida em zero?

    já tentei de tudo e nada funcionou!

     

    você está com dúvidas nesse post?: http://forum.clubedohardware.com.br/topic/1071464-c%C3%B3digo-para-gerar-frequ%C3%AAncia-de-um-1khz/

     

    Seria uma continuação do mesmo?

     

    Como disse, está meio confuso......

     

    @aphawk

     

    kakakaakaka

     

    Seguinte, essas dicas que citei são algo bem próprias do compilador...

     

    Para falar a verdade, eu teria que ver o ASM gerado para cada caso para ver como o compilador lida com essa redundância..... Ele ignora? Ele executa a redundância? Sei lá......

     

    Sei que ele compila nas duas situações e funciona os códigos....

     

    Falou

    Editado por MatheusLPS

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @Matheus_LPS,

    Vou desmistificar mais uma coisa pra voce:

     

     

    Só complementando a responta. Vi um detalhe pequeno no código:

     

    Essa parte do código:

    if(input(PIN_B5)==1)

     

    Não é reduntante, inclusive é mais seguro, do que depender o valor "true" assumido pela LibC do CCS, além disso, profissionalmente eu faria assim:

     

    if(1 == input(PIN_B5)

     

    Porque? Por ser ainda mais seguro, pois alem da constante estar explicita se eu por um acaso errar e escrever = em vez de == o programa vai me gerar um erro de compilação, o que não ocorre no caso contrario em que o codigo compilaria e eu so iria descobrir o problema na hroa de testar o codigo, ja imaginou se fosse o if de um ABS por exemplo?

    Ou seja a recomendação é use sempre a constante explicita, nao custa mais código,  e é sempre mais seguro.

     

     

     

     

    !input(PIN_XX) --> Nível baixo

    Isso é perigoso por exemplo, se o nivel de true ou false forem respectivamente 0xFF ou 0x00, não haverao problemas, agora se for o contrario, vale lembrar que o '!' funciona como negação, ira inverter o que não deveria ser invertido. Eu não arriscaria ficar na mão da LibC do CCS nem de compilador nenhum.

     

     

     

    Porisso que eu nunca vou entender essa linguagem..... Tem muita maneira de se fazer a mesma coisa kkkk !

    @aphawk, por isso que C/C++ (Python também) é padrão da industria e da comunidade open source e Basic não é, pois existem dezenas de formas de se fazer a mesma coisa e com qualidade...a criatividade do projetista é que manda.

    • Curtir 3

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @fabiano aladin

     

    Como vai você? Bão d+?? Vamos lá.....

     

    Sério que não entendi nada do que você disse no seu último post. Reformule sua dúvida por favor,. Sei que você me enviou uma MP assim:

     

     

     

     

    você está com dúvidas nesse post?: http://forum.clubedohardware.com.br/topic/1071464-c%C3%B3digo-para-gerar-frequ%C3%AAncia-de-um-1khz/

     

    Seria uma continuação do mesmo?

     

    Como disse, está meio confuso......

     

    @aphawk

     

    kakakaakaka

     

    Seguinte, essas dicas que citei são algo bem próprias do compilador...

     

    Para falar a verdade, eu teria que ver o ASM gerado para cada caso para ver como o compilador lida com essa redundância..... Ele ignora? Ele executa a redundância? Sei lá......

     

    Sei que ele compila nas duas situações e funciona os códigos....

     

    Falou

    Desda maneira também não funcionou , meu problema é fazer com que o mesmo botão que inicia , também desligue , o que está acontecendo é que não sai do loop da interrupção depois que o botão é ativado!

    Altera completamente minha saída mas sem desligar a porta!

    O post citado é meu , assim como o alterando amplitude , consegui resolver muita coisa já , mas não consigo desligar .

    Agradeço a ajuda de todos , estou aprendendo muita coisa , apesar das minhas dúvidas e dificuldades!

    ajuda.txt

    Editado por fabiano aladin

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @

     

    if(1 == input(PIN_B5)

     

    @aphawk, por isso que C/C++ (Python também) é padrão da industria e da comunidade open source e Basic não é, pois existem dezenas de formas de se fazer a mesma coisa e com qualidade...a criatividade do projetista é que manda.

     

    Claro, do jeito que está acima o comando, até eu entendo perfeitamente a função. O que reclamo é a falta de padronização existente nas diversas variações de se executar a mesma função.

     

    Mas discordo de voce no conceito de "padrão". O padrão não é o C , e sim o C Ansi. Ele sim é totalmente padronizado, sem "invenções" e sem "criatividade excessiva" . Os outros tipos de C não seguem as normas com a rigidez necessária. E talvez por causa dessa rigidez excessiva do ANSI C poucos estejam usando hoje, como voce mesmo viu nas escritas acima das "maneiras" de se escrever um comando para fazer a função que o programador tem em mente.

     

    Lembra do exemplo do código ASM que você escreveu prá mim para AVR ? 

     

    Mesmo sem eu ter programado uma vez na vida em ASM para os AVRs, eu olhei e entendí perfeitamente o que voce quis fazer no código. E achei tão fácil quanto programar em Basic. E , para mim, ambas as linguagens são MUITO mais fáceis do que programar nesses compiladores C ! 

     

    Quando olho um programa escrito em C, não consigo entender o que deve ser feito, porque infelizmente não existe uma só maneira de se fazer, foram criadas tantas "sintaxes" diferentes que fica muito complicado para um leigo entender. Talvez pela minha idade, mas até o momento eu vejo algo que me parece uma regra com bem poucas exceções : quem aprendeu primeiro ASM e usou bastante, tem muita dificuldade de entender como funciona o C. Mas tem muita facilidade para usar o Basic !

     

    É isso que eu quis dizer no comentário acima !

     

    Paulo

    Editado por aphawk
    • Curtir 2

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @aphawk

     

     

    Mas discordo de voce no conceito de "padrão". O padrão não é o C , e sim o C Ansi

    Então você vai concordar comigo de novo, hahahaha! Sempre que me refiro a C me refiro a norma padrão ANSI, no caso a mais atual revisão que é o C11.

    Veja entendo sua posição não de ser contra C, mas sim contra implementações "estranhas" de C, esse é o mesmo motivo pelo qual abomino o CCS e até mesmo o mikroC, possuem implementações a sua maneira, com tudo que interessa sendo abstraído do usuário...Nem mesmo do Arduino eu gosto nesse ponto embora o padrão C++ dele esteja muito bom.

     

     

     

     

    Quando olho um programa escrito em C, não consigo entender o que deve ser feito, porque infelizmente não existe uma só maneira de se fazer, foram criadas tantas "sintaxes" diferentes que fica muito complicado para um leigo entender. Talvez pela minha idade, mas até o momento eu vejo algo que me parece uma regra com bem poucas exceções : quem aprendeu primeiro ASM e usou bastante, tem muita dificuldade de entender como funciona o C.

    Aqui eu já discordo em partes, veja que os formas diferentes de fazer as coisas eu defendo no ponto de implementação do usuário, e é isso que torna a linguagem C tão poderosa, é o fato dela te dar certo controle da tua máquina, e possuir várias formas de resolver um mesmo problema, posso acessar vetores por exemplo atraves de ponteiros, ou usando indexação.... A parte de estruturas de dados muito desprezados até por quem nao deveria (leigos e entusiastas) é facilmente implementavel em C, inclusive tópicos de orientação a objeto, pra que apenas desenvolver programa procedural para resolver um problema se posso trabalhar com objetos mais próximos a minha linguagem natural humana, ou mesmo trabalhar em modo multitarefa...veja que uma lista de tarefas de um sistema operacional como o Linux por exemplo nada mais é que uma estrutura hyper básica conhecida por lista ligada, onde em C é simples de fazer e intuitiva... Diante de tanta coisa bem feita que já vi em C eu não consigo concordar que C é difícil ou mesmo complicado, acho que como toda e qualquer ferramente tem uma curva de aprendizado que pode ser maior ou menor em função de quem quer aprender.

    Veja que no caso do ASM, tambem tenho certeza que os comentarios (adequados) ao código te ajudaram e muito a compreender o que estava a fazer sem ler a instrução antes. Como toda e qualquer linguagem, codigo bem escrito, limpo e comentado na medida ajuda e muito na hora da manutenção e na hora de entregar seu projeto a um terceiro, mais um motivo pra discordar a dificuldade.

     

     

    Sobre a duvida do autor do tópico, fico com o Matheus, reformula a pergunta ai...hahaha.

    Abs.

     

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Reformulando a pergunta:

    Fiz um programa onde gero frequência de 1khz depois de 1 segundo ela vai para 500hz, usei contadores no timer 1 para isso , meu problema :

    Ao acionar um botão para ligar  uma porta de saída da feequência ela aparece , mas o grande problema que depois de ativada ela não desliga continua lá, fiz com botão ligado em 1.

    Inverti a lógica , passei a acionar a porta em zero e depois desligando em 1 , acontece que só ativa se começar em 0 , ou seja , o botão fica em zero ao ligar o proteus e uma vez desligada (nível 1) , a porta não liga novamente , ou seja , minha frequência é zero!

    Tentei de várias formas e nada resolveu.

    Pessoal não fiz a frequência usando pwm , porque tenho q fazer outras onde utilizarei o mesmo raciocínio e príncipio q usei para fazer a primeira.

    como conseguir q meu botão q liga a porta de saída desligue a mesma!

    E por favor o foco do tópico é para resolver esse problema e não discutir sobre qual linguagem é melhor.

    Agradeço a ajuda de todos!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @fabiano aladin

     

    Pelo que entendi, você quer apenas ligar e desligar esse sinal que você tem no pino B3, certo?

     

    Imagino que você não consegui fazer ainda por causa do set_tris_b ali em cima quando você coloca o botão tem que mudar os parâmetros.

     

    Ahhh, e acho que você deve ter montado o botão errado. Está usando resistores de pull-down ou pull-up? Se não usar, o proteus não interpreta corretamente.

     

    Usando a mesma ideia do colega @Felipe_Eletronic:

     

    Circuito quando inicia (0Hz):

     

    post-543152-0-20584000-1401031486_thumb.

     

    Circuito quando aperto o botão:

     

    post-543152-0-61873700-1401031476_thumb.

     

    Se apertar de novo, ele desliga.

     

    Código:

    #INCLUDE <16F628A.h>#FUSES NOWDT#FUSES XT#FUSES NOPUT#FUSES NOPROTECT#FUSES NOLVP                   #FUSES NOCPD#FUSES NOMCLR  #use delay(clock=4000000) #use fast_io(  #define ESTADO_LIGADO      0x01#define ESTADO_DESLIGADO   0x02 int8  bEstado = ESTADO_DESLIGADO; #int_TIMER1 void freqch_5(void){   set_timer1(65036);              output_toggle(PIN_B3);         }   void main(){   set_tris_b(0b10000000);   output_low(PIN_B3);    setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);      set_timer1 (65036);                           disable_interrupts(INT_TIMER1);                  enable_interrupts(global);           while(1)   {      if(1 == input(PIN_B7))      {         //checa estado atual:         if(bEstado == ESTADO_LIGADO)         {            bEstado = ESTADO_DESLIGADO;         }         else          {            bEstado = ESTADO_LIGADO;         }         do {}         while (1 == input(PIN_B7));      }            //nesse switch voce processa o estado:      switch(bEstado)      {         case ESTADO_LIGADO: //faz alguma coisa         {            enable_interrupts(INT_TIMER1);                        break;          }                  case ESTADO_DESLIGADO: //faz outra coisa         {            disable_interrupts(INT_TIMER1);              break;         }                    default: //trata valores errados         {                        break;         }        }   }}
    Editado por MatheusLPS
    • Curtir 2

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @MatheusLPS,

    Tenho certeza que voce escreveu esse código pensando no que eu falei acima, não foi ?????

    Esse eu entendí direitnho !!!!! Nenhuma abstração, nenhuma maneira misteriosa kkkkkkkkk !!!

    Obrigado hehehhe !

    Paulo

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    O problema é que os compiladores C para micros são adaptações da linguagem C e muitas pessoa tentam programar um micro como se estivesse programando num PC :D

    Para microcontroladores o melhor sempre será o compilador do fabricante.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @fabiano aladin

     

     

     

    E por favor o foco do tópico é para resolver esse problema e não discutir sobre qual linguagem é melhor.

     

    Esqueci de comentar isso na minha última resposta.

     

    Seguinte, eu percebi mesmo que ultimamente temos desviado o assunto de vários tópicos. Mas é algo tão natural quando ocorre e dinâmico que fica difícil evitar.

     

    O bom que sempre tem muitas informações interessantes surgindo.

     

    @aphawk

     

    Não sou um exímio programador. Me viro bem... mas gosto tanto de C quanto suas variações. Não muda muita coisa na minha opinião. 

     

    você que já programa em BASIC, eu imaginava que seria fácil migrar para qualquer outra. Eu estou acostumado a programar em uC e para windows (bem básico via C#). Mas me arrisco no VBA para excel. Acho complicado só a sintaxe que muda aqui e ali... Mas é uma questão de uso. Uma vez que aprende uma, sabe as outras. Só treinar.....

     

    EDIT:

     

    @vtrx

     

    Sei não, vi no site da Michochip o pessoal reclamando muito dos novos compiladores dela.

     

     

    Falou

    Editado por MatheusLPS

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

     

    Sei não, vi no site da Michochip o pessoal reclamando muito dos novos compiladores dela.

    É porque a Microchip lançou um compilador universal,mas não seja ingênuo,só o fabricante tem todas as informações de seus produtos e de seu Hardware,voce mesmo sabe que USB HOST no CCS demorou seculos,se é que tem,e que a Microchip tem seus exemplos desde que lançaram o PIC com USB HOST.

     

    PS:Voltando,acho que assim também funciona;

    #INCLUDE <16f628A.h>#FUSES NOWDT#FUSES XT#FUSES NOPUT#FUSES NOLVP#FUSES NOCPD#FUSES NOMCLR#FUSES PROTECT#USE DELAY(clock=4000000)#USE FAST_IO(#define boolean short int#define false 0#define true 1/*************************Todos os contadores**********************************//******************************************************************************/int32 cont_1;int32 cont_2;int32 cont_3;INT32 CONT_4;boolean ON_OFF = false;/****************************interrupção******************************//******************************************************************************/#INT_TIMER1VOID frequencias(void)   {      set_timer1(65500-get_timer1());      //FUNÇÂO      cont_1++;      cont_2++;      cont_3++;      }VOID main()   {      cont_1=0;      cont_2=0;      cont_3=0;      set_tris_b(0b00100000);      output_low(PIN_B3);      setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);      set_timer1(65500);      enable_interrupts(GLOBAL);      disable_interrupts(INT_TIMER1);      WHILE (true)         {          if(input(PIN_B5)==1){ON_OFF = true;}else{ON_OFF = false;}          if(ON_OFF){enable_interrupts(INT_TIMER1);}else{disable_interrupts(int_timer1);}         }   }

    Seguindo as regras do CCS,o código acima deve funcionar (este é para voce @aphawk) :rolleyes:

    Editado por vtrx

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @vtrx

     

     

     

    Para microcontroladores o melhor sempre será o compilador do fabricante.

     

    Pegue a rotina de divisão gerada pelo IAR ou pelo Keil para PIC e compare com a gerada pelo C30, ou melhor pegue a mesma rotina de divisão gerada por um desses caras e a mesma gerada pelo code warrior, code composer studio para processadores ARM por exemplo e veja o quao são bizarros, veja o c[odigo bonito gerado por projetos baseados nos projeto LLVM. Esse negócio de o fabricante faz melhor nem sempre é verdade, uma boa industra de semicondutores pode não ser boa em algoritmos, analise léxica e sintaxe na hora de desenhar um compilador ;)

     

     

     

    O problema é que os compiladores C para micros são adaptações da linguagem C

    Outra frase feita, veja que existem soluções baseadas em GCC ou no projeto LLVM, ambos seguem a terceira revisão do padrão ANSI que é o C11, para a maioria dos núcleos, sejam eles 8 ou 32bits são justamente a a ferramenta adotada por fabricantes de chip, além disso as próprias ferrametas ja possuem checagem de código  para verificar se além do padrão você codifica de forma limpa e segura segundo regras como o MISRA-C...então generalizar dizendo que compiladores são adaptações da linguagem C é no mínimo estar por fora do que está sendo feito. O grande e maior problema desses compiladores são na fase de desenvolvimento que é prover a LibC e a STD (alem da STL para C++) bem implementadas e otimizadas para o núcleo para seguir a revisão corrente da norma ANSI.

    Exemplo, tente fazer um strncpy, um memset, ou mesmo um memcpy usando a LibC em um micro, e tente escrever na mão e verá o trabalho que tera para obter desempenho similar. Fato não digo que não existam adaptações como o CCS e o MIkroC, fato elas existem nao respeitam a norma ANSI, mas daí dizer que todas as ferramentas para desenvolvimento embedded são assim também não da... :) 

     

     

     

     

    Sei não, vi no site da Michochip o pessoal reclamando muito dos novos compiladores dela.

    Realmente o xC tem alguns erros nojentos! ja vi coisas grotescas que fazem ele parecer o CCS, simplesmente nao oferecia suporte a ponteros de função (no PIC24!) . Mas isso é como disse antes, fase de desenvolvimento o xC ainda não está maduro, fora que deve-se lembrar que ele é uma gambiarra entre o Hitech e o C30/C18. Em compensação eu adorei o desempenho do C32, ja programei em núcleos MIPS e sempre vi o GCC trabalhara muito bem na hora de gerar o código final (embora eu prefira fazer algumas coisas em assembly), mas com o MIPS do PIC32 junto com xc32  a coisa ficou legal, implementei um filtro digital FIR de 16 posições e ele fez um codigo limpo e enxuto de 6 linhas. 

     

     

     

    E por favor o foco do tópico é para resolver esse problema e não discutir sobre qual linguagem é melhor.

    Isso sempre vai ocorrer, faz parte de toda discussão, afinal em um desses debates é de onde brotam ideias para resolver seu problema de mais formas, em todo caso, qual foi o resultado do codigo proposto pelo colega @Matheus_LPS.

    Confesso que estava com saudades desses debatees no fórum.

    Abs.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @,quando disse compiladores do fabricante,eu me referi a ficar esperando até algum compilador gerar um código melhor ou ja sair usando o Hardware do micro com os Frameworks do fabricante...

    Mai uma vez,quando disse que os compiladores C para micros são adaptações,digo que a maioria dos compiladores dedicado a microcontroladores,são direcionados ao melhor resultado/tamanho de código que o padrão em sí pois o resultado final vai ser reproduzido,na maioria das vezes,em um hardware dedicado e não a um sistema operacional 'padrão' onde você deve seguir a risca um padrão C.

    É a velha 'frase feita';"...devemos programar pensando no Microcontrolador ou programar pensando num código pomposo e limpinho?"

    Editado por vtrx

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

     

     

     

     

    Mai uma vez,quando disse que os compiladores C para micros são adaptações,digo que a maioria dos compiladores dedicado a microcontroladores,são direcionados ao melhor resultado/tamanho de código que o padrão em sí pois o resultado final vai ser reproduzido,na maioria das vezes,em um hardware dedicado e não a um sistema operacional 'padrão' onde você deve seguir a risca um padrão C.

     

     

    O compilador em C pra PC é o mesmo usado em arquitetura embedded, a unica grande diferença é que o resultado do código gerado é otimizado para x86 / x64 ou processadores usados em Desktop, não confie em mim, compile algo no GCC  para PC e verás que o código objeto gerado não possui nada de especial. Essencialmente não existe diferença em desenvolver usando C (ou quaquer outra linguagem) entre embedded ou PC, a grande diferença no caso será a forma como o código será executado, seja bare metal ou com um operacional, veras que os códigos são o mesmo essencialmente mudando a forma de acesso, com um SO você costuma fazer o linker do codigo dinamicamente mas é perfeitamente possivel fazer de forma estática (ou seja um push dos principais registradores e contexto do sistema, seguido do branch da area de codigo onde esta localizado o codigo que voce compilou).

     

     

    E sistema operacional padrão, todo OS é padrão possuindo pelo menos kernel e alguns serviços de sincronização (Semaforos), compartilhamentos (Mutexes), e serviços de comunicação intertarefa como filas. No caso do windows a unica coisa especial é que seu sistema é baseado em orientação a eventos, método perfeitamente implementavel até em micros de 8bits. O problema não está na linguagem C em si, mas em como o compilador vai se virar para reproduzir o codigo escrito em C11 num microcontrolador, o assembly que ele gera nunca será padrão mesmo... até mesmo o linker nunca aloca as variaves da mesma forma apois dois builds sucessivos, no caso de CCS e mais alguns eles nao seguem ANSI justamente porque nao querem ou seus compiladores nao foram feitos pra isso. 

     

     

    É a velha 'frase feita';"...devemos programar pensando no Microcontrolador ou programar pensando num código pomposo e limpinho?"

     

    Infelizmente se isso fosse frase feita, não teríamos carros da Toyota por exemplo acelerando sozinhos... Codigo limpo e bem estruturado deveria ser unanimidade em qualquer lugar (inclusive o ensinado nas escolas)...desde o hobbysta até o estudante de doutorado, e veja quando falo em codigo bem estruturado não falo em técnicas de abstração, ou orientação a objeto, falo em iniciativas simples, funções pequenas, código modular, portável. Até mesmo um botão como o problema do autor do topico pode ser resolvido com uma solução bem feita, no caso uma maquina de estados, que o colega @Matheus_LPS entendeu o principio da coisa e fez algo simples, bem feito e agradavel aos olhos de quem vai pegar pra ver.

    O amigo @aphawk entendeu rápido o que fiz naquele código em Assembly, nao so isso como otimizou o codigo ao gosto dele e recuperou o prazer de fazer alguns trechos de código em assembly. Codigo comentado e modularizado é bom em qualquer lugar, codigo sujo é coisa de velho (sem generalizações) que não quer fazer algo visível aos olhos da equipe pois acha que sua ideia sera "roubada".

    Abs.

    Felipe 

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Abra um novo tópico para ficarmos gastando o dedo,links do Google,tese de TCC,arquitetura,core e etc,etc,no final quem sabe não solucionaremos da melhor forma o tópico aqui :D

    Editado por vtrx

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

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

    ×