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

@aphawk , ainda não tive tempo. Sou um dos cuidadores de meu pai. Hoje eu penso que completei meu kit básico de eletrônica embarcada. Quer dizer, falta uns capacitores, claro. Estou sem tempo para aproveitá-lo. Vou dormir novamente no hospital. O pouco tempo disponível deveria estar sendo usado para descansar. Comento com todo esse detalhe para ficar claro que não é falta de interesse e prestígio pelo seu trabalho. Tenho muita vontade de me oferecer para formatá-lo, ensinar Git e GitHub a todos, mas isso está inviável. Encontrando tempo, eu preciso é mergulhar nos projetos.

Link para o comentário
Compartilhar em outros sites

@alexandre.mbm ,

 

Opa, não se preocupe com isso, meu amigo. Foi apenas uma curiosidade minha.

Cuide das coisas, e que Deus te dê tudo o que você precisa para enfrentar as adversidades.

Recebí mais algumas coisas legais, de noite eu posto para você ver, acho que são compras que vão valer a pena.

 

Paulo

Link para o comentário
Compartilhar em outros sites

Em 25/10/2016 às 12:16, aphawk disse:

 

Bom, segue aí prontinho para voce :

 


$regfile = "m328pdef.dat"
$crystal = 8000000
$hwstack=40
$swstack=16
$framesize=32


Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output

Portb.0 = 0
Portb.1 = 0
Portb.2 = 0
Dim Leitura As Long
Dim Escala As Byte
Dim Contador As Integer
Contador = 0
Dim Contagem As Word
Dim Limite_dado As Word
Dim Flag_estourou As Bit

Limite_dado = 1000
' configurado tempo de espera para 1000 milisegundos

Config Timer2 = Timer , Prescale = 64
Stop Timer2
On Timer2 Sub_contador

Timer2 = 125


Config Adc = Single , Prescaler = Auto , Reference = Avcc

Start Adc

Config Lcdpin = Pin , E = Portd.2 , Rs = Portd.3 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7

Config Lcd = 16 * 2

Enable Timer2
Start Timer2
Enable Interrupts

Do


  Leitura = Getadc(3)
  Leitura = Leitura * 100
  Leitura = Leitura / 1023

  Locate 1 , 1
  Lcd "sensor em"
  Lcd Leitura
  Lcd "%"



  If Leitura < 20 Then Gosub Rotina1
  If Leitura >= 20 And Leitura <= 80 Then Gosub Rotina2
  If Leitura > 80 Then Gosub Rotina3
  If Escala = 1 Then
    Locate 2 , 1
    Lcd "alarme ligado"
  End If
  If Escala = 2 Then
    Locate 2 , 1
    Lcd "na margem,ok"
  End If
  If Escala = 3 Then
    Locate 2 , 1
    Lcd "acima 80,ok"
  End If

Espera:
  If Flag_estourou = 0 Then Goto Espera
  Flag_estourou = 0
  Contagem = 0
  Loop
  End

  Sub_contador:
  Incr Contagem
  If Contagem = Limite_dado Then
    Set Flag_estourou
  End If
  Timer2 = 132
  ' e agora , porque 132 e não 125 ???????
  Return




  Rotina1:
  Portb.0 = 1
  Portb.1 = 0
  Portb.2 = 0
  Escala = 1
  Return

  '----------------
  Rotina2:
  Portb.0 = 0
  Portb.1 = 1
  Portb.2 = 0
  Escala = 2
  Return

  '---------------
  Rotina3:
  Portb.0 = 0
  Portb.1 = 0
  Portb.2 = 1
  Escala = 3
  Return

 

Basta clocar o tempo que você quer em milissegundos na variável Limite_dado.

 

Esse tempo pode ser mudado em tempo real no programa também.

 

O que vai te deixar maluco é o porque no inicio eu configuro o contador do Timer2 com 125, mas antes de sair da interrupção coloco ele com 132 ...  Se fizer a conta, verá que para interromper o Timer2 em exatos 1 milissegundo precisaria recarregar com 125. Deixo para voce pesquisar, meu amigo !

 

Repare que os tempos estão bem precisos, com menos de 1 milissegundo de erro em cada 10 segundos.

 

Existe uma outra maneira, usando os dois Timers e acionando uma interrupção de Int0 ou Int1, que permite a temporização exata, sem nenhum erro, só dependendo da precisão de seu cristal.... eu usei isso em um exemplo anterior cerca de uma semana atrás.

 

Agora você já pode comemorar indo no "ninjo da coruja" tomar um choppinho...

 

Ou um pedaço de pizza no "Vesúvio" kkkk

 

Paulo

Poxa valeu mano, desculpe a demora em responder e que um amigo meu morreu e tive que ir no enterro dele, como minha terra natal e longe de onde eu estou morando fiz uns reboliços e fiquei sem net um tempo... mas valeu mesmo.

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

8 horas atrás, aphawk disse:

@lucianolcoa ,

 

Ué, você está em Jundiaí, é isso ?

Eu vou até aí quase toda semana heheheh !

 

Espero que esse exemplo lhe seja útil.

 

Paulo

Sim, mas eu nasci em em brasilia, foi uma morte tragica, virou ate noticia de jornal

http://g1.globo.com/distrito-federal/noticia/2016/10/motorista-perde-controle-de-carro-invade-bar-e-mata-garcom-no-df.html

brincava junto quase todo dia com o irmão mais novo do sujeito quando eramos crianças,era familia unida mesmo. Foi uma fatalidade.

Link para o comentário
Compartilhar em outros sites

@aphawk Eu ainda não desisti do meu projeto de relogio, havia feito um relogio cronometro no bascom e queria adaptar um calendario que nem o intrudera também. Desisti pois as linhas de código passaram os 4kb da versão demo que utilizo. Então escolhi tirar o cronometro e por o calendário. E assim eu "consegui". Coloquei consegui entre aspas pois ahe que começa o meu problema. Configurei o timer1 para exatos 1 segundo, e de fato ia 1 segundo, ate contei num relogio qualquer. Mas quando passa 1 hora , sabe Deus por que, atrasa exatos 3 minutos, e por ahe vai. Deixei de um dia pro outro. Das 8 da noite as 8 da manhã, e atrasou um pouco mais de 30 minutos. Então, tenho um "problema"

Utilizo 4 botões, um para setar "paramais", outro para setar "paramenos" um que vai setando entre horas,minutos,meses,dias,anos e alarme e o ultimo botao desliga o alarme

Agora vai meu código fonte:

---------------------------

$regfile = "m328Pdef.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 16
$framesize = 32



Config Portd = Output
Config Portb.0 = Input
Config Portb.1 = Input
Config Portb.2 = Input
Config Portb.3 = Input
Config Portc.0 = Input
Config Portc.1 = Input
 Config Portc.2 = Input

Config Portb.4 = Input

Config Portb.5 = Output

Dim Hora As Integer
Dim Minuto As Integer
Dim Segundo As Integer
Dim Ajuste As Integer


Dim Vai As Integer
Dim Dia As Integer
Dim Mes As Integer
Dim Ano As Integer
Dim Limite As Integer
Dim Alarmehora As Integer
Dim Alarmeminuto As Integer

 Alarmehora = 10

Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1

Sinal Alias Portb.5
Sinal = 0



Botaohora Alias Pinb.0
Botaominuto Alias Pinb.1
Botaovetor Alias Pinb.2
Botaoalarme Alias Pinb.3
Botaocronometro1 Alias Pinb.4

Ano = 16
Dia = 1
Config Lcdpin = Pin , E = Portd.2 , Rs = Portd.3 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
Config Lcd = 16 * 2
Config Timer2 = Timer , Prescale = 128 , Async = On


Enable Interrupts
Enable Timer2
On Timer2 Pulso



 Do
 Start Timer2


      If Segundo >= 60 Then
 Segundo = 0
 Minuto = Minuto + 1
 End If
 If Minuto >= 60 Then
 Minuto = 0
 Hora = Hora + 1
 End If
 If Hora >= 24 Then
 Dia = Dia + 1

 Hora = 0
 End If
 If Segundo < 0 Then
 Segundo = 0
 End If
 If Minuto < 0 Then
 Minuto = 0
 End If
 If Hora < 0 Then
 Hora = 0
 End If


 Locate 1 , 1
 Lcd "hora:"
   Lcd Hora ; ":" ; Minuto ; ":" ; Segundo
   Locate 2 , 1
   Lcd "d:"
    Lcd Dia ; "/" ; Mes ; "/20" ; Ano
    If Botaohora = 0 And Ajuste = 1 Then
    Waitms 300
    Hora = Hora + 1
    End If
    If Botaominuto = 0 And Ajuste = 1 Then
    Waitms 300
    Hora = Hora - 1
    End If
    If Botaohora = 0 And Ajuste = 2 Then
    Waitms 300
    Minuto = Minuto + 1
    End If
    If Botaominuto = 0 And Ajuste = 2 Then
    Waitms 300
    Minuto = Minuto - 1
    End If
    If Botaohora = 0 And Ajuste = 3 Then
    Waitms 300
    Mes = Mes + 1
    End If
    If Botaominuto = 0 And Ajuste = 3 Then
    Waitms 300
    Mes = Mes - 1
    End If
    If Botaohora = 0 And Ajuste = 4 Then
    Waitms 300
    Dia = Dia + 1
    End If
    If Botaominuto = 0 And Ajuste = 4 Then
    Waitms 300
    Dia = Dia - 1
    End If
    If Dia > Limite Then
    Dia = 1
    Mes = Mes + 1

    End If
    If Dia < 1 Then
    Dia = Limite
    End If
      If Botaohora = 0 And Ajuste = 5 Then
      Waitms 300
      Ano = Ano + 1
      End If
      If Botaominuto = 0 And Ajuste = 5 Then
      Waitms 300
      Ano = Ano - 1
      End If

      If Botaohora = 1 And Ajuste = 6 Then

Locate 1 , 14
      Lcd "ALH"

      Locate 2 , 14
      Lcd Alarmehora
      End If
      If Botaohora = 1 And Ajuste = 7 Then
      Locate 1 , 14
      Lcd "ALM"
      Locate 2 , 14
      Lcd Alarmeminuto

      End If

      If Botaohora = 0 And Ajuste = 6 Then
      Waitms 300
      Alarmehora = Alarmehora + 1
      End If

      If Botaominuto = 0 And Ajuste = 6 Then
      Waitms 300
      Alarmehora = Alarmehora - 1

      End If
      If Botaohora = 0 And Ajuste = 7 Then
      Waitms 300
      Alarmeminuto = Alarmeminuto + 1
      End If

       If Botaominuto = 0 And Ajuste = 7 Then
       Waitms 300

       Alarmeminuto = Alarmeminuto - 1
       End If

        If Alarmehora = Hora And Alarmeminuto = Minuto Then

        Sinal = 1
        Waitms 300
        Sinal = 0

        End If
           If Botaoalarme = 0 Then
           Waitms 300
           Alarmeminuto = Alarmeminuto - 2
           End If


      If Alarmehora > 24 Then
      Alarmehora = 0
      End If
      If Alarmehora < 0 Then
      Alarmehora = 24
      End If
      If Alarmeminuto >= 60 Then
      Alarmeminuto = 0
      End If
      If Alarmeminuto < 0 Then
      Alarmeminuto = 59
      End If

      If Ano < 16 Then
      Ano = 16
      End If
      If Ano > 36 Then
      Ano = 16
      End If


    If Mes > 12 Then
    Mes = 0
    End If
    If Mes < 0 Then
    Mes = 12
    End If

    If Mes = 1 Then
    Limite = 31
    End If
    If Mes = 3 Then
    Limite = 31
    End If
    If Mes = 5 Then
    Limite = 31
    End If
    If Mes = 7 Then
    Limite = 31
    End If
    If Mes = 8 Then
    Limite = 31
    End If
    If Mes = 10 Then
    Limite = 31
    End If
    If Mes = 12then
    Limite = 31
    End If

    If Mes = 2 Then
    Limite = 28
      End If
    If Mes = 4 Then
    Limite = 30
    End If
    If Mes = 6 Then
    Limite = 30
    End If
    If Mes = 11 Then
    Limite = 30
    End If
    If Mes = 9 Then
    Limite = 30
    End If



    If Botaovetor = 0 Then
    Waitms 300
    Ajuste = Ajuste + 1
    End If
    If Ajuste >= 8 Then
    Waitms 300
    Cls


    Ajuste = 1
    End If


 Loop
 Pulso:
 Segundo = Segundo + 1
 Return
 '--------------------

 '-------------








 End
 

Link para o comentário
Compartilhar em outros sites

@lucianolcoa ,

 

Bom, só vi uma coisa errada : você colocou o comando START TIMER2 dentro do loop formado pelo comando DO, o correto é colocar ele ANTES do comando DO. Talvez seja isso que esteja deixando a temporização errada.

 

Eu simulei o seu programa depois que acertei a posição do START TIMER2, e a temporização me pareceu perfeita. Se não for isto, é o seu cristal de 32768 que deve estar doido.

 

Agora, me permita algumas observações :

 

1- Existe uma maneira muito mais simples de incrementar toda a contagem relativa a um relógio calendário , veja na página #17 , logo no início, eu coloquei um programa que usa o comando CONFIG CLOCK , ele faz tudo de forma automática, e seu código diminuirá bastante. Estude ele no Help do Bascom, pois tem uma versão adequada para o caso de usar o Timer2 Async com um cristal de 32768.

 

2- Quanto ao incremento manual , que você faz ajustando as datas via botão, você pode criar uma tabela com os dias de cada mês, e outra tabela indicando os anos bissextos, e utilizar elas tanto no acerto da data normal como no acerto do alarme.

 

3 - Um monte de If... Endif facilita a programação, mas acaba aumentando o tamanho. Organize melhor, usando as estruturas SELECT CASE   e a IF... ELSEIF ... ENDIF, e isso vai te otimizar ainda mais o código.

 

Tenho certeza que com isso feito todo o seu programa com o calendário vai caber na versão demo mesmo.

 

Paulo

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

  • mês depois...

Aphawk novamente preciso da sua ajuda meu brother. Uma duvida, pesquisei no google e não entendi direito. Eu queria contar o numero de interrupções entre num estouro de timer no bascom, como eu faria isso? Tipo, configuro o timer para 1 segundo, e num pino de attac eu va recebendo inputs de um sensor, eu queria contar quantos inputs por segundo eu recebi do sensor.. So queria um exemplo de um codigo que faz isso para eu estudar seu funcionamento.

Link para o comentário
Compartilhar em outros sites

Faz o XOR do bit 0 e do bit 3, se o XOR destes bits for 1 o mês tem 31 dias se for 0 tem 30, mas testa antes se o mês é 2, que foge a regra, e testa se é bissexto

 

Citação

Dim Bissexto As Boolean

Dim Var1word As Word

Dim Var2word As Word

Dim NDias As Byte

Dim Var1byte  As Byte

 

' Fornece o número máximo de dias do mês na variável NDias

 

Sub Diasmes(ano_ent As Word , Mes_ent As Byte )

   Local Div4 As Word

   Div4 = Ano_ent And 3                                     ' equivalente a Mod 4, e se é maior que 0 não é divisível

   If Div4 > 0 Then
      Reset Bissexto
   Else
      Set Bissexto
      Var2word = Ano_ent Mod 400                            ' se é maior que 0 não é divisível
      Var1word = Ano_ent Mod 100                            ' se é maior que 0 não é divisível
      If Var1word = 0 And Var2word > 0 Then
         Reset Bissexto
      End If
   End If
   If Mes_ent = 2 Then
      Ndias = 28 + Bissexto
   Else
      Var1byte = Mes_ent And &B00001001
      If Var1byte = &B00001000 Or Var1byte = &B00000001 Then
         Ndias = 31
      Else
         Ndias = 30
      End If
   End If

End Sub

 

Estou meio enferrujado no Bascon mas esta rotina está testada e funciona.

Link para o comentário
Compartilhar em outros sites

@lucianolcoa ,

 

Você configura uma interrupção do Timer, por exemplo para 1 segundo.

Aí, você configura uma outra interrupção, usando um dos pinos dedicados para facilitar, por exemplo o Into ou o Int1.

Inicialmente habilita apenas a interrupção do Timer.

 

Dentro da interrupção do Timer,  você habilita a interrupção no pino desejado, e sai.

 

A cada interrupção no pino desejado , você incrementa um contador de interrupção, e sai.

 

Quando houver outra interrupção do Timer, você desabilita a interrupção do pino, e verifica a contagem que houve, e ao final, zera a contagem. Quando precisar contar de novo, repete o processo todo.

 

Algo desse tipo é bem simples de se fazer.

 

Paulo

 

Link para o comentário
Compartilhar em outros sites

Aphawk, valeu pela dica, consegui "implementar" mais ou menos. Falo mais ou menos que meu codigo esta passando a velocidade em numeros inteiros, queria que passasse quebrados, o vulgo "float" do arduino. Desisti de fazer isso no arduino pois o cristal dele oscila e ele perde a "precisao" sabe Deus por que.. No bascom quando fiz o reloginho que voce me ajudou ta a duas semanas firme e forte na minha casa:). A programação atrasa 1 minuto a cada 2 semanas mas isso e uma coisa que da pra se conviver:).

Bom mas voltando ao assunto, me permita explicar, um de meus hobbys e andar longas distancias com uma bicicleta. E pensando em tal descidi criar um velocimetro com indicador e distancia pra ela, por enquanto to ajustando o velocimetro, pois a logica da distancia não é difícil de implementar. Queria sua ajuda para passar a velocidade "quebrada" e não inteira, afim de obter mais precisão...

Segue o meu codigo por enquanto apenas com a velocidade calculada:

$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack=40
$swstack=16
$framesize = 32



Config Portd.3 = Output
Led Alias Portd.3
Led = 0

Config Int0 = Low Level

Config Timer1 = Timer , Prescale = 256
Timer1 = 3036
Enable Interrupts
Enable Timer1
Enable Int0
On Int0 Contar
Start Timer1
On Timer1 Pulso:


 Dim Contagem As Integer
 Dim Contagem1 As Long
 Dim Contagem2 As Long



Do

Loop
Pulso:
Contagem1 = Contagem
Contagem1 = Contagem1 * 2.07
Contagem2 = Contagem1 * 3.6
  Print Contagem1 ; "m/s e em km/h:" ; Contagem2
Contagem = 0
Return
Contar:
Incr Contagem
Return



End

 

Link para o comentário
Compartilhar em outros sites

@lucianolcoa ,

 

Bom.... tudo bem que você está iniciando, mas acho melhor iniciar da maneira correta !

 

Sempre que você usa uma interrupção, a regra de ouro é a seguinte : faça apenas o necessário nela, ou seja, sempre tente sair dela o mais rápido possível !

 

Isso de querer computar valores e mostrar resultados, dentro de uma rotina de interrupção, vai sempre te criar problemas como perda de pulsos de contagem.

 

O seu problema que só mostrava resultados inteiros foi porque você declarou as variáveis como Long, que na verdade só podem ser números inteiros, embora possam ser bem grandes !

 

A maneira correta é declarar como Single, que são do tipo ponto flutuante de simples precisão, que já é mais do que o suficiente para ter o resultado com algumas casas decimais precisas.

 

Modifiquei um pouco o seu programa, resolvendo o seu possível problema de interrupção, e usando uma função do Bascom que já acrescenta uma máscara ao mostrar o resultado, no caso eu defini que quero os resultados mostrados com apenas 1 casa depois da vírgula. Veja a instrução Fusing .

 

Segue o seu programa, mais bem "escrito" :

 

$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack=40
$swstack = 32
$framesize = 32
Baud = 9600

Dim Contagem As Word
Dim Contagem1 As Single
Dim Contagem2 As Single
Dim Pode_mostrar As Bit


Config Portd.3 = Output
Led Alias Portd.3
Led = 0

Config Int0 = Low Level

Config Timer1 = Timer , Prescale = 256
Timer1 = 3036

On Int0 Contar
On Timer1 Pulso

Pode_mostrar = 0
Start Timer1
Enable Timer1
Enable Int0
Enable Interrupts


Do
  If Pode_mostrar = 1 Then
      Contagem1 = Contagem
      Contagem1 = Contagem1 * 2.07
      Contagem2 = Contagem1 * 3.6
      Print Fusing(contagem1 , "##.#") ; " m/s ou " ; Fusing(contagem2 , "##.#") ; " km/h"
      Contagem = 0
      Pode_mostrar = 0
  End If
Loop

Pulso:
Timer1 = 3036
Pode_mostrar = 1
Return

Contar:
Incr Contagem
Return

End

Quanto ao seu relógio, pode apostar que o problema é o seu cristal oscilador....

 

Paulo

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

@aphawk Graças as suas mudanças apenas implementei os buttons de configuração e também o suporte ao display lcd, como a minha duvida pairava apenas em como configurar os pulsos para calcular a velocidade, dou minha missão esta por concluída... Mas para receber o seu aval final, posto aqui o código completo:

$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 16
$framesize = 32

 Config Pinb.1 = Input
 Config Pinb.2 = Input
Config Pinb.3 = Input
Config Pinb.4 = Input
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Config Portb.0 = Output
Botao1 Alias Pinb.1
Botao2 Alias Pinb.2
Botao3 Alias Pinb.3
Botao4 Alias Pinb.4
Config Lcd = 16 * 2
Config Lcdpin = Pin , E = Portd.3 , Rs = Portd.4 , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0

Botao2 = 1
Botao1 = 1
Botao3 = 1


Config Int0 = Low Level

Config Timer1 = Timer , Prescale = 256
Timer1 = 3036
Enable Interrupts
Enable Timer1
Enable Int0
On Int0 Contar

On Timer1 Pulso:

 Stop Timer1
 Dim Contagem As Integer
 Dim Contagem1 As Single
 Dim Contagem2 As Single
 Dim Contagem3 As Single
 Dim Mudanca As Integer
 Dim Distancia As Single
 Dim Distancia1 As Single
 Dim Distancia2 As Single
 Dim Distancia3 As Single
 Dim Distancia4 As Single
 Dim Podemostrar As Byte
  Podemostrar = 0





Do

If Botao1 = 0 Then
Waitms 300
Mudanca = Mudanca + 1
End If
If Mudanca = 3 Then
Mudanca = 1
End If
If Botao2 = 0 And Mudanca = 1 Then
Waitms 300
Distancia = Distancia + 10
End If
If Botao3 = 0 And Mudanca = 1 Then
Waitms 300
Distancia = Distancia + 100
End If
If Botao2 = 0 And Mudanca = 2 Then
Waitms 300
Distancia = Distancia - 10
End If

If Botao3 = 0 And Mudanca = 2 Then
Waitms 300
Distancia = Distancia - 100
End If
If Distancia < 0 Then
Distancia = 0
End If

If Botao4 = 0 Then
Do

Waitms 300
Start Timer1
If Podemostrar = 1 Then
Contagem1 = Contagem
Contagem1 = Contagem1 * 2.07
 Distancia1 = Distancia2 * 2.07
Contagem2 = Contagem1

Distancia = Distancia - Distancia1
Distancia4 = Distancia / Contagem2
If Distancia4 > 60 Then
Distancia4 = Distancia4 / 60
Else
Distancia4 = Distancia4 * 1
End If

If Distancia4 = 0 Then Goto Rotina



Locate 2 , 1
  Lcd Fusing(distancia4 , "##.#") ; "t.e/m  " ; Fusing(distancia , "##.#")
  Volta:
  Locate 1 , 9

Lcd Fusing(contagem1 , "##.#") ; "m/s"
Contagem = 0
Distancia2 = 0
Podemostrar = 0
End If


Loop Until Botao4 = 1

End If


If Botao4 = 1 Then
Stop Timer1

Waitms 500
Locate 1 , 1

Lcd Fusing(distancia , "##.#")
End If






Loop
Pulso:
Podemostrar = 1

Return
'-----------------
Contar:
Incr Contagem
Incr Distancia2
Return
'-------------------------
Rotina:
Locate 2 , 1
Lcd "vei.stop"
Goto Volta



End

Pode haver erros tais quais um amador como eu não está habituado, eu senti pelo menos nas simulaçoes que o botao demorava demais pra inputar as distancias as vezes até enguiçava... Mas como um todo gostei bastante do resultado.

Link para o comentário
Compartilhar em outros sites

@lucianolcoa ,

 

Opa, como tudo na vida, é uma questão de prática !

 

O que importa é que você já conseguiu fazer o que queria, e mesmo usando a versão gratuita do bascom !

Não tive tempo de analisar seu código, mas me parece que é possível otimizar bastante essa parte de botões.

 

Dá uma olhada na função Debounce()  , veja no Help do Bascom, é uma função muito legal que já faz o debounce do botão e pode transferir para um determinado trecho de programa, ou até mesmo chamar uma sub-rotina onde você faz o tratamento do que esse botão deveria fazer.

 

De noite eu dou uma olhada na simulação disso e te falo mais alguma coisa.

 

De qualquer maneira, parabéns heheh !

 

Paulo

 

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

@lucianolcoa ,

 

Tive de viajar e só voltei agora, não tive tempo de simular, mas ví que mais uma vez voce esqueceu de recarregar o TIMER1 com o valor 3036 quando ocorre a rotina de interrupção !

Repare que no programa rearranjado que eu postei, dentro da rotina de interrupção PULSO, eu recarrego o Timer1 antes de sair da interrupção !

 

Paulo

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

  • 3 semanas depois...

Ae mestre Paulão @aphawk ... Meu primeiro projeto físico com AVR, vou usar o a ATmega2560 por ele ter mais de uma porta serial. Ainda  estou na fase da montagem física (trabalheira da po&%$*#) mas uma hora fica pronto.

 

Depois disso vai ser uma CNC, o controle principal será o arduino uno mesmo mas vou criar controle de velocidade para o spindle, monitoramento de temperatura e outros e para isso será AVR... eu devia ter começado pela CNC pois ela me permitiria criar novas peças pro robô.

 

Vs3ecEb.jpg

 

6bBJpX1.jpg

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

@test man*~ ,

 

Opa legal !!!!!

 

Eu iria por um caminho mais simples : usaria um Atmega1284P, que é DIP 40 pinos ainda, e implementaria uma segunda serial por software mesmo. No fórum do Bascom existem vários exemplos sobre isso.

 

Mas pelo que ví você escolheu usar um Arduino 2560, então manda bala com ele mesmo hehehe !

 

Vai mantendo a gente informado !

 

Paulo

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

A vantagem de usar a própria placa do arduino (vou usar o BASCOM usarei apenas o hardware do arfuino) é que ela é bem bonitinha e já existem várias coisas pré preparadas pra ela, vou usar aquele protoshield (da foto) para colocar os buffers das entradas analógicas (sem eles os servos ficam loucos) além de um FT232 pois vou usar as linhas RTS/CTS/DTR na comunicação com o PC... Pela facilidade que as placas arduino oferecem elas acabam me puxando para elas... Se eu criar a placa ela não ficaria tão bonita quanto o protoshield (quando eu montar a CNC ela ficará xD)...


Mas realmente sua solução seria a mais inteligente, a serial do hardware ficaria para comunicação com o PC e a por software com o outro controlador (ATmega328 neste caso)!

 

Valeu ae!

Link para o comentário
Compartilhar em outros sites

@test man*~ ,

 

Olha, eu estou torcendo para você fazer logo esse seu CNC, e assim que você evoluir e fizer uma CNC para PCB com uma boa precisão, eu compro se você quiser vender !!!!!

 

Realmente hoje tem um monte de projetos de CNC com um código open feito para Arduíno, que já aceita os comandos do  Mach3, e roda em um Arduíno Uno mesmo.

 

Imagino o que pode ser feito num Arduíno Mega2560 !

 

Gostei de ver esse seus drivers.... parecem bem parrudos ! Vai controlar um motor de Fusca neles ????? kkkkk

 

Paulo

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

HAuHUaHUahUAhUAH, esses servos são famintos por potência e como pretendo ler a posição deles eu queria deixar a tensão o mais estável possível.

 

Resolvi comprar aquelas placas prontas para o regulador LT1083 e então modificar para fornecer 7 volts fixos (um dos servos tem sua tensão máxima de 6V mas o bichinho aguentou bem até agora); e lendo o datasheet do LT percebi que desde que a temperatura não passasse de 80°C a tensão fornecida por ele seria excelente para a minha aplicação, então resolvi colocar um dissipador de calor maior do que o que vem no kit e também um cooler, porém eu quebrei a cara... Cometi um erro, um não, vários... Considerei que a corrente normal drenada seria a corrente máxima dos servos (quando eles estão travados), outro erro foi que achei que o potenciômetro de feedback do servo estava ligado diretamente à alimentação do servo mas não está o servo possui um regulador interno. Os servos não estão fazendo nem cócegas no LT e nem muito menos na fonte principal (12V 20A)...

 

Isso tudo pois achei que conseguiria fazer o robô ser bem preciso mas ele está longe de ser tão preciso quanto eu queria AUHauHauHauHAuHAuHAU, para a precisão que eu queria o robô deveria usar motores de passo no lugar dos servos...

 

Quanto à CNC... Até onde eu dei uma lida da para deixar ela bem precisa ela pode até ficar lenta, mas a precisão é garantida (desde que a estrutura seja boa com anti-backslash, bem rígida, motores fortes e coisas do tipo). Se aumentar o microstepping ela fica mais precisa mas o torque dos motores cai, aumentando a tensão dos motores de passo o torque aumenta novamente, mas a tensão é limitada pelo driver do motor e por ai vai...  Ká estou viajando já!!!! Mas isso é coisa para o futuro esse robô ainda tomará muito tempo, já coloquei ele em hold de novo... Agora eu só mexo com ele em fevereiro =D

 

Nossa, falei de mais VIXI!!!! Mas vou postar mais isso, quem sabe é útil para alguém um dia. Seguem as modificações que eu fiz no módulo do LT1083:

 

Original

BFj0hkJ.png

 

Modificado

7mXqHe9.png

 

Modulo original

iDYCANH.png

 

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

  • mês depois...

Dando continuidade ao Robô xD...

 

Aqui está o Protoshield com os amplificadores operacionais para as tensões de feedback dos servos, Zenner para tensão de referência, Buzzer, botão para pânico e o FT232. Não ficou tão bonito mas ao menos está funcional =D

eu9h0AI.jpg

 

F5KHQOq.jpg

 

C4K5NZx.jpg

 

Aqui está o Gripper do robô montado, para pegar objetos usando sucção.

etEQXJS.jpg

 

7wxBn1Z.jpg

 

Daqui a pouco chega na parte da programação hehe, a placa de controle faz praticamente tudo (eu ia criar uma, mas quando vi que já havia uma que fazia tudo que eu queria resolvi pegar uma pronta). O trabalho será só criar modos de execução do robô, como movimentos por ensinamento (ensinar ele a se mover com a mão), comando através da interface, controlar usando acelerômetro (talvez) e por ai vai.

B1RS7bM.jpg

 

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

Problema com o Proto Shield (Prototype Shield) e USBasp

 

Estava com problemas ao tentar usar o USBaso conectado ao Prototype Shield para o Arduíno Mega, quando eu o usava conectado diretamente ao Arduíno ele funcionava normalmente mas quando eu tentava us-alo conectado ao Prototype Shield ele não conseguia se comunicar com o ATmega2560:

 

64eDdMB.png

 

Apertando o botão de RESET (mantendo o ATMega resetado manualmente) o USBasp conseguia se comunicar normalmente, ao medir a tensão do pino RESET percebi que ela ia para 2,6~3,2V quando o USBasp tentava se comunicar, essa tensão não é suficientemente baixa para colocar o ATmega2560 em reset para o programador poder se comunicar com ele.

 

Depois de tentar várias coisas (Remover capacitores da linha de RESET, cortar  o pad RESET EN do Arduíno)  resolvi meio que fazer uma engenharia reversa da linha de RESET:

 

O9TUSLZ.jpg

 

 O Proto Shield possui um resistor de 150R que acaba ficando em paralelo com o resistor de 10KR da placa do Arduíno (150||10K = 147.8); e esse conjunto fica em série com o resistor de 120R do USBasp... Daí quando o USBasp colocava 0 (zero) em seu pino de RESET para colocar o ATmega em RESET a tensão cai apenas para ~2,76V.

 

Para solucionar o problema basta remover o resistor de 150R do Prototype Shield:

 

u2DFV7Y.jpg

 

QrrmqhL.jpg

 

Assim o problema é solucionado e a tensão de RESET começa a ir a zero.

ATmega2560 detectado: :D

 

1VMfaFT.png

 

 

 

  • Curtir 2
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...