Ir ao conteúdo
  • Cadastre-se

Felipe Electronic

Membro Pleno
  • Posts

    3.312
  • Cadastrado em

  • Última visita

Tudo que Felipe Electronic postou

  1. O Colega acima ja respondeu. Ambas as formas são válidas do ponto de vista de OBEDECER A SINTAXE da linguagem, do ponto de vista de desenvolvimento vai depender muito mais da aplicação de das restrições de alocação de memória que você tiver, por exemplo ao usar o operador new, a memoria alocada vem de uma região chamada heap, e mesmo que você aloque memoria dentro de uma função, com o new, sem dar delete depois do uso aquela memoria ficará alocada e sem condições de ser reutilizada, sendo de um modo geral pouco recomendado o seu uso (existem momentos certos para o uso de alocação dinamica com o new/delete mas foge ao escopo do topico).
  2. Só um ponto pra não esquecer, se você fornecer a imagem .hex do seu programa, deve COMBINAR ela com o bootloader do arduino em questão, caso contrario, se o utilizador gravar o programa inadvertidamente, ele não terá como recuperar o arduino sem antes gravar o bootloader. Mas aqui fica minha curiosidade, porque distribuir o .hex de uma plataforma tão reusável quanto o arduino? Você pode adicionar os fontes das bibliotecas necessárias de forma local para evitar problemas com dependencia externa. Outro ponto o .hex não garante que o programa funcione, pois ele foi compilado para determinado arduino, com o microcontrolador X, sob condições de hardware que podem ser diferentes entre os utilizadores eu pessoalmente vejo mais chance de distribuir um .hex que não funciona do que liberar um projeto cuja a dependencia externa não esteja sendo satisfeita.
  3. @Luan Borges, bem vindo ao mundo dos MCUS acima de 8bits, as coisas daqui pra frente mudam um pouco quando comparados com os MCUs de 8bits, e a primeira coisa que você deve entender é que, agora os periféricos são fisicamente separados dos pinos de I/O. O que isso significa? Que basicamente agora você tem duas tarefas em vez de uma, ao mexer com um periférico em nível de registrador, a primeira é configurar o periferico em si, a segunda é rotear os sinais de saida do periferico no pino que ele suporta. No seu caso específico voce precisa configurar o PWM escolhendo um dos 5 timers disponiveis, cada timer suporta o modo free runing (contagem), capture e compare, esse ultimo é o que gera PWM. Na seção 14 do datasheet ele descreve os registradores que você precisa configurar para obter o periférico em PWM, são três simples registradores, configure-os e escolha qual timer vai ser o "motor" desse PWM, em seguida va para a seção 11 - 13 dependendo do timer escolhido e configure ele para gerar o periodo desejado do seu PWM, basta colocar ele em moto auto-reload e carregar 1 vez o periodo de expiração dele. Feito isso, o próximo passo é olhar seu PIC, e dependendo do encapsulamento verificar qual compare sai em cada pino, descoberto isso, va para a seção 10.04 do datasheet e configure o PPS para rotear seu compare para os pinos desejados. Lembrando que isso que disse ai em cima, é alto nível agora você precisa ler as seções nessa ordem, para conseguir entender como a coisa funciona, nos micros maiores, para configurar um periférico, você sempre deve dividir sua configuração em problemas menores senão a coisa fica confusa mesmo. Alternativamente você pode simplificar esses passos usando a Peripheral Library da Microchip, que ja possui as funções de configuração implementadinhas em C (esqueça essa lenda de acessar o registrador é mais rápido, os compiladores evoluiram muito em termos de otimização da firmware), vai ai on link: https://www.microchip.com/SWLibraryWeb/product.aspx?product=PIC24 MCU dsPIC Peripheral Lib Outra opção é usar o Code Configurator do MPLABX para gerar o codigo de inicialização dos periféricos, segue o link: https://www.microchip.com/mplab/mplab-code-configurator Bom por ora é isso, qualquer coisa da um berro, Felipe
  4. @luizfelipecss, cara muito legal essas launchpad C2000, eu particularmente adoro essa familia de MCU com cara de DSP da TI, com qual familia está mexendo? Delfino ou Piccolo? Uma coisa que gosto de fazer com esses micros é não perder tempo codando em C, mas programar utilizando modelagem, como por exemplo o embedded coder do MATLAB que consegue gerar a firmware para os C2000 direto de modelos do simulink com simulação (e plottings em tempo real!), vale a pena dar uma conferida. Curiosidade, qual o proposito do conversor boost + controle PI? considerou utilizar compensadores como 2P2Z?
  5. @Paola Costa, tudo bem? Que tal começar dividindo seu problemão em problemas menores? Veja sua coqueteleira precisa: 1 - Receber o comando para fazer um drink; 2 - ler o sensor de posição para saber debaixo de qual garrafa está; 3 - planejar o movimento do servo para acessar as garrafas desejadas; 4 - comandar o motor ate a garrfa desejada ou seja : 5 - aciionar o motor ate que o sensor da garrafa desejada acione; 6 - abre a valvula por n segundos; 7 - repetir 4, 5, 6 até passar por todas as garrafas desejadas 8 - mover o drink para ser retirado e aguardar novo comando.. Tirando os problemas especificos de ler sensores e comandar botões percebe que a logica ai resume o funcionamento do seu tcc e cada passo se traduz em uma função? Agora conta pra gente o que voce consegue ler e comandar com seu PIC atualmente
  6. Esse problema tem algumas diferentes formas de se resolver, um meio fácil seria concatenar o nome da pessoa a um nome de arquivo comum, por exemplo cadastro_joao, cadastro_maria, isso pode ser feito sem dores usando a função strcat() (de string.h) que concatena duas strings, com resultado do strcat tu abre / cria um arquivo com a string resultante, o problema dessa solução é que dois nomes iguais podem gerar arquivos iguais, sendo uma outra opção incrementar um contador interno (salvo em outro arquivo) e adicionar ele no nome do arquivo, depois disso incremente-o. Links para ajudar com strcat: http://www.cplusplus.com/reference/cstring/strcat/
  7. Temos alguns problemas de formulação na sua solução: 1 - para printar os 10 ultimos valores do vetor, é necessário que o vetor tenha size = 10 pelo menos, seria legal checar os parametros da função antes de começar, caso contrario voce pode gerar um buffer overflow e crashar seu programa; 2 - entendi o fato de usar um pointeiro para o vetor, ok, super valido, mas por que o tamanho vocês está passando via vetor? porque não um int mesmo contendo o tamanho do vetor? 3 - A tua função não funciona para vetores maiores que 10, o ideal seria obter o tamanho do vetor, subtrair 10, e incializar o teu for com valor dessa subtração, afinal voce só quer os 10 ultimos. Existe uma ordem especifica para apresentar os valores no console?
  8. Pelo code style me parece que você está a usar a famigerada API do windows certo? Um ponto é que vai ser meio difícil mexer com esse bicho ai sem entender os fundamentos de como acessar um device no windowss sugiro começar pegando a documentação da função, isso pode ser facilmente feito pesquisando diretamente pelo nome dela, segue o link: https://docs.microsoft.com/en-us/windows/console/readconsoleinput Esse loop ai fica esperando que 1 elemento do tipo de ir_func seja recebido pelo stdin, que geralmente é o console do windows (e não o mouse) essa função é blocking, ou seja, ela vai entrar ai travar e só sair ao receber o evento de recepção de 1 ir_func, quando ela sai invoca a função coordenada de acordo com retorno da função de console pra finalmente entregar esse valor em bl_func. O codigo acima ta com contexto vago, o ideal seria tu postar o que quer e esse codigo que tu achou todo, pra melhorar a qualidade do help. Abs.
  9. VERDADE! isso que da ficar muito tempo sem mexer com CPP, o veio aqui perdeu a mão Acho bem curioso o fato do struct e o class serem iguais apenas mudando seus defaults, no struct é tudo publico no class tudo privado, me parece questão de semântica (ou legacy do C)
  10. Isso, o Arduino não é só para aquele cara que quer um projeto rápido, é também para o iniciante mais curioso, a quantidade de coisa desenvolvida e validada pela comunidade é enorme, além disso o ecossistema tem vários sabores, com várias particularidades mas tudo sempre usando as Arduino core libraries, se achar ruim tu pode programar em C ou mesmo em inline assembly, o Arduino não impede você disso o que faz dele digamos assim bem elástico, seja você iniciante ou não. Esses dias mesmo recebi um Arduino Vidor, que é constituido de um ARM e uma FPGA e advinha, você pode sair fazendo hardware programável ou... usar esse canhão com as core libraries do Arduino e ter seu projetinho rodando sem lag. Arduino pelo que ando vendo vai continuar sendo a grande porta de entrada no mundo de sistemas embarcados. "Ah mas arduino não é coisa de profissional com aquele software e memememememe" - Pra quem pensa esse tipo de coisa, da uma olhadinha aqui no Marlin Firmware, um controlador completo de impressão 3D que... roda num AVR de 8bits! https://github.com/MarlinFirmware/Marlin
  11. @Isadora Ferraz, tem até distribuidor oficial nacional dos chips das Espressif, a Intel ta usando uma variante do core deles (o Tensilica) como base para processador de Audio HIFI. Segue link do distribuidor BR (e é distribuidor bão): http://www.macnicadhw.com.br/produtos/semicondutores
  12. Na verdade até da pra fazer fora da main, em C++ até os construtores invocados rodam código fora da main sem aparente definição de função (tem a mágica do startup code ai, mas isso eh outra história), bastaria fazer um early initialize assim; struct ab { string nome }; struct ab x[5] = {{"fulano"}, {"siclano"},{"nomefeio"}, {"nomebonito"}, {"bla"}}; Além disso faltou o struct antes do x, o erro de typename está ocorrendo porque "ab" não é um tipo, "struct ab" é um tipo, toda variavel deve ser precedida atraves de um tipo valido ou uma struct, alternativamente daria pra fazer com typedef (pouco recomendado) para voce declarar x sem o struct ab: typedef struct { //Seliga no typedef ali string nome } ab; //e se liga que o ab veio pra frente //agora sim, ab sem o struct. ab x[5] = {{"fulano"}, {"siclano"},{"nomefeio"}, {"nomebonito"}, {"bla"}}; Divirta-se
  13. Acho que os colegas ja responderam com os investimentos, deixe - me complementar apenas com uma coisa algo que me chamou a atenção sobre o fato de algo que vai durar na sua experiência. Foque nos conceitos e não no dispositivo, usar PIC, AVR, ST ou mesmo Arduino vão te levar a praticamente aos mesmos caminhos com pequenas diferenças em termos de dificuldade e produtividade, ao começar no mundo dos sistemas embarcados você sempre vai precisar entender um pouquinho de aspectos de dispositivo de forma genérica, Ex.: Um periferico de timer é praticamente o mesmo independente do device, foque em entender como ele funciona, programar é o de menos, as API fornecidas pelo Arduino ou as HALs (peças de código que abstraem o baixo nível) podem fazer o trabalho duro de lidar com as diferenças específicas de cada plataforma. Dito isso, eu começaria sim pelo Arduino pela agilidade na assimilação de conceitos e ver funcionando, aproveite essa experiência para aprender a fazer projetos com a firmware portável, acredite nenhum ambiente é mais propicio pra te ensinar portabilidade de firmware do que Arduino, com seus projetos portáveis, foque em testar em MCU que tenham periféricos que não existam na sua Arduino, por exemplo microcontroladores ST com periferico de display gráfico, ou MCUs da TI que possuem aqueles PWMs maravilhos de altissima resolução para motores. E não menos importante: C ou Assembly? Ambos! E Basic, e Java, e C++, Python, o que vier, cada linguagem ensina um paradigma diferente na hora de abordar seu projeto, e quanto mais você as conhece mais consegue implementar as particularidades de cada linguagem para resolver uma limitação que outra tem... Por ora é isso, qualquer coisa, pergunta ae.
  14. @aphawk, é bom estar de volta. Nada, dropei o doutorado depois de 2 anos, cansei dessa vida, quero mesmo passar o tempo fazendo meus projetinhos pessoais e ganhando a vida com o que der. Falando de ensino, nos ultimos anos em que estive fora muita coisa aconteceu na vida profissional que me abriu demais a mente, e hoje entendo perfeitamente algo que li seu: "Não importa a cor do gato, desde que coma o rato". Em Basic, C, Java, Javascript (atenção pra esse novo queridinho que ta rodando em tudo que é microcontrolador), não importa a linguagem as dúvidas estão residindo nos conceitos e é como voce bem disse acima, eu ando mais preocupado em compartilhar ajuda na forma de conceito do que código pronto (ou solução pronta). Aliás: Basic é muito legal, só pra constar viu. C virou coisa de velho também, C++ ainda tá meio obscuro, mas pra PIC acho que programar em qualquer coisa serve e resolve, aquelas falácias (muitas ditas por mim) sobre processamento, PIC não aguenta, otimização, mano, se quiser desempenho muda de processador, até onde? até onde seu bolso der No mais é bom estar de volta, espero conseguir somar com você e o time que tomou conta daqui. Abs.
  15. como mencionado pelo @isrnick, isso está acontecendo pois o compilador entendeu que independente de colocar o incremento ou simplesmente atribuir o valor, o resultado será o mesmo, assim ele sempre vai partir pra abordagem de reduzir o número de instruções para um mesmo resultado, é a chamada otimização, que por default (considerando um GCC) é -O3 que sai otimizando tudo que ele achar redundante.
  16. @wBB, tudo bem? Minha sugestão é que remova o pull-up/down, a 485 é um barramento de comunicação diferencial, ou seja para geração dos simbolos (bits), diferentemente de uma UART comum, ela não considera VCC, 0V, mas sim a diferença de tensão entre A e B, o seu problema pode estar ocorrendo pela falta do resistor de terminação entre essas linhas (tipicamente 120R, mas atenção esse valor deve ser usado apenas para testes, a versão final você tem que adicionar esse resistor baseado no tamanho do cabo, número de nós e impedância desejada no barramento 485), remova os resistores e coloque dois resistores entre A e B nos dois extremos da linha (receptor e transmissor) e refaça os testes, do jeito que seu circuito está os diferenciais de robustez que a 485 oferecem não irão aparecer (sendo melhor usar a UART). Ah, tipicamente uma 485 é Half Duplex, não esqueça disso, você precisa controlar o fluxo de meensagens tanto no no D quanto no R para evitar colisão de pacotes.
  17. Tenho a impressão que tu clonou o código da @Isadora Ferraz, sem adaptar pro teu projeto De exemplo da solução acima, tu pode criar uma função estilo display_write() e internamente mapear bit a bit em o byte a ser escrito, pergunta, estamos falando de vários displays(aka multiplexação)?
  18. Mas gente eu volto depois de anos de inatividade e vejo essa novela do IOC, pena que cheguei tarde Bom ver o @aphawk ativo por aqui.
  19. então, acho legal a ter gente que ainda se esforça começando a aprender pelo começo. Mas para entender mesmo o que ocorre com as instruções movlw e movwf e movf, seria legal voltar la em eletrônica digital e relembrar o conceito de memória e registradores, depois abrir o datasheet do PIC e ver as semelhanças, quando eu comecei a por as mãos em microcódigo para microcontroladores, foi muito mais proveitoso aprender o micro com um livro de sistemas digitais do lado, ajuda e muito.
  20. Os amigos estão se esforçando para explicar ao autor do tópico, mas vou deixar um adendo pra esse: "Qualidade da resposta proporcional a qualidade da pergunta."
  21. No geral uma grande parcela dos PIC16 e 18F usam a famosa tensão de VPP na hora de programar, se teu circuito gera essa tensão menos mal. A única coisa que deves checar é se seu PIC especifico usa a tensão de VPP ou se usa tensão de baixo valor para programação. Existe ainda outra coisa, como esta contectado teu VPP em relação ao pino MCLR da placa alvo? Poste um esquema ou diagrama se possível. Abs.
  22. Alguns itens de hardware a se checar: - Qual cristal esta usando? Esta montado proximo do PIC? colocou os capacitores de load proximo ao cristal. qual o valor? - Um bom capacitor de desacoplamento proximo ao pino de alimentação do PIC (cerca de 100nF); - Ja citado, derrubou o watchdog? Se nao esta alimentando ele no firmware periodicamente? - Quais os fuses de gravação que esta a usar? Abs.
  23. Bem, da pra gerar o sinal com alguns recursos de hardware... usando o PWM ou output compare, como resolução não interessa muito, voce deixaria a CPU sem cargo de gerar isso. Se quiser uma portadora senoidal, basta passar esse sinal por um filtro passa-baixas de ordem elevada (8 ordem, eliptico) com frequência de corte próxima aos 3,58 MHz. Ter como fazer, tem...mas e ai? Compensa? Abs.
  24. Se for pra trilha sonora do seu jogo, mas vamos cair no velho dilema, MEMÓRIA, claro isso se quiser fazer playback de uma canção armazenada em memória. O hardware para trazer o sinal digital "de volta" para o mundo analógico pode ser feito das duas formas já citada, você escreve num port a amostra de aúdio e passa por com uconversor digital para analógico (o que chamam de DAC) paralelo, que você pode montar a base de resistores ou comprar um CI como o DAC0808. Ou... usar o famoso conversor analógico para digital de 1bit, no caso um gerador de PWM, onde o duty-cicle carrregado seria cada amostra do seu sinal de áudio, e o pino de PWM do PIC, conectado a um filtro passa-baixas para retirada da componente de alta-frequência bem como seus harmônicos. Acho melhor começar lendo um pouquinho não? http://www.microchip.com/pagehandler/en-us/technology/audio/basics.html http://www.atmel.com/applications/homeentertainment/audio/default.aspx http://cache.freescale.com/files/product/doc/AN2250.pdf Divirta - se.
  25. Então seu projeto vai ler o conteudo de um cartucho de jogo de atari e projetar o video num monitor? Abs.

Sobre o Clube do Hardware

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

×
×
  • Criar novo...