Ir ao conteúdo
  • Cadastre-se

Projetos com Avr : Design, Programação em Basic e Assembly


Ir à solução Resolvido por aphawk,

Posts recomendados

  • Membro VIP

Sobre a entrada A/D, só tem pinos acessíveis em alguns tipos de ESP8266, mas TODOS os CI's ESP8266 tem esse pino e dá para soldar direto nele , mas em alguns tipos fica dentro do invólucro metálico e não dá para acessar sem ter de abrir tudo , o que dá um baita trabalho....

 

Já o PWM todos tem sim, pois é o pino GPI02. [...]

 

Sobre a compilação, nem precisa se preocupar, pois é um microprocessador ARM 32 bits rodando a 80 Mhz....

 

$_57.JPG

 

Realmente! Um negócio desses, por aproximadamente R$ 12,00, já com frete incluso, é EXTREMAMENTE barato. WiFi, servidor web... parece coisa de outro mundo!

Link para o comentário
Compartilhar em outros sites

Estes ESPs são realmente interessantes, ótimo custo benefício (acho que vou arranjar um destes para brincar). No meu tempo que trabalhava com informática (com programação) tive contato com a linguagem lua com os professores da Universidade Católica do Rio de Janeiro (num treinamento que tive pela empresa), mas já isto faz muito tempo e eu não lembro de mais nada.

 

Recentemente comprei um Orange PI no site do Aliexpress, paguei 19 USB (produto mais o frete, mas eu acho que vou penar muito para receber pelos Correios, que estão novamente em greve), fiquei realmente impressionado com a configuração e mais ainda com o preço extremamente baixo. Só cheguei lá por um artigo que recebi pela Revista Elektor. Acho que não existe um melhor custo benefício para um ARM A7 quad-core com 1GB de memória RAM, clock de 1,6Ghz e compatível com um Raspbery PI B+, é realmente interessante (por este preço é claro).

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Arranjei um ESP8266 e depois que chegue vou colocar um firmware NodeMCU, o chato vai ser esperar pelos Correios, que estão em greve de novo.

 

Comprei um por 3,05 USD no eBay http://www.ebay.com/itm/321755583650

 

Por um preço destes dá até para arriscar e se não der certo é muito barato, mas acho que reaprendo LUA bastante fácil.


Quer dizer que para ter um projeto eu só precisarei de um gravador USB, do ESP8266 com o NodeMCU, alguns outros  componentes eletrônicos mais simples, e um fonte de energia (bateria ou pilha)?

 

Qual seria o equipamento de gravação para embutir e usar o NodeMCU?

 

 

Talvez até já exista biblioteca para abstrair esse uso, não é?

 

Update

 

Sobre o NodeMCU. O Pedro Minatel ensina um bocadinho de coisas (em português). Existe o ESP8266 Quick Start, em inglês. Inclusive encontrei que o Luatool pode nos ajudar muito a enviar os scripts Lua ao dispositivo. Mas parece que o kit de desenvolvimento é um investimento à parte, e tem gente descendo o pau nessa plataforma.

 

Merece destaque: 4refr0nt / ESPlorer, é como uma sofisticada interface gráfica Java para o Luatool

 

esplorer_tab.png

 

Não vejo a hora de botar a mão em um destes.

Link para o comentário
Compartilhar em outros sites

@Intrudera6,

 

Uma excelente compra, meu amigo ! Não consigo entender como algo tão poderoso custa tão barato !

 

Eu tenho comigo alguns ( 5 peças hehehe ) bem parecidos com esse, com as seguintes diferenças : possui apenas a antena onboard ( não tem o conector para antena externa ) , e possui embaixo da placa a previsão para soldar um regulador de 3,3V tipo LM1117, e removo um jumper SMD e posso alimentar o módulo com até 12V sem problemas. Assim me livro de encheções de saco com isso ....

 

Tenho também duas placas do próprio NodeMcu, os chamados Devkit 1.0 . Deu um baita trabalho fazer elas funcionarem, pois vieram programadas com algum maldito programa do Arduíno ( chineses .... ), e a interface serial fica desabilitada, não apareçendo no Windows quando conecto o cabo USB. Mas quando eu aperto o botão de Reset, aí sim, ela aparece enquanto fico segurando o botão de Reset .... quando solto, some novamente. Tive de ligar ela usando os pinos disponíveis externos em um outro adaptador USB-Serial, e assim consegui reprogramar e colocar o Nodemcu novamente, e aí acabaram os problemas. Agora sempre que ligo no Windows aparece a interface serial, mesmo rodando um  programa em Lua.

 

O brinquedo é muito poderoso, seja com o Kernel nativo ( padrão AT ) , seja com o NodeMCU ( Lua ) . A potência de transmissão é ajustável, sendo que possui uma boa potência máxima. Eu aciono tranquilamente a placa, mesmo estando a 30 metros do meu roteador.

 

E a linguagem Lua me parece muito simples, eu já uso ela no meu outro hobbie , que é aeromodelismo. Os dois rádio-contrroles que eu tenho possuem hoje suporte para Lua, permitindo acessar as informações de telemetria e assim posso escrever meus próprios programas para cuidar de meus modelos, como por exemplo um programa que mede a energia restante em uma bateria no aeromodelo em tempo real e me avisa bipando quando está quase no final, outro programa que calcula a cada segundo a distância em tempo real do aeromodelo até o rádio, outro programa que grava as informações todas em um cartao SD e que me permite, em caso de algum desastre, ler o log todo e encontrar a causa do acidente ( embora sei que 99,5% das vezes a causa é o operador do rádio kkkk ) . O interessante é que todos esses programas rodam ao mesmo tempo no rádio !

 

Voltando ao módulo ESP-8266, eu uso nas saídas dele um 2N7000 para chavear as cargas.

 

Tem um uso bem interessante desses brinquedinhos com sensores remotos, o pessoal interliga dois pinos do módulo e usa um comando de baixíssimo consumo, onde você determina quanto tempo a placa fica "dormindo" , gastando menos de 80 uA, e quando acorda faz a leitura do sensor e envia para algum site fazer a visualização. Isso usando o Nodemcu. Assim, usam uma pequena bateria de 300 mAh , e uma pequena célula solar, que alimenta a bateria. Assim, o brinquedo funciona anos !!!

 

Já se usar o kernel AT nativo, pode-se escolher outros modos de baixo consumo , mais poderosos, onde o consumo chega a menos de 15 uA, e que permite atender a um sinal via WI-FI para entrar no modo de funcionamento normal ! Estou procurando informações sobre isto, mas ainda é bem escassa a documentação; me parece que tem gente usando isto comercialmente e não estão muito interessados em divulgar algum programa fonte kkkkk !

 

Estou  pensando em fazer um controlador de camera de vigilância com um ESP8266, assim poderia ajustar dois eixos , ligando duas saídas a dois servomotores, desse tipo de radio-modelismo, implementando assim um sistema PTZ super-barato, controlado diretamente por Wi-FI .

 

A ideia é utilizar o IPAD com o novo sistema operacional IOS 9 , que permite a multitarefa e a divisão da janela do aparelho em dois aplicativos, sendo um deles o que recebe o vídeo da camera tipo IP, e a outra janela justamente o ESP-8266 controlando os dois eixos , assim posso direcionar a camera fácilmente.

 

Só ainda não fui ver se existe algum comando pronto em Lua para controlar um servo... se tiver será muito legal !

 

Update : acabei de ver que tem sim !!! E já achei o projetinho que quero fazer uns 80% prontinho !!!!  Que maravilha viver nos dias de hoje, meu amigo , a Internet é fantástica para isso !

 

http://www.roboremo.com/esp8266-servo.html

 

Repare que coisa muito legal esse tal de Roboremo.... assista o vídeo para entender ! Pena que só rode em Android... se rodasse em IOS seria o máximo !!!! Eu até compraria isso hehehe !

 

 

Mas no momento ainda estou terminando o meu Analizador Lógico / Osciloscópio / Analizador de Comunicação I2C / Frequencímetro / Voltímetro RMS universal de baixo custo, que descrevo aos poucos aqui no Fórum.

 

Paulo

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Projeto de um Analizador Lógico Portátil com Atmega1284P - PARTE 6  -  Osciloscópio Digital - Simulador de Trigger

 

Trigger para o Osciloscópio Digital

 

Para que consigamos capturar as formas de onda no instante que nos interessa, isto é, na subida ou na descida do sinal, e a partir que qual ponto que é iniciada a captura, temos de bolar uma rotina.

 

Ela será semelhante à parte de Trigger que existe nos osciloscópios. Iremos informar à nossa rotina duas coisas : se queremos capturar na subida ou na descida, e a partir de qual valor desejamos iniciar a captura. Para facilitar a captura, iremos selecionar o valor em uma escala de 0 a 5 Volts, com variação de um décimo de volt.

 

Como faremos isso ?

 

Bom, na verdade é muito simples : vamos ficar amostrando o sinal, e mediante a amostra atual e a amostra anterior saberemos se o sinal está subindo ( valores do conversor A/D crescentes ) ou se está descendo ( valores decrescentes ).

 

O próximo passo é comparar a leitura atual com o valor que selecionamos como trigger : Se é na subida, a leitura atual tem de ser maior do que o valor de Trigger, e se for na descida, a leitura atual tem de ser menor do que o valor de Trigger.

 

Para termos uma velocidade a maior possível, iremos mais uma vez fazer essa nossa rotina em ASM, e uma vez atingido o Trigger, liberaremos as capturas baseadas no Timer.

 

Este programa tem uma diferença do que vai ser implementado no final do projeto : aqui, descarto a captura que já atende o trigger, e começo a capturar depois dela ter ocorrido. No projeto final, esta captura que atende o trigger vai ser gravada no buffer como a primeira feita.

 

Outro detalhe importante : nesta rotina que apresento não existe nenhum teste de botão acionado para sinalizar que desistimos da captura, ou seja, se não existir um sinal que atenda a condição de trigger, o programa fica preso. Claro que no final isto será corrigido.

 

Segue o programa com a rotina de Trigger :

 

Spoiler


$regfile = "m1284PdefOK.dat"
$crystal = 20000000
$hwstack = 52
$swstack = 52
$framesize = 32
Disable Jtag
Dim Flag_cap_mode As Bit
Dim Cap_borda As Byte
Dim Cap_trigger As Byte
Dim Buffer_grande_captura(8192) As Byte
Dim B_temp As Word
Dim B_temp1 As Word
Dim B_temp2 As Word
Dim B_temp3 As Word
Dim B_temp4 As Word
Config Pina.0 = Input

'***************************** Program *****************************************
Config Adc = Single , Prescaler = 8 , Reference = Avcc
Enable Adc
Start Adc
B_temp = Getadc(0)
B_temp2 = 0
Compare3a = 199
' com este valor, teremos 1 interrupção a cada 200 ciclos de clock !
' que equivale a 10 microsegundos.

Config Timer3 = Timer , Prescale = 1 , Compare A = Disconnect , Clear_timer = 1
On Compare3a Faz_amostra Nosave
Didr0 = 255

'VAMOS LOGO TESTAR 8192 CAPTURAS
Flag_cap_mode = 0

'Agora, colocamos o endereço do buffer nas variáveis que queremos
'-------------------------------------------------------------------
$asm    
    Loadadr Buffer_grande_captura , X
    MOV R24,R26    
    MOV R25,R27    
    Loadadr B_temp , X
    st X+,R24    
    ST X, R25
$end Asm

B_temp2 = B_temp
If Flag_cap_mode = 1 Then
   B_temp1 = 70
Else
   B_temp1 = 8192
EndIf
B_temp3 = B_temp1
' 1 = faz apenas 70 capturas
' 2 = faz 8192 capturas
Timer3 = 0
Enable Compare3a
'------------------------------------------------------------------------
'       ROTINA DE TRIGGER
'------------------------------------------------------------------------
' aqui teremos a nossa rotina de Trigger.
' Se cap_borda = 255 então é na SUBIDA. Se for 0, é na descida
' Em Cap_trigger temos o valor a ser comparado para Trigger.
' Esses valores estão entre 0 e 255, para tensoes de 0 a 5 volts.
' Vamos fazer na subida, com valor de 128
Cap_borda = 255
Cap_trigger = 128
$asm    
    IN    R16,SREG
    push  R16
    push  R17
    PUSH  R18
    PUSH  R19
    PUSH  R20
    PUSH  R21
    ldS   R20, {CAP_TRIGGER}
    ldS   R21, {CAP_BORDA}
' Agora, R20 tem o valor de Trigger, e R21 tem o tipo de trigger
' que pode ser Subida (255)  ou Descida (0)
'vamos iniciar uma conversão do ADC
    ldS   R16, ADCSRA
    ORI   R16, 80
    ANDI  R16,&B11110111
    STS   ADCSRA,R16
' e agora vamos esperar terminar a conversão
Am11:
    LDS   R16, ADCSRA
    SBRC  R16, 6
    RJMP  AM11
    LDS   R18, ADCL
    LDS   R19, ADCH
' se chegou aqui,a conversão foi feita e o resultado está em
' R18 e R19 .
' agora, vamos juntar os dois bytes em um só
' fazendo um shift prá esquerda 2 casas no LSB
    lsr   R18
    lsr   R18
' agora, vamos fazer um shift prá direita de 6 casas no MSB
    lsl   R19
    LSl   R19
    LSl   R19
    LSl   R19
    LSl   R19
    LSl   R19
' e agora, é só juntar tudo em um só byte !
    !OR    R18,R19
'PRONTO , TEMOS NOSSA LEITURA EM VALOR ENTRE 0 E 255.
Am15:
    ldS   R16, ADCSRA
    ORI   R16, 80
    ANDI  R16,&B11110111
    STS   ADCSRA,R16
' e agora vamos esperar terminar a conversão
Am12:
    LDS   R16, ADCSRA
    SBRC  R16, 6
    RJMP  AM12
    LDS   R16, ADCL
    LDS   R17, ADCH
' se chegou aqui,a conversão foi feita e o resultado está em
' R17 e R16 .
' agora, vamos juntar os dois bytes em um só
' fazendo um shift prá esquerda 2 casas no LSB
    lsr   R16
    lsr   R16
' agora, vamos fazer um shift prá direita de 6 casas no MSB
    lsl   R17
    LSl   R17
    LSl   R17
    LSl   R17
    LSl   R17
    LSl   R17
' e agora, é só juntar tudo em um só byte !
    !OR    R16,R17
'PRONTO , TEMOS NOSSA LEITURA EM VALOR ENTRE 0 E 255.
' Em R18 temos a leitura anterior, e em R16 temos a atual.
' vamos ver o tipo de sinal que queremos, se é subida ou descida
   CPI    R21,0
   BreQ   Am13
'SE CHEGAMOS AQUI, É NA SUBIDA
   CP     R16,R18
   BRSH   AM_VAL_MAIOR
Am_troca:
' Se chegamos aqui, não é a captura que queremos.
' vamos trocar as leituras e mandar fazer de novo
   MOV    R18,R16
   JMP    AM15
Am13:
' Se chegamos aqui, é na descida
   CP     R16,R18   
   BRLO   AM_VAL_MENOR
' Se chegamos aqui, não é a captura que queremos.
' vamos trocar as leituras e mandar fazer de novo
   MOV    R18,R16
   JMP    AM15
Am_val_maior:
   CP     R20,R16
   BRSH   AM_TROCA
   JMP    AM_FIM
Am_val_menor:
   CP     R16,R20
   BRSH   AM_TROCA
Am_fim:
' Se chegamos aqui, o valor atendeu o Trigger
' podemos começar as capturas, liberando as interrupções
   POP    R21
   POP    R20
   POP    R19
   POP    R18
   POP    R17
   POP    R16
   !OUT   SREG,R16
$end Asm

Enable Interrupts
' Agora, a ideia é ficarmos em um loop em Assmbly, esperando que a
' captura de todos os itens termine. Isto será feito assim :
' Setamos o flag de CARRY, e ficamos testando ele até o momento
' que ele seja zerado pela rotina de captura, significando que
' a captura chegou ao fim.
$asm
' Salvamos alguns registros apenas, assim não precisaremos ficar
' salvando os mesmos os registros durante a rotina de interrupçao,
' e ainda ter de repor antes da saída !
    PUSH  R16
    PUSH  R17
    PUSH  R26
    PUSH  R27
    SEC
' A seguir, reparem os NOPS ...... isto foi feito por tentativa e
' erro, até que TODAS as capturas sejam mesmo feitas a cada exatos
' 10 microsegundos, sempre ! Nesta hora, o Proteus foi uma enorme
' mão na roda !
' Este problema é causado quando ocorre uma interrupção do Timer
' justamente no início de uma instrução que use mais de um ciclo
' de clock, o que faria o intervalo da captura ser diferente em um
' ou 2 ciclos de clock. parece pouco, mas isto poderia gerar um erro
' de até 1% no intervalo de tempo !
Espera:
    nop
    nop
    brCS  espera
    POP   R27
    POP   R26
    POP   R17
    POP   R16
$end Asm
Disable Timer3
Disable Interrupts
Stop

Faz_amostra:
$asm
    IN    R16,SREG
    push  R16
    ldS   R26, {B_TEMP2}
    ldS   R27, {B_TEMP2+1}
    LD    R20,X
    'vamos iniciar uma conversão do ADC
    ldS   R16, ADCSRA
    ORI   R16, 80
    ANDI  R16, &B11110111
    STS   ADCSRA,R16
' e agora vamos esperar terminar a conversão
Am1:
    LDS   R16, ADCSRA
' Reparem os NOP's novamente, para acertar o tempo exato !
    NOP
    NOP
    NOP
    NOP
    SBRC  R16, 6
    RJMP  AM1
    LDS   R16, ADCL
    LDS   R17, ADCH
' se chegou aqui,a conversão foi feita e o resultado está em
' R16 e R17 .
' agora, vamos juntar os dois bytes em um só
' fazendo um shift prá esquerda 2 casas no LSB
    lsr   R16
    lsr   R16
' agora, vamos fazer um shift prá direita de 6 casas no MSB
    lsl   R17
    LSl   R17
    LSl   R17
    LSl   R17
    LSl   R17
    LSl   R17
' e agora, é só juntar tudo em um só byte !
    !OR   R16,R17
'agora, é só controlar a quantidade de amostragens que foram determinadas
'e armazenar no buffer correto !
'Lembrando que B_temp2 tem o endereço do início do buffer
'e B_temp3 tem a quantidade de leituras a serem feitas
' Carregamos X com o endereço do bufer
    ldS   R26, {B_TEMP2}
    ldS   R27,{B_TEMP2+1}
' agora guardamos a amostragem do ADC no buffer e já incrementamos
' o endereço para a próxima leitura
    ST    X+,R16
' Salvamos o endereço já atualizado
    STS   {B_TEMP2+1},R27
    STS   {B_TEMP2},R26
' Agora, vamos saber se terminamos a amostragem
' carregamos X com a quantidade de amostras que faltam serem feitas
    ldS   R26, {B_TEMP3}
    ldS   R27, {B_TEMP3+1}
' truque rápido para decrementar a quantidade de leituras a fazer !
    LD    R17,-X
' salvamos a quantidade de leituras já atualizada
    STS   {B_TEMP3+1},R27
    STS   {B_TEMP3}, R26
' Agora, testamos para ver se acabou !
    OR    R26,R27
' Se o resultado for zero, acabaram as leituras, é só sair
' e sinalizar para o programa principal com um flag setado.
' Se não for zero, tem de continuar as leituras....
    BRNE  SAI_NORMAL_CAP
' Se chegou aqui, acabamos com todas as amostras feitas !
    POP   R16
    !OUT  SREG,R16
    CLC
    reti

Sai_normal_cap:
' Se Chegou Aqui , Temos De Sair Normalmente Pois Ainda Faltam
' amostras a serem feitas....
    POP   R16
    !OUT  SREG,R16
 $end Asm
 Return
End

 

 

$regfile = "m1284PdefOK.dat"$crystal = 20000000$hwstack = 52$swstack = 52$framesize = 32Disable JtagDim Flag_cap_mode As BitDim Cap_borda As ByteDim Cap_trigger As ByteDim Buffer_grande_captura(8192) As ByteDim B_temp As WordDim B_temp1 As WordDim B_temp2 As WordDim B_temp3 As WordDim B_temp4 As WordConfig Pina.0 = Input'***************************** Program *****************************************Config Adc = Single , Prescaler = 8 , Reference = AvccEnable AdcStart AdcB_temp = Getadc(0)B_temp2 = 0Compare3a = 199' com este valor, teremos 1 interrupção a cada 200 ciclos de clock !' que equivale a 10 microsegundos.Config Timer3 = Timer , Prescale = 1 , Compare A = Disconnect , Clear_timer = 1On Compare3a Faz_amostra NosaveDidr0 = 255'VAMOS LOGO TESTAR 8192 CAPTURASFlag_cap_mode = 0'Agora, colocamos o endereço do buffer nas variáveis que queremos'-------------------------------------------------------------------$asm    Loadadr Buffer_grande_captura , X    MOV R24,R26    MOV R25,R27    Loadadr B_temp , X    st X+,R24    ST X, R25$end AsmB_temp2 = B_tempIf Flag_cap_mode = 1 Then   B_temp1 = 70Else   B_temp1 = 8192End IfB_temp3 = B_temp1' 1 = faz apenas 70 capturas' 2 = faz 8192 capturasTimer3 = 0Enable Compare3a'------------------------------------------------------------------------'       ROTINA DE TRIGGER'------------------------------------------------------------------------' aqui teremos a nossa rotina de Trigger.' Se cap_borda = 255 então é na SUBIDA. Se for 0, é na descida' Em Cap_trigger temos o valor a ser comparado para Trigger.' Esses valores estão entre 0 e 255, para tensoes de 0 a 5 volts.' Vamos fazer na subida, com valor de 128Cap_borda = 255Cap_trigger = 128$asm    IN    R16,SREG    push  R16    push  R17    PUSH  R18    PUSH  R19    PUSH  R20    PUSH  R21    ldS   R20, {CAP_TRIGGER}    ldS   R21, {CAP_BORDA}' Agora, R20 tem o valor de Trigger, e R21 tem o tipo de trigger' que pode ser Subida (255)  ou Descida (0)'vamos iniciar uma conversão do ADC    ldS   R16, ADCSRA    ORI   R16, 80    ANDI  R16,&B11110111    STS   ADCSRA,R16' e agora vamos esperar terminar a conversãoAm11:    LDS   R16, ADCSRA    SBRC  R16, 6    RJMP  AM11    LDS   R18, ADCL    LDS   R19, ADCH' se chegou aqui,a conversão foi feita e o resultado está em' R18 e R19 . ' agora, vamos juntar os dois bytes em um só' fazendo um shift prá esquerda 2 casas no LSB    lsr   R18    lsr   R18' agora, vamos fazer um shift prá direita de 6 casas no MSB    lsl   R19    LSl   R19    LSl   R19    LSl   R19    LSl   R19    LSl   R19' e agora, é só juntar tudo em um só byte !    !OR    R18,R19'PRONTO , TEMOS NOSSA LEITURA EM VALOR ENTRE 0 E 255.Am15:    ldS   R16, ADCSRA    ORI   R16, 80    ANDI  R16,&B11110111    STS   ADCSRA,R16' e agora vamos esperar terminar a conversãoAm12:    LDS   R16, ADCSRA    SBRC  R16, 6    RJMP  AM12    LDS   R16, ADCL    LDS   R17, ADCH' se chegou aqui,a conversão foi feita e o resultado está em' R17 e R16 . ' agora, vamos juntar os dois bytes em um só' fazendo um shift prá esquerda 2 casas no LSB    lsr   R16    lsr   R16' agora, vamos fazer um shift prá direita de 6 casas no MSB    lsl   R17    LSl   R17    LSl   R17    LSl   R17    LSl   R17    LSl   R17' e agora, é só juntar tudo em um só byte !    !OR    R16,R17'PRONTO , TEMOS NOSSA LEITURA EM VALOR ENTRE 0 E 255.' Em R18 temos a leitura anterior, e em R16 temos a atual.' vamos ver o tipo de sinal que queremos, se é subida ou descida   CPI    R21,0   BreQ   Am13 'SE CHEGAMOS AQUI, É NA SUBIDA   CP     R16,R18   BRSH   AM_VAL_MAIORAm_troca:' Se chegamos aqui, não é a captura que queremos.' vamos trocar as leituras e mandar fazer de novo   MOV    R18,R16   JMP    AM15Am13:' Se chegamos aqui, é na descida   CP     R16,R18   BRLO   AM_VAL_MENOR' Se chegamos aqui, não é a captura que queremos.' vamos trocar as leituras e mandar fazer de novo   MOV    R18,R16   JMP    AM15Am_val_maior:   CP     R20,R16   BRSH   AM_TROCA   JMP    AM_FIMAm_val_menor:   CP     R16,R20   BRSH   AM_TROCAAm_fim:' Se chegamos aqui, o valor atendeu o Trigger' podemos começar as capturas, liberando as interrupções   POP    R21   POP    R20   POP    R19   POP    R18   POP    R17   POP    R16   !OUT   SREG,R16$end AsmEnable Interrupts' Agora, a ideia é ficarmos em um loop em Assmbly, esperando que a' captura de todos os itens termine. Isto será feito assim :' Setamos o flag de CARRY, e ficamos testando ele até o momento' que ele seja zerado pela rotina de captura, significando que' a captura chegou ao fim.$asm' Salvamos alguns registros apenas, assim não precisaremos ficar' salvando os mesmos os registros durante a rotina de interrupçao,' e ainda ter de repor antes da saída !    PUSH  R16    PUSH  R17    PUSH  R26    PUSH  R27    SEC' A seguir, reparem os NOPS ...... isto foi feito por tetativa e' erro, até que TODAS as capturas sejam mesmo feitas a cada exatos' 10 microsegundos, sempre ! Nesta hora, o Proteus foi uma enorme' mão na roda !' Este problema é causado quando ocorre uma interrupção do Timer' justamente no início de uma instrução que use mais de um ciclo' de clock, o que faria o intervalo da captura ser diferente em um' ou 2 ciclos de clock. parece pouco, mas isto poderia gerar um erro' de até 1% no intervalo de tempo !Espera:    nop    nop    brCS  espera    POP   R27    POP   R26    POP   R17    POP   R16$end AsmDisable Timer3Disable InterruptsStopFaz_amostra:$asm    IN    R16,SREG    push  R16    ldS   R26, {B_TEMP2}    ldS   R27, {B_TEMP2+1}    LD    R20,X    'vamos iniciar uma conversão do ADC    ldS   R16, ADCSRA    ORI   R16, 80    ANDI  R16, &B11110111    STS   ADCSRA,R16' e agora vamos esperar terminar a conversãoAm1:    LDS   R16, ADCSRA' Reparem os NOP's novamente, para acertar o tempo exato !    NOP    NOP    NOP    NOP    SBRC  R16, 6    RJMP  AM1    LDS   R16, ADCL    LDS   R17, ADCH' se chegou aqui,a conversão foi feita e o resultado está em' R16 e R17 . ' agora, vamos juntar os dois bytes em um só' fazendo um shift prá esquerda 2 casas no LSB    lsr   R16    lsr   R16' agora, vamos fazer um shift prá direita de 6 casas no MSB    lsl   R17    LSl   R17    LSl   R17    LSl   R17    LSl   R17    LSl   R17' e agora, é só juntar tudo em um só byte !    !OR   R16,R17'agora, é só controlar a quantidade de amostragens que foram determinadas' e armazenar no buffer correto !'Lembrando que B_temp2 tem o endereço do início do buffer'e B_temp3 tem a quantidade de leituras a serem feitas' Caregamos X com o endereço do bufer    ldS   R26, {B_TEMP2}    ldS   R27,{B_TEMP2+1}' agora guardamos a amostragem do ADC no buffer e já incrementamos' o endereço para a próxima leitura    ST    X+,R16' Salvamos o endereço já atualizado    STS   {B_TEMP2+1},R27    STS   {B_TEMP2},R26' Agora, vamos saber se terminamos a amostragem' carregamos X com a quantidade de amostras que faltam serem feitas    ldS   R26, {B_TEMP3}    ldS   R27, {B_TEMP3+1}' truque rápido para decrementar a quantidade de leituras a fazer !    LD    R17,-X' salvamos a quantidade de leituras já atualizada    STS   {B_TEMP3+1},R27    STS   {B_TEMP3}, R26' Agora, testamos para ver se acabou !    OR    R26,R27' Se o resultado for zero, acabaram as leituras, é só sair' e sinalizar para o programa principal com um flag setado.' Se não for zero, tem de continuar as leituras....    BRNE  SAI_NORMAL_CAP' Se chegou aqui, acabamos com todas as amostras feitas !    POP   R16    !OUT  SREG,R16    CLC    reti    $end Asm$asmSai_normal_cap:' Se Chegou Aqui , Temos De Sair Normalmente Pois Ainda Faltam' amostras a serem feitas....    POP   R16    !OUT  SREG,R16 $end Asm ReturnEnd

 

 

Como de praxe, segue o arquivo do programa em anexo para simulação.

 

Minha inclusão aqui...

 

Paulo

scope7.rar

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Então você é aeromodelista, quem diria ???

 

O meu nick e a foto não estão ai a toa, eu também sou apaixonado por maquinas voadoras, todas elas, mas infelizmente, o meu último que eu coloquei a perder foi um stratus em 1998 com um OS .40 (num tremendo vacilo deixando ele se afastar demais), e depois disso nunca mais eu voei de verdade num aeromodelo (pressão da esposa), tentei voltar com um P-51 elétrico com 1,6m de envergadura com retrátil elétrico e flaps elétrico (chinês), mas acho que exagerei pegando um aeromodelo arisco demais (para mim que estava há muito tempo sem voar) e ferrei o trem de pouso dele e a hélice de 4 pás. Não consegui um outro trem retrátil que fosse 100% compatível (estes chineses são de lascar, vendem o avião mas não vendem alguns dos componentes), no momento estou com ele parado e meio que perdi a coragem (e o meu tempo está cada vez mais curto).

 

Tenho em casa algumas coisas de modelismo como um belíssimo motor 4T grow .90 OS 0km e mais um Towerhobies .40 2T também virgem, de tempos em tempos eu dou umas 2 voltas (com a mão) para evitar danos por corrosão (penso em algum dia voltar e usar algum destes motores). Tenho também um rádio PCM Futaba de 8 canais (dever ter bem mais de 10 anos que comprei ele), 99% novo, eu praticamente só usei em simuladores de modelismo, arranjei um adaptador chinês para transformar ele num 2.4ghz (não sei se posso confiar muito nele). Tenho um Futada de 4 canais FM mas deste só ficou o transmissor, pois o receptor desapareceu junto com o aeromodelo, e vários servos 0km que comprei para o PCM.

 

Já andei tentando um helicóptero elétrico mas eles são muito difíceis de controlar, a gente acha que é fácil voar pairado, mas na realidade parece uma coisa impossível controlar, é quase como equilibrar 3 pratos girando sobre uma ponta de caneta bic.

 

No tempo que voava me chamavam de piloto de garimpo pois eu adorava voar rasante e o meu objetivo era voar o mais baixo possível, praticamente raspando as rodas no chão, as vezes eu acabava aparando o mato com a hélice, já fiz isto muitas vezes (ou bater num cactos). Dava uma tremenda adrenalina. O complicado era fazer rasante de dorso, eu nunca fui muito bom de dorso, nunca consegui um rasante tão bom de cabeça para baixo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Projeto de um Analizador Lógico Portátil com Atmega1284P - PARTE 6  -  Osciloscópio Digital - Exemplo de funcionamento

 

Bom, até agora postei um monte de programas, com o objetivo de mostrar o que acontece durante o desenvolvimento do instrumento.

 

Chegou a hora de mostrar um pouco como a coisa vai funcionar na prática !

 

Infelizmente, o Proteus 8 não tem suporte ao display NOKIA 3310, mas existe um modelo que funciona mais ou menos com o Proteus 7 !

 

Pelo que lí na Internet, esse modelo não é oficial, e é o motivo desse modelo não funcionar na versão 8. No momento vou usar apenas para que vocês possam ver a simulação funcionando e as telas aparecendo, é muito legal isto.

 

Uma curiosidade : sabem que até agora desenvolvi este instrumento sem precisar montar nenhum hardware ??????

Esta é a maravilha de poder utilizar uma ferramenta como o Proteus, ganhamos muito tempo sem precisar montar nenhum hardware, e vamos ajustando todo o desenvolvimento apenas pelos resultados do simulador.

 

Como já disse antes : um profissional de desenvolvimento tem de ter o Proteus !!!!!!  É igual a investir em um bom osciloscópio de nível, é sempre um retorno garantido !

 

UPDATE : Fui informado pelo suporte do Proteus que a versão atual 8.3 SP2 já possuí o modelo do Nokia 3310 !!!! Ebbbaaaa !!!!

Mas preciso adquirir um update para esta versão ( Uiiii ) ..... fazer isto apenas para poder ensinar aqui no Fórum é uma baita dor... ainda mais nestes valores de dólar.

 

O inconveniente é que o modelo do Atmega1284P do Proteus7 tem um bug e não funciona com o TIMER3 ..... então temos de inventar um pouco para poder mostrar as coisas funcionando !

 

Aliás, o bug continua no modelo do Proteus 8, mas eu informei o suporte e eles já fizeram a correção, e no próximo release estará ok. Mas se vocês estão acompanhando o desenvolvimento desde o início, verão que eu já disponibilizei o modelo corrigido em alguns dos downloads.

 

Então, peguei o programa anterior, adaptei ao ATMEGA328P, usando o Timer1, e fiz a rotina de mostrar na tela as amostragens feitas ! Melhor dizendo, apenas transformei a escala de valores da amostragem, que vai até 255, para "caber" entre 0 e 47 neste caso, e aproveitei as funcões gráficas para setar um ponto da tela e mostrar toda a tela, que postei logo no início deste projeto. Ah, o trigger foi feito selecionando na descida, como podem ver no programa-fonte.

 

A rotina de transformação dos valores e a marcação dos pontos no display eu fiz em Basic mesmo, e demora cerca de 3 milisegundos para todos os 84 valores da tela. Isto significa que podemos fazer toda a captura e mostrar na tela em menos de 21 milisegundos !

 

Esta vez não postarei o programa aqui, pois com todas as rotinas começou a ficar um pouco grande, e vai deixar a navegação do Fórum muito lenta. Mas está em anexo para quem quiser ver.

 

Seguem algumas telas...

 

Captura de uma senóide :

 

wqskjn.jpg

 

 

Aplicando uma onda quadrada a um circuito RC :

 

6p957c.jpg

 

Legal, não é ?

 

Já pensaram o que pode ser feito se utilizar um display de resolução maior, tipo 320 x 240 ?????  O céu é o limite, mas vamos manter o baixo custo de nosso instrumento, usando este Nokia 3310 mesmo.

 

Vamos ao circuito utilizado, na simulação do Proteus 7 :

 

28ro6rc.jpg

 

 

O programa e o arquivo utilizado na simulação então em anexo.

 

Dica para a simulação : coloquem um Breakpoint na linha que tem o comando STOP na listagem do programa, e assim que o programa parar, de um clique no botão de avançar um STEP, e a imagem irá aparecer na tela do display !

 

Paulo

Logic.rar

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Modelismo é um vício bem forte (acho que troquei um vício por outro), eu nem sei como consigo viver sem, parei de ir as pistas para não ter desgosto, acho que qualquer dia destes vou arranjar um elétrico menor e bem mais dócil (quando o dólar estiver mais barato), pois estou mesmo muito enferrujado, e quando recuperar o dedo, ai sim posso passar para alguma coisa mais arisca. Sito uma certa falta de botar um bom motor glow para soprar forte, mas é uma grande lambança depois, isto é a maior vantagem dos elétricos (fica tudo bem mais limpo depois), pena que faz muita falta o cheiro de metanol com óleo de rícino e também o ruido do motor.

 

Uns poucos anos atrás que estive num evento em Feira de Santana e um pessoal levou um aeromodelo a turbina, a sensação de ver um destes de perto, botar a mão, mesmo que apenas no chão parado, ouvir o apito e sentir o cheiro de querosene do motor é demais.

 

Quem sabe um dia as turbinas e os turbo hélices (principalmente) fiquem acessíveis (aos mortais), voar um turbo hélice escala com um motor turbo hélice real é uma tremenda experiencia.

 

 

Tem muita coisa boa para telemetria em aeromodelos, a oferta é quase infinita e os preços idem.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Estou procurando informações sobre isto, mas ainda é bem escassa a documentação; me parece que tem gente usando isto comercialmente e não estão muito interessados em divulgar algum programa fonte kkkkk !

 

É muito meritório todo o compartilhamento de conhecimento que você faz por aqui. Parabéns! Refiro-me principalmente ao BASCOM e a esse projeto do analisador lógico. São conhecimentos muito específicos.

 

Pra falar a verdade... eu não me sinto nem um pouco atraído pelo BASCOM. Mas mais importante é o conhecimento. Eu compreendi que há casos em que a opção deverá ser, se a pessoa conhece o bastante, por alguma arquitetura usando BASCOM e ASM. Se não fosse você, eu e vários outros muito provavelmente nunca teriam sabido da existência dessas possibilidades.

Link para o comentário
Compartilhar em outros sites

@test man*~ e @alexandre.mbm,

Amigos, obrigado pelas palavras de incentivo.

A minha finalidade sempre foi essa, de passar experiências e conhecimentos adquiridos para a nova geração de praticantes de eletrônica. Uso o Bascom como uma plataforma de desenvolvimento, eu diria que é uma IDE, semelhante ao Arduíno, porém muito mais poderosa no sentido de utilizar o hardware disponível. Coisas como configurar Timers, Interrupções, comunicação serial ( com ou sem interrupts ), configurar amostragem do ADC, comunicação serial via I2C ou SPI, é muito simples de se fazer, e eu ainda acredito que é a melhor maneira de se fazer isso para um iniciante.

Estou misturando o Asm justamente nos trechos onde preciso de mais performance, na verdade poderia fazer tudo em Bascom, mas perderia a velocidade que me é tão necessária para este instrumento.

O fato do ASM ser muito parecido na estrutura com o 8080 é que permite essa facilidade toda de uso, mas olha, a gente perde muito mais tempo para fazer um programinha e isso é que determina o quanto vale a pena. Por exemplo, o programa acima, eu fiz a parte de conversão totalmente em Asm, demorei quase duas horas.... O resultado final : para um loop de 84 conversões, foram 2.85 milisegundos em Asm contra 3.05 milisegundos em Basic... Se lembrar que para gravar os 84 pontos no display e mostrar eu demoro cerca de 18 milisegundos, o ganho em tempo é muito pequeno e desnecessário. Fazer em Basic me custou 3 linhas de programa, e fiz em meio minuto kkkkkkk

Voltando ao projeto....

Acho que compartilhando com todos as dificuldades que apareçem, e as maneiras de contornar, são o maior conhecimento que pode ser divulgado.

Esse projetinho tá ficando tão bom que poderia aproveitar ele de maneira comercial, mas desde o começo eu quis fazer um instrumento de baixo custo com a ideia de que as escolas e faculdades pudessem montar e equipar os laboratórios de eletronica com ele. A licença que irei disponibilizar vai permitir uso desse tipo, e também que cada um possa construir o seu, sem precisar pagar nada ! Apenas vou restringir a exploração comercial.

Sei que é um pouco de utopia que isto dê certo neste País, mas pelo menos fiz a minha parte, concordam ? Não vejo nenhuma utilidade levar para o túmulo o conhecimento adquirido, ele tem de ser passado para adiante.

Se um dia alguém se formar e agradeçer por ter podido usar um aparelho desse em seu aprendizado, eu estarei bem feliz com isso !

vocês vão gostar da próxima postagem desse projeto, que é o analizador de protocolo I2C. Envolve um pouco de ASM por causa de ter de decodificar em velocidades de até 400 Khz, mas é muito legal ligar ele em um Bus I2c e ficar espiando os comandos e respostas !

Alexandre, mesmo sem ser atraído, creio que olhando os programas que ando postando voce percebeu que é uma linguagem simples. E voce pode usar versão gratuíta para objetos até 4k, que já dá para fazer muiiiita coisa com isso. Não custa nada experimentar, e voce pode se surpreender com os resultados.

Mas existem algum compiladores Basic para AVR que são totalmente Free. Quem sabe uma alternativa.....

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Não vejo nenhuma utilidade levar para o túmulo o conhecimento adquirido, ele tem de ser passado para adiante.

 

Não tem sido o caso, mas determinados conhecimentos, para os quais eu não vejo probabilidades razoáveis de serem aplicados para o bem, eu sou a favor de que sejam enterrados. É julgamento pessoal e de momento. Se novas possibilidades aparecem, para o bem, pode ser o caso de desenterrar o que já tinha sido enterrado.

 

Por exemplo, a pessoa pode ensinar outros a se precaver de golpes. Porém, quase sempre não é conveniente simplesmente sair ensinando por aí como se faz uma escuta, um grampo ou um fishing.

 

Alexandre, mesmo sem ser atraído, [...]

Mas existem algum compiladores Basic para AVR que são totalmente Free. Quem sabe uma alternativa.....

 

Como eu disse, haverá casos em que o BASCOM será o indicado, gostando ou não gostando. Minha expressão é "de gosto" mesmo, superficial. Eu prefiro muito mais C ou Python, ou até Ruby. No caso de AVR, o modo padrão de fazer as coisas no Arduino me atrai mais.

 

E, apesar de eu ser novo, meu primeiro programa foi em BASIC. Em 2000, mais ou menos. Infelizmente era um malware. Mas nunca foi usado. Eu o enterrei, Graças a Deus, e por fim eu o perdi.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Eu, pelo contrário nunca gostei de C porque me parecia muito complicado, até mais que ASM.

Pra quem conhece bem eletrônica digital, ASM é moleza. Basta um datasheet com as instruções detalhadas e um compilador. Estou falando de qualquer linha de uC.

Agora, nesta altura da vida, estou aprendendo C e achando até fácil, mas só pra converter alguns programas interessantes para o bascom. Fica bem menor.

Com uma linha config em bascom evito escrever 10 em C.

 

Com esta experiência de conhecer C, aprendi a seguinte lição pra vida social.

Quando eu não for com a cara de uma pessoa, vou tratar logo de conhecê-la. Pra saber o porque ela não me agradou, sem nenhum motivo justificável ou só pela primeira impressão.

Link para o comentário
Compartilhar em outros sites

@_xyko_,

 

voce é a terceira pessoa que fala a mesma coisa, está aprendendo c para passar pro Bascom .... boa sorte heheheh !

 

Seguinte, você havia me feito uma ;pergunta, sobre o que eu gostava menos : programar para USB ou programar para TCP/IP .... 

 

Hoje a resposta é bem simples : programar para USB ainda é um baita saco, é muito detalhe, muita coisinha prá ficar acertando, e tenho de usar bibliotecas que também não são fáceis de entender.

 

Já para TCP/IP, agora que conhecí o ESP8266, acabaram todos os problemas ! 

 

Simplesmente conecto esse brinquedo numa porta serial do AVR e pronto, mando alguns comandos AT, e estou conectado via WIFI sem nenhuma dificuldade ....  ele pode conversar até 230K de velocidade.

 

Dá uma pesquisadinha nele, ok ?

 

Paulo

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@aphawk

Pesquisei bastante no site, este datasheet e achei este pra uso imediato ESP8266MOD. Já encomendei uma peça. 

Até que não sai caro aqui no Brasil para fazer umas experiências. Sabe me dizer o alcance máximo dele aproximado em metros? 

Segundo as informação, 19.5dBm = 89mW

http://www.rapidtables.com/convert/power/dBm_to_Watt.htm

não é pouca coisa, heim!

 

Segundo esta tabela:

post-387879-0-68757000-1443029306_thumb.

http://www.embarcados.com.br/modulo-esp8266/

E estas velocidades?

 

edit:

Um alerta aos incautos:

Tem uns espertinhos no ML vendendo nRF24L01 como módulo WI-FI.

Não entrem nessa. Apesar de trabalharem na mesma banda (ISM) não tem nada a ver com wi-fi. Fó faltava colocarem que também é buetooth e zigbee, já que estas tecnologias também trabalham na faixa de 2.4GHz

Link para o comentário
Compartilhar em outros sites

@_xyko_,

 

Sim, é uma porrada de potência para um troço tão pequeno !

 

Se voce comprar o modelo com um conector para antena externa, e claro , colocar uma boa antena, passa fácil de 80 metros, é o que eu testei aqui em casa.

 

Já se comprar o modelo com a antena impressa em PCB, consigo 30 metros antes de ficar crítico. Isto dentro do meu quarto, e o roteador longe de mm por uns 3 quartos , haja parede !

 

Mas se usar antenas direcionais pequenas , faz um link fácil de 1 Km !!!!

 

O legal é que voce controla a potência de saída, e também pode trabalhar nos modos de economia de energia.

 

Tem gente disputando quanto tempo consegue fazer isso funcionar usando uma bateria lipo pequena de 3,6 volts, e passaram de um mês ...... tem muita coisa legal, uns modos onde ele fica esperando ser "chamado" pelo roteador e então acorda para trabalhar ( !!!! )  , enfim é uma beleza !!!

 

Paulo

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

O legal é que voce controla a potência de saída, e também pode trabalhar nos modos de economia de energia.

Você pode nos apontar com precisão a documentação específica sobre isso?

 

Tem gente disputando quanto tempo consegue fazer isso funcionar usando uma bateria lipo pequena de 3,6 volts, e passaram de um mês ......

 

Onde? Pequena de relógio?!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@aphawk, você num separar os dois não? Acho que no primeiro pedido qualquer moderador acata.

 

PS.: o moderador por favor apague esta mensagem, se vier a decidir sobre a questão.


 

Qual é a página oficial que reúne esse tipo de documento? Quero conhecer todos os outros, caso existam.

Link para o comentário
Compartilhar em outros sites

@alexandre.mbm,

 

Me explica melhor o que voce quer fazer, não entendí seu questionamento. É criar um tópico específico para o ESP8266 e mover todos os posts daqui para esse novo tópico, é isso ?

 

 

Sobre a página oficial do ESP8266, este é o verdadeiro fabricante do CI :

 

http://espressif.com/en/products/esp8266/

 

Paulo

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Me explica melhor o que voce quer fazer, não entendí seu questionamento. É criar um tópico específico para o ESP8266 e mover todos os posts daqui para esse novo tópico, é isso ?

 

Sim, é minha sugestão. Discorda?

Está ficando uma misturada só! Mas temos duas threads bem desenvolvidas e separáveis.

Sobre a página oficial do ESP8266, este é o verdadeiro fabricante do CI: http://espressif.com/en/products/esp8266/

 

Ah... a documentação que interessa, a exceção do datasheet "confidencial", está toda no pacote ZIP do SDK.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!