Ir ao conteúdo
  • Cadastre-se

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


Ir à solução Resolvido por aphawk,

Posts recomendados

Intruder,

Compilou de cara comigo....

Report       : teste
Date : 10-29-2013
Time : 23:57:08

Compiler : BASCOM-AVR LIBRARY V 2.0.7.7
Processor : M1280
SRAM : 2000 hex
EEPROM : 1000 hex
ROMSIZE : 20000 hex

ROMIMAGE : 51FC hex -> Will fit into ROM
ROMIMAGE : 20988 dec
FLASH USED : 16 %
BAUD : 57600 Baud
XTAL : 16000000 Hz
BAUD error : 0.79%

Stack start : 21FF hex
Stack size : 40 hex
S-Stacksize : 80 hex
S-Stackstart : 21C0 hex
Framesize : 100 hex
Framestart : 2040 hex
Space left : 6651 dec

A minha versão é oficial.....

Quanto ao que você falou sobre ser um prazer programar com o Bascom, concordo plenamente com você !

Já ví que você era da época do Apple.... eu programei para o 8080, Z-80, 6502, 8088, 80186, e 80286 , tudo em Assembler também.....

E para o Apple, fiz coisas muito legais, até participei da re-escrita das funcões no firmware da placa do CPM, lembra ?

Dentro da Eprom, tinha um código que era dividido entre os processadores Z-80 , que devolvia o controle para o 6502, que devolvia pro Z-80.....

Reescrevemos TODA a Eprom para rodar todinha em Z-80 ! Ficou muito mais rápido !

Também fiz um programa para o VideoTexto, lembra ???? Em assembler 6502......

Claro que eram outros tempos, e como você, hoje eu também não consigo entender essa linguagem C de jeito nenhum....

Faço tudo com o Bascom, tanto que até comprei o programa oficialmente, e ter acesso às ultimas versões e ao excelente suporte, que nunca me deixou na mão.

Sugiro que você também compre, e compre direto do site da MCS, por download , eles te mandam a licença por email, você instala e pronto !

Sai bem barato , muito mais em conta do que comprar dos representantes aqui no Brasil.

Paulo

Link para o comentário
Compartilhar em outros sites

A minha versão também é oficial , que comprei direto da MCS (eu não costumo comprar com muita frequência, mas nesse caso valeu a pena).

Imagino que o fato de não conseguir compilar seja alguma configuração de compilação (o Bascom é cheio delas) que estou usando que está me dando dor de cabeça.

Então você é da velha guarda (como eu).

Eu nunca tive um Apple II, mas tive contato com um que tinha uma placa CPM 80, o que eu tinha mesmo era um TK2000, que era um "clone" fajuto do Apple II. Eu acabei conseguindo o mapa da BIOS da revista Microsistemas (imagino que você se lembre dela) do Apple II e fiz uma rotina em assembler para achar as correlações entre a BIOS do Apple II e o TK 2000, elas eram muito semelhantes mas tinhas pequenas diferenças (endereço das rotinas principalmente), fazendo isto eu acabei com um mapa da BIOS do TK 2000, que comecei a usar para brincar com assembler (em linha de comando é mole). No tempo dele eu tentei fazer uma rotina em assembler para escalonar matrizes (eu tinha é coragem na época), mas infelizmente acabei desistindo, o trabalho se mostrou complicado demais.

Tive um MSX Hotbit (da Sharp). Eu não parei enquanto não descobri uma forma de fazer cópia digital das fitas K7 (copia analógica eu já fazia usando fita de cromo e um tape deck), foram algumas semanas fazendo dessabler para quebrar a proteção dos programas que rodavam ao carregar da fita K7, feito isso foi uma festa (e um enorme prazer pelo feito).

Tenho muito mais causos (do tempo do bit das cavernas), mas agora não estou com tempo para contar. Mais tarde posto mais algumas coisas. Como o que eu fiz com um TK 85, PC XT (no tempo do DOS), CP 500, TRS 80, cheguei a ter contato com um leitor de disquetes de 8" no estágio, você provavelmente se lembra dele.

O seu nível pelo visto é muito mais alto do que o meu (nunca cheguei a fazer nada tão complexo como reescrever uma BIOS), programar para mim era "quase" uma brincadeira, que comecei quando estava no segundo grau e continuei na Universidade (no meu caso fiz Eng. Mecânica), e lá brincava com o Pascal (que achava, e ainda acho, a melhor e mais elegante linguagem de programação). Hoje estou pouco ativo (na programação) e bem enferrujado. Não tenho mais pique (e nem tempo) para as coisas que fazia antigamente.

Link para o comentário
Compartilhar em outros sites

Opa, lembro sim, eu comecei com um Sinclair ZX-80 original, depois tive um Tk-85 que tinha de tudo dentro, tinha RAM extra de vídeo, e usava para fazer TX/RX de rtty e código morse, bons tempos !

O trabalho mais enrolado que fiz nessa época foi fazer um Bios oficial para IBM-PC XT em uma multinacional, era um projeto para a Petrobras, um computador para uso em navios, e aquela época tinha a tal de SEI que só tinha corrupto nela, foi um sufoco, um anos de trabalho de três engenheiros para depois descobrir que nunca ia ser dada a autorização para fabricação, a menos que se fechasse as placas prontas com uma certa empresa nacional enorme que existe até hoje..... e ainda ser ameaçado por um cara em Brasília de que não poderia sair daquela sala o assunto ou a empresa que eu trabalhava ia perder todos os projetos que tinha com as empresas de energia elétrica ! Ou seja, as coisas que vemos hoje vem de muiiiito tempo atrás .... !

Pelo menos aprendí muito com um pessoal que veio para o Brasil ajudar nesse projeto, da Faraday USA.

Trabalhei com um sistema de desenvolvimento Geppeto ( Z-80A) que tinha dois disquetes de 8" ...... façe simples !!! Se não me engano, cabiam 120 K em cada um !!!!!!

Com o tempo, acabei fazendo aplicações tipo TSR que ficavam residente via MS-DOS e comunicavam com interfaces gráficas feitas com o GW-BASIC, elas conversavam com hardwares dedicados e se comunicavam com o GW-BASIC, era muito legal ver isso funcionar.

Hoje, devido ao uso com o GW-BASIC, me sinto muito à vontade com o Bascom, uso em meus hobbies, e pelo jeito você também está na mesma que eu heheheh .

Um abraço !

Paulo

Link para o comentário
Compartilhar em outros sites

Porque não continuou com Delphi?

Delphi hoje ja esta no XE5,compilando direto para Android.

Caso ja conheça,desconsidere.

Cheguei a trabalhar com o Delphi por algum tempo, gostava muito dele, mas infelizmente na empresa onde trabalhava o pessoal preferia o VBA, mesmo o Delphi sendo muito melhor, e eu detestava o VBA (em comparação com o Delphi ele era horrível).

Eu nunca cheguei a dominar bem programação orientada a objeto, e isto fazia muita falta no Delphi, sem um bom conhecimento de OO não se usa o Delphi com muita eficiência (e fica muito ruim para desenvolver interface, o que era o meu calo), no máximo se quebra o galho. Acabei não tendo tempo de aprender direito a usar o Delphi (e nem OO), pois acabei desenvolvendo para WEB. Acho que esqueci 99% do pouco que sabia dele, já tem mais de 10 anos que larguei totalmente a informática (voltou a virar hobbi).

Não cheguei a conhecer esta versão do Delphi com suporte a android, ela deve ser interessante, mas imagino que se precise muito de OO (o que para um macaco velho como eu é bem complicado de aprender atualmente), mas para uso científico pode ser interessante, e também para interface entre Android e Adruino.

Opa, lembro sim, eu comecei com um Sinclair ZX-80 original, depois tive um Tk-85 que tinha de tudo dentro, tinha RAM extra de vídeo, e usava para fazer TX/RX de rtty e código morse, bons tempos !

O trabalho mais enrolado que fiz nessa época foi fazer um Bios oficial para IBM-PC XT em uma multinacional, era um projeto para a Petrobras, um computador para uso em navios, e aquela época tinha a tal de SEI que só tinha corrupto nela, foi um sufoco, um anos de trabalho de três engenheiros para depois descobrir que nunca ia ser dada a autorização para fabricação, a menos que se fechasse as placas prontas com uma certa empresa enorme que existe até hoje..... e ainda ser ameaçado por um cara em Brasília de que não poderia sair daquela sala o assunto ou a empresa que eu trabalhava ia perder todos os projetos que tinha com as empresas de energia elétrica ! Ou seja, as coisas que vemos hoje vem de muiiiito tempo atrás .... !

Pelo menos aprendí muito com um pessoal que veio para o Brasil ajudar nesse projeto, da Faraday USA.

Trabalhei com um sistema de desenvolvimento Geppeto ( Z-80A) que tinha dois disquetes de 8" ...... façe simples !!! Se não me engano, cabiam 120 K em cada um !!!!!!

Com o tempo, acabei fazendo aplicações tipo TSR que ficavam residente via MS-DOS e comunicavam com interfaces gráficas feitas com o GW-BASIC, elas conversavam com hardwares dedicados e se comunicavam com o GW-BASIC, era muito legal ver isso funcionar.

Hoje, devido ao uso com o GW-BASIC, me sinto muito à vontade com o Bascom, uso em meus hobbies, e pelo jeito você também está na mesma que eu heheheh .

Um abraço !

Paulo

"Bons tempos", ou pelo menos tempos heroicos da informática em que computador era para poucos, hoje qualquer pessoa "acha" que conhece informática. E imagine que eu cheguei a aprender a programar fortran, cobol, assembler (de alguns processadores), estudar a fundo a estrutura dos PCs XT, mas não fui muito além do 8088 e do 8087, quando entrei na era dos PCs de 32 bits já estava desenvolvendo para WEB, e em algum momento enchei o saco disso e voltei a ser engenheiro de verdade.

Atualmente programação é como ferramenta para engenharia (VBA em planilhas excel, está facilitado muito a minha vida), e agora um pouco de Bascom (que para mim está sendo o retorno ao prazer de programar). Continuo não tendo muito interesse em VB, ainda prefiro o delphi e o velho pascal (a melhor linguagem que já foi criada). Mas infelizmente estou tremendamente enferrujado, e qualquer coisa que eu queira fazer com ele vai dar muito trabalho (até que eu tire a ferrugem de décadas), e imaginar já fiz alguma coisa combinando Delphi (pascal) e assembler, em trechos críticos (para ganhar velocidade na execução do programa), isto trabalhando num projeto de Pesquisa Operacional.

No passado distante analisando a rotina de gravação em fita K7 do TK-85 acabei criando a minha própria com mais velocidade e com recursos especiais (foi bastante divertido e muito prazeroso quando consegui que funcionasse). Nunca fiz nada tão complexo como você, o que eu fazia era literalmente brincadeira de criança (eu não era muito mais do que isso naquela época), principalmente comparado com o que você fazia.

Voltando ao assunto antigo,

A minha versão do Bascom é a 2.0.7.6 (não existe a versão 2.0.7.7 segundo o site da MCS, acho que você errou ou tem algo que você sabe que eu estou voando, biblioteca 2.0.7.7 ???) e continuo sem conseguir compilar quando eu acrescento umas 3 operações de ponto flutuante no meu programa, sem elas vai sem problemas

Link para o comentário
Compartilhar em outros sites

Pessoal, estou com problemas para conseguir escrever em um LCD 16x2 usando um Atmega328 .. Não entendi bem a parte das configurações que devo fazer e o comando que uso para inserir um texto .. Estou seguindo a apostila mas fiquei com dificuldade nessa parte, então tentei criar um programa só para escrever um simples texto mas mesmo assim não consegui !

Poderiam me dar uma ajuda ou um exemplo ?

Link para o comentário
Compartilhar em outros sites

Oi Gustavo,

Segue este exemplo, ele usa uma plaquinha de Arduíno como teste, veja as figuras para entender melhor.

d0mz3u5fnLCD_bb.png

Segue a equivalencia direta dos pinos do Arduíno para o Atmega328.

wh7oqd0jnAtmega168_Pin_Map2.png

' Exemplo de codigo de display para atmega328
' usando uma placa arduíno Uno
'
'

$regfile = "m328pdef.dat"
$crystal = 16000000 ' clock do arduíno
$hwstack=40
$swstack=16
$framesize=32

'equivalencias dos pinos do arduíno
'
' digital pin2 = portd.2
' digital pin3 = portd.3
' digital pin4 = portd.4
' digital pin5 = portd.5
' digital pin11 = portb.3
' digital pin12 = portb.4
'

' configurar os pinos ligados ao display para i/o

Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portb.3 = Output
Config Portb.4 = Output



Config Lcd = 16x2
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portb.3 , Rs = Portb.4

Wait 1
Initlcd
waitms 200
cls
Locate 1 , 1
Lcd "Apenas Teste !"
Locate 2 , 10
Lcd "Tchau"

Stop
End

Paulo

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

Sim, existe um pequeno truque, estou usando em beta teste já faz algum tempinho !

Vá ao diretório Updates, você terá de fazer o seu Login, e lá dentro existe uma licença que vai permitir voce atualizar para o nova versão.

Paulo

Não encontrei nenhum diretório updates, encontrei uma aplicação de nome UpdateWiz.exe que executei como administrador, e o que ela atualizou foi o PDF do bascom, mais nada.

Os diretórios que tenho dentro da estrutura são: C:\Program Files (x86)\MCS Electronics\BASCOM-AVR\

LIB

PDF

PinOut

Plugins

USB

ZIP

e só

Link para o comentário
Compartilhar em outros sites

Intruder,

Não é no seu computador, e sim no site da MCS !!!

Faça o Login, e faça o download do arquivo .lic para a versão 2.0.7.7

caminho.jpg

Paulo

Consegui baixar e atualizei para a versão 2.0.7.7. Feito isso compilou sem problemas, talvez o erro fosse algum bug que foi corrigido na versão 2.0.7.7

Link para o comentário
Compartilhar em outros sites

Estou com outro problema que estou hoje o dia inteiro praticamente tentando resolver mas não consegui !

Minha ideia é fazer um metrônomo - mas estou tentando fazer aos poucos, por enquanto só incluí 2 botões no programa, um que será de incremento e outro de decremento do tempo do metrônomo. Quando fui testar, não funcionou. Coloquei então pra cada botão que eu apertar acender um LED correspondente a ele, e não consegui ..

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

$regfile = "m328pdef.dat" ' uC Atmega328P

$crystal = 8000000 ' Velocidade de clock

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

Config Pinc.1 = Input ' S1 ( Incr. )

Config Pinc.0 = Input ' S2 ( Decr. )

Config Portc.4 = Output ' Apenas para teste Led1

Config Portc.5 = Output ' Apenas para teste Led2

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

'Aliases do programa

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

Do

If Pinc.1 = 1 Then

Goto Incrementa

End If

If Pinc.0 = 1 Then

Goto Decrementa

End If

Loop

End

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

Incrementa:

Portc.4 = 1

Return

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

Decrementa:

Portc.5 = 1

Return

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

 

Bom, como disse não funcionou como queria. SEMPRE os 2 leds estão acendendo, não importa se estou apertando o botão ou não . :confused:

Link para o comentário
Compartilhar em outros sites

Bom, aqui você está com alguns erros de lógica :

Em primeiro lugar, do jeito que voce declarou as entradas, voce deve estar usando um resistor ligado entre o pino de entrada e o terra, de um valor em torno de uns 5k, e a sua chave deve estar ligada ao positivo, assim quando voce pressiona, o nivel na entrada, que normalmente era 0, vai para 1 .

E as suas duas rotinas que acendem o led, devem esperar um pouquinho e apagar o led depois, senão sempre vai ficar mostrando led aceso.

Sugiro voce usar um pequeno delay, por exemplo 1 segundo, e logo a seguir apagar o led.

E não se esqueça de dimensionar o stack, sem isso o seu programa pode fazer coisas estranhas...

Mas, ainda assim, você não está fazendo da maneira correta. O certo seria ligar os botões entre a entrada e o terra, e acionar os resistires internos de pull-up , e inverter a sua comparação, comparando com 0 em vez de um.

Leia a apostila, ela tem esse procedimento detalhado nos primeiros projetos.

Paulo

Link para o comentário
Compartilhar em outros sites

Era isso mesmo - faltaram ligar os pull-ups, ligar o botão ao terra e comparar com 0 .

Mas não consegui usar o return logo após a rotina, toda vez que uso ele, a função do primeiro botão fica se repetindo juntamente com a do segundo. A solução que encontrei foi esta ..

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

$regfile = "m328pdef.dat" ' uC Atmega328P

$crystal = 8000000 ' Velocidade de Clock

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

$hwstack = 40

$swstack = 16

$framesize = 32

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

Config Portd.2 = Output ' LCD

Config Portd.3 = Output

Config Portd.4 = Output

Config Portd.5 = Output

Config Portb.3 = Output

Config Portb.4 = Output

Config Pinc.1 = Input ' S1 ( Incr. )

Config Pinc.0 = Input ' S2 ( Decr. )

Config Portc.4 = Output ' Apenas para teste

Config Portc.5 = Output ' Apenas para teste

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

Config Lcd = 16x2

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

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

'Aliases do programa

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

Set Pinc.1 ' Ligando resistores de pull-up

Set Pinc.0

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

' Configuração tela de espera LCD

Initlcd

Waitus 50

cls

Locate 1 , 1

Lcd "Metron. Digital" ' Desliga O Cursor Piscante

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

Do

Inicio:

' Testa qual botão foi apertado

If Pinc.0 = 0 Then

Goto Incrementa

End If

If Pinc.1 = 0 Then

Goto Decrementa

End If

Goto Tela_inicial

Loop

End

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

Incrementa:

Cursor On Blink ' Liga O Cursor Piscante

Locate 2 , 1

Lcd "Aumenta BPM !"

Cursor Off Noblink

Waitms 200

Goto Inicio

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

Decrementa:

Cursor On Blink ' Liga O Cursor Piscante

Locate 2 , 1

Lcd "Diminui BPM !"

Cursor Off Noblink

Waitms 200

Goto Inicio

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

Tela_inicial:

Cursor On Blink

Locate 2 , 1

Lcd "Tempo: --- bpm "

Goto Inicio

 

O programa está saindo aos poucos .. Muito legal essa oportunidade de ver algo que programei por conta própria ( Graças as dúvidas tiradas por aqui, claro ! ) funcionar do jeitinho que queria !

Obrigado pela boa vontade em nos ensinar Paulo ! :D

Link para o comentário
Compartilhar em outros sites

Opa, é assim mesmo que se aprende !

Logo voce vai achar isso tudo muito legal e vai querer inventar novas montagens, aí sim vai ser o bicho !

Quanto ao Return, é simples :

Repare que logo após cada comparaçao voce está usando um Goto, certo ? Se voce trocar por um Gosub, então sim, voce estaria passando o comando para uma subrotina, e quando ela terminasse , ela faria um Return, e devolveria o comando para o programa principal, executando a próxima instrução !

Entendeu a diferença ? Lembre-se sempre que o Return é usado ao final de subrotinas !

Outra coisa, não precisa ficar ligando e desligando o cursor toda hora ! Simplesmente deixe logo no começo do programa o comando Cursor Off ! Isso economiza bytes do programa !

P.s. - Gostei de ver a diferença desse segundo programa para o primeiro ! Parabéns, está mesmo lendo e aprendendo !

Paulo

Link para o comentário
Compartilhar em outros sites

=D

Consegui amigo, fiz essas mudanças e funcionou como antes, mas mais enxugado e usando menos flash :D

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

$regfile = "m328pdef.dat" ' uC Atmega328P

$crystal = 8000000 ' Velocidade de Clock

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

$hwstack = 40

$swstack = 16

$framesize = 32

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

Config Portd.2 = Output ' LCD

Config Portd.3 = Output

Config Portd.4 = Output

Config Portd.5 = Output

Config Portb.3 = Output

Config Portb.4 = Output

Config Pinc.1 = Input ' S1 ( Incr. )

Config Pinc.0 = Input ' S2 ( Decr. )

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

Config Lcd = 16x2

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

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

'Aliases do programa

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

Set Pinc.1 ' Ligando resistores de pull-up

Set Pinc.0

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

' Configuração tela de espera LCD

Initlcd

cls

Locate 1 , 1

Lcd "Metron. Digital"

Cursor Off Noblink ' Desliga O Cursor Piscante

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

Do

Inicio:

' Testa qual botão foi apertado

If Pinc.0 = 0 Then

Gosub Incrementa

End If

If Pinc.1 = 0 Then

Gosub Decrementa

End If

Gosub Tela_inicial

Loop

End

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

Incrementa:

Locate 2 , 1

Lcd "Aumenta Tempo !"

Waitms 200

Return

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

Decrementa:

Locate 2 , 1

Lcd "Diminui Tempo !"

Waitms 200

Return

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

Tela_inicial:

Locate 2 , 1

Lcd "Tempo: --- bpm "

Return

 

Falta colocar um timer para estourar a cada 150ms e com ele quero ver se o botão foi apenas apertado ou está sendo segurado. Caso seja segurado, vou colocar pro tempo incrementar/ decrementar sozinho. Vou deixar isso pra amanhã, mas creio que seja mais ou menos isso .

Obrigado amigo, pra eu que estou apenas iniciando não sabe a motivação que dá um elogio vindo de você ! =]

Link para o comentário
Compartilhar em outros sites

Agora ficou bem legal !

Lembre-se de que quem está lendo, experimentando, fuçando, é voce !

Eu estou aqui para ajudar a quem me pede a ajuda, mas como eu disse acima, o "suor" é seu !

Aliás, acho que voce chegou agora naquele ponto que o "suor" vira diversão !

Eu sempre soube que o Bascom é perfeito para quem está começando, mas é tão perfeito que depois a gente não consegue largar ele, pois tudo pode ser feito nele !

Boas montagens e um excelente aprendizado !

Paulo

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

Amigo, o metrônomo está QUASE pronto. Consegui fazer o seguinte código, que está fazendo quase exatamente o que eu queria ! Agora só falta fazer o buzzer tocar de acordo com as bpm .. E esse é o problema agora ..

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

$regfile = "m328pdef.dat" ' uC Atmega328P

$crystal = 8000000 ' Velocidade de Clock

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

$hwstack = 40

$swstack = 16

$framesize = 32

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

Config Portd.2 = Output ' LCD

Config Portd.3 = Output

Config Portd.4 = Output

Config Portd.5 = Output

Config Portb.3 = Output

Config Portb.4 = Output

Config Pinc.1 = Input ' S1 ( Incr. )

Config Pinc.0 = Input ' S2 ( Decr. )

Config Portd.0 = Output ' Buzzer

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

' Declaração das variáveis

Dim Preload As Byte

Dim Apertou As Byte

Dim Contador As Integer

Dim B As Byte

Dim C As Byte

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

' Declaração das Constantes

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

' Inicializa as variáveis

Preload = 6

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

Config Lcd = 16x2

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

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

Set Pinc.1 ' Ligando resistores de pull-up

Set Pinc.0

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

' Configuração tela de espera LCD

Initlcd

Cls

Locate 1 , 1

Lcd "Metron. Digital"

Cursor Off Noblink ' Desliga O Cursor Piscante

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

' Gerando uma interrupção a cada 9,78 ms

Config Timer1 = Timer , Prescale = 8

On Timer1 Base_timer

Enable Timer1

Timer1 = Preload

Enable Interrupts

Inicio:

Do

Gosub Tela_inicial

Select Case Apertou

Case 0

Gosub Tela_inicial

Case 1

Locate 2 , 1

Lcd "Tempo: " ; Contador ; " bpm "

Contador = Contador + 1

Waitms 140

Gosub Limites

Case 2

Locate 2 , 1

Lcd "Tempo: " ; Contador ; " bpm "

Contador = Contador - 1

Waitms 140

Gosub Limites

End Select

Loop

End

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

' Contador contando de 0 a 250

Limites:

If Contador > 250 Then

Waitms 100

Contador = 0

End If

If Contador < 0 Then

Waitms 100

Contador = 250

End If

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

Tela_inicial:

Locate 2 , 1

Lcd "Tempo: " ; Contador ; " bpm "

Return

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

' Sub-rotina de timer, chamada a cada 100 ms

'

Base_timer:

push r23

Apertou = 0

If Pinc.0 = 0 Then

Apertou = 1

End If

If Pinc.1 = 0 Then

Apertou = 2

End If

Timer1 = Preload

pop r23

Return

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

Play:

B = 60 / Contador ' Quantas batidas por minuto ?

C = B / 2 ' Metade do tempo ON, metade OFF

Portd.0 = 0

Wait C

Portd.0 = 1

Wait C

 

Deixei a rotina Play sem ser chamada em lugar nenhum do programa, porque sempre que coloco ela, é necessário segurar o botão por mais tempo proporcionalmente ao número em que " CONTAGEM " está ( Quanto menor o valor, devo segurar o botão por mais tempo ) . Esse atraso acontece por causa dos delays que dei ali ..

Eu poderia ter feito essa rotina de frequência do Portd.0 de uma forma diferente, sem os delays ? Como ?

Se o que eu fiz está certo, como posso fazer o micro executar essa rotina paralelamente ao programa, sem que os delays que usei nela interfiram no programa e no tempo que devo segurar os botões ?

Obrigado amigo !

Link para o comentário
Compartilhar em outros sites

Vou passar algumas dicas para que voce mesmo modifique....

Primeiro, use Timer1 apenas como base de tempo, e para controlar o tempo de seu buzzer.

Veja o comando Debounce, e trate no programa principal a leitura dos botões.

Atualize o display no programa principal, porém só no caso de ter mudado a contagem, certo ?

E muito importante, sua subrotina limites está deixando contagem=0 , e abaixo voce faz uma divisão por zero !!!! Modifique para que o valor minimo de contagem seja 1.

Agora, outra coisa que voce tem de mudar.

voce está dimensionando a variável B como tipo byte, e o resultado da conta 60 / contagem vai ficar doidinho, pois sempre será arredondado para a parte inteira apenas. Se contagem for maior do que 30 e menor que 61, seu resultado será sempre 1 !!!

E para piorar, se contagem for maior do que 60, seu resultado será sempre zero !

Portanto, tem de mudar o tipo de variável, e mudar a escala de suas contas !

Experimente usar a variável b,c como tipo Word, assim elas podem chegar até 65535, e em vez de usar o numero 60, use o numero 60000, vai ter resultados que voce pode trabalhar direitinho para contagem indo de 1 até 250.

Com uma base de tempo de uma interrupção a cada 10 milisegundos, voce vai controlar os tempos do buzzer de uma maneira bem precisa.

Paulo

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

Com as modificações, o código ficou assim:

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

$regfile = "m328pdef.dat" ' uC Atmega328P

$crystal = 8000000 ' Velocidade de Clock

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

$hwstack = 40

$swstack = 16

$framesize = 32

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

Config Portd.2 = Output ' LCD

Config Portd.3 = Output

Config Portd.4 = Output

Config Portd.5 = Output

Config Portb.3 = Output

Config Portb.4 = Output

Config Pinc.1 = Input ' S1 ( Incr. )

Config Pinc.0 = Input ' S2 ( Decr. )

Config Portd.0 = Output ' Buzzer

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

' Declaração das variáveis

Dim Preload As Word

Dim Contador As Integer

Dim B As Word

Dim C As Word

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

' Declaração das Constantes

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

' Inicializa as variáveis

Preload = 6.78

Contador = 250

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

Config Lcd = 16x2

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

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

Set Pinc.1 ' Ligando resistores de pull-up

Set Pinc.0

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

' Configuração tela de espera LCD

Initlcd

Cls

Locate 1 , 1

Lcd "Metron. Digital"

Cursor Off Noblink ' Desliga O Cursor Piscante

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

' Gerando uma interrupção a cada 9,78 ms

Inicio:

Config Timer1 = Timer , Prescale = 8

On Timer1 Base_timer

Enable Timer1

Timer1 = Preload

Enable Interrupts

Do

Config Debounce = 30

Debounce Pinc.0 , 0 , Incrementa , Sub

Debounce Pinc.1 , 0 , Decrementa , Sub

' Atualiza LCD

Locate 2 , 1

Lcd "Tempo: " ; Contador ; " bpm "

Loop

End

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

Incrementa:

Contador = Contador + 1

Gosub Limites

Return

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

Decrementa:

Contador = Contador - 1

Gosub Limites

Return

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

' Contador contando de 0 a 250

Limites:

If Contador > 250 Then

Waitms 100

Contador = 1

End If

If Contador < 1 Then

Waitms 100

Contador = 250

End If

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

' Sub-rotina de timer, chamada a cada 9, 76 ms

'

Base_timer:

push r23

B = 60000 / Contador ' Quantas batidas por minuto ?

C = B / 2

Portd.0 = 0

Waitms C

Portd.0 = 1 '

Waitms C

Timer1 = Preload

pop r23

Return

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

 

Meu Contador está funcionando certinho, de 1 a 250 de acordo com os botões que aperto, mas quando adiciono essa parte abaixo não consigo mais mudar o valor de Contagem apertando os botões .

 
B = 60000 / Contador                                        ' Quantas batidas por minuto ?
C = B / 2 ' Metade do tempo ON, metade OFF
Portd.0 = 0
Waitms C
Portd.0 = 1
Waitms C

Como eu sou meio atrapalhado pra explicar .. ;s

Sem aquele trecho :

[ame=

]
[/ame] PS: Não repare os fios enormes saltando ! hehe

Com o trecho :

[ame=

]
[/ame]

Abraço !

Link para o comentário
Compartilhar em outros sites

Veja se é isso que voce queria :

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

$regfile = "m328pdef.dat" ' uC Atmega328P

$crystal = 8000000 ' Velocidade de Clock

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

$hwstack = 40

$swstack = 16

$framesize = 32

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

Config Portd.2 = Output ' LCD

Config Portd.3 = Output

Config Portd.4 = Output

Config Portd.5 = Output

Config Portb.3 = Output

Config Portb.4 = Output

Config Pinc.1 = Input ' S1 ( Incr. )

Config Pinc.0 = Input ' S2 ( Decr. )

Config Portd.0 = Output ' Buzzer

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

' Declaração das variáveis

Dim Preload As Word

Dim Contador As Byte

Dim Auxiliar As Word

Dim B As Word

Dim C As Word

Dim Mudou As Bit

Dim Pronto As Bit

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

' Declaração das Constantes

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

' Inicializa as variáveis

Preload = 55536

Contador = 250

B = 6000 / Contador

C = B / 2

Reset Mudou

Reset Pronto

Config Debounce = 30

Portd.0 = 0

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

Config Lcd = 16x2

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

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

Set Pinc.1 ' Ligando resistores de pull-up

Set Pinc.0

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

' Configuração tela de espera LCD

Initlcd

Cls

Locate 1 , 1

Lcd "Metron. Digital"

Cursor Off Noblink ' Desliga O Cursor Piscante

Locate 2 , 1

Lcd "Tempo: " ; Contador ; " bpm "

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

Inicio:

Config Timer1 = Timer , Prescale = 8

On Timer1 Base_timer

Enable Timer1

Timer1 = Preload

Enable Interrupts

Do

Debounce Pinc.0 , 0 , Incrementa , Sub

Debounce Pinc.1 , 0 , Decrementa , Sub

If Mudou = 1 Then

Disable Interrupts

B = 6000 / Contador ' Quantas batidas por minuto ?

C = B / 2 ' Metade do tempo ON, metade OFF

Set Pronto

Enable Interrupts

'se for 1bpm, fica b=6000 interrupts

'se for 10 bmp, fica b= 600 interrupts

' Atualiza LCD

Locate 2 , 7

Lcd " "

Locate 2 , 1

Lcd "Tempo: " ; Contador ; " bpm "

Reset Mudou

End If

Loop

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

Incrementa:

Contador = Contador + 1

If Contador > 250 Then

Contador = 1

End If

Set Mudou

Return

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

Decrementa:

Contador = Contador - 1

If Contador = 0 Then

Contador = 250

End If

Set Mudou

Return

End

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

' Sub-rotina de timer, chamada a cada 10 ms

'

Base_timer:

push r23

If Pronto = 1 Then

Auxiliar = 0

Reset Pronto

End If

Incr Auxiliar

If Auxiliar = C Then

Toggle Portd.0

Auxiliar = 0

End If

Timer1 = Preload

pop r23

Return

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

 

De onde que voce chegou naquele valor de Preload ????? Só pode ser inteiro....

Repare que eu só atualizo o display e os valores para mudar a saída caso alguma tecla seja apertada !

Depois, tudo é feito na rotina de interrupção, mas sempre bem rápido, para não ter problemas de encavalar duas delas.

Paulo

Link para o comentário
Compartilhar em outros sites

Era isso mesmo que queria amigo, muito obrigado pela ajuda ! Não tinha nem pensado em fazer dessa forma o "delay" para o buzzer ..

Achei interessante isso aqui ..

If Pronto = 1 Then
Auxiliar = 0
Reset Pronto
End If
Incr Auxiliar
If Auxiliar = C Then
Toggle Portd.0
Auxiliar = 0
End If

Como sabia que " Auxiliar " seria incrementada a cada 1 ms até alcançar o valor de C ? Não vi nada especificando o tempo de incremento de auxiliar em 1ms ...

Link para o comentário
Compartilhar em outros sites

Hehehe essa é a diferença, a experiēncia anterior sempre dá um caminho para a gente seguir. Com o tempo, voce também vai perceber isso.

Quanto ao incremento que voce perguntou... A minha base de tempo é uma interrupção a cada 10 milisegundos, então o incremento ocorre a cada 10 milisegundos, e não a cada milisegundo como voce falou !

Vamos fazer um exemplo numérico para voce entender :

voce que ter 30 batimentos por minuto.

Portanto, teremos 1 batimento a cada dois segundos, certo ?

Pense melhor : teremos 1 batimento a cada 200 contagens de 10 milisegundos, certo ? É o mesmo tempo de 2 segundos !

Então, a a cada dois segundos, tenho de ter 1 segundo em nivel alto e 1 segundo em nivel baixo, ok ?

Oras, 1 segundo = 100 vezes 10 milisegundos, portanto eu tenho de ficar contando as interrupções até chegar a 100, mudo o nivel da saída, e conto de novo até ter 100 interrupções de novo, mudo a saida e...............

Entendeu ?

Fazendo as contas do programa :

B = 6000 / 30 = 200

C = B / 2 = 200/2 = 100 !!!

Olha o número 100 aí, genteeee !!!

Estude esse programa com carinho, meu amigo !

Paulo

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