Ir ao conteúdo
  • Cadastre-se

PIC - Iniciando pelo basico atraves do BASIC


cavalodf

Posts recomendados

E aí? o tópico morreu? Ninguém mais fala sobre isso?

Até mais!

As informações e link’s nele presentes nunca morrem...

Ideal se nós que utilizamos basic colocássemos nossas duvidas num único lugar, mas não é isto que acontece.

Veja aqui mesmo no forum alguns posts sobre basic:

http://forum.clubedohardware.com.br/usando-watchdog-pic/639178?p=3455006#post3455006

Para o post não "morrer" basta colocarmos nossas duvidas e projetos sempre por aqui. Qual é a sua? Abraço.

Link para o comentário
Compartilhar em outros sites

Amigo cavalodf,

Como bem comentado e indicado por você, estou aqui pra deixar minha dúvida que tem total relação com BASIC e PIC!;)

Enfim, pra mim está sendo meio que um tormentozinho tentar utilizar o TIMER0 do PIC16F628A no PIC Simulator IDE. A realidade é que eu gostaria de saber como "preparar" a rotina pra habilitar o timer0 (contar até 1 seg por exemplo). Alguém possui já uma rotina pronta pra tal? O meu problema esta sendo este, colocar a rotina pra funcionar no editor Basic.:(

É isso aí,

se alguém tiver um modelo de rotina pra chamar o timer0 do PIC no compilador eu agradeço muito.

Abração a todos.

R.Costa.

Link para o comentário
Compartilhar em outros sites

olá amigos ..

obrigado pela dica Rodrigo ..

já baixei .o 18F.. mais como eu num sei mexer nele ..se alguem puder me dar uma ajuda .rs ...

eu tenho um codigo em basic .pronto aqui . eu quero saber .como eu coloco esse codigo nele e simulo .

ele usa o pic 18f452 .usa 3 switch e um display lcd

.

se alguem puder me dar o caminho ..

Link para o comentário
Compartilhar em outros sites

Amigo cavalodf,

Como bem comentado e indicado por você, estou aqui pra deixar minha dúvida que tem total relação com BASIC e PIC!;)

Enfim, pra mim está sendo meio que um tormentozinho tentar utilizar o TIMER0 do PIC16F628A no PIC Simulator IDE. A realidade é que eu gostaria de saber como "preparar" a rotina pra habilitar o timer0 (contar até 1 seg por exemplo). Alguém possui já uma rotina pronta pra tal? O meu problema esta sendo este, colocar a rotina pra funcionar no editor Basic.:(

É isso aí,

se alguém tiver um modelo de rotina pra chamar o timer0 do PIC no compilador eu agradeço muito.

Abração a todos.

R.Costa.

Tem todos estes exemplos no proprio compilador (mikroe)

Basta adapta-los, Para tal baixe o datasheet do pic em uso.

Exemplo de tmr0: Espero que ajude

' *

' * Project name

' TMR0 (Simple 'Hello World' demonstration of interrupt handling)

' * Copyright:

' © mikroElektronika, 2008

' * Revision History:

' 20080225:

' - initial release.

' * Description

' This code demonstrates using interrupts in mikroBasic. Program turns on/off

' LEDs on PORTB approximately each second.

' * Test configuration:

' MCU: PIC16F877A

' Dev.Board: EasyPIC5

' Oscillator: HS, 08.0000MHz

' Ext. Modules: -

' SW: mikroBasic v7.1

' * NOTES

' None.

' *

program TMR0

dim cnt as word

sub procedure interrupt

Inc(cnt) ' Increment value of cnt on every interrupt

TMR0 = 96

INTCON = $20 ' Set T0IE, clear T0IF

end sub

main:

OPTION_REG = $84 ' Assign prescaler to TMR0

TRISB = 0 ' PORTB is output

PORTB = $FF ' Initialize PORTB

TMR0 = 96 ' Timer0 initial value

INTCON = $A0 ' Enable TMRO interrupt

cnt = 0 ' Initialize cnt

while TRUE

if (cnt = 400) then

PORTB = not PORTB ' Toggle PORTB LEDs

cnt = 0 ' Reset cnt

end if

wend

end.

*************************************

Abraços PS: Estes codigos ($84...) sao numeros em hexadecimal =1000 0100 ou seja a configuração dos bit's ( Só lembrando pra iniciantes )

Bom... Dúvida duvida não tenho... Só queria aprender BASIC for PIC.

Agora lembrei. Como faço pro PIC contar pulsos?

Até mais!

Exemplo de um counter existente no mikroe,

Basta adapta-lo.

**********************************************

' *

' * Project name

' Counter

' * Copyright

' © mikroElektronika, 2008

' * Revision History

' 20080225

' - initial release.

' * Description

' This code demonstrates how to display a number on

' four 7-segment LED Display (common cathode).

' Each common cathode is connected to another pin of PORTA(RA0..RA3),

' in multiplex mode, with refresh via pins of PORTA, their anodes

' are connected to PORTD pins (segment A to RD0, segment B to RD1 etc)

' This code also demonstrates how to use interrupts in mikroBasic.

' Number is incremented every 1s.

' Value of counter is transmitted via rs232, @9600 bps, no parity, one stop bit.

' * Test configuration

' MCU: PIC16F877A

' Dev.Board: EasyPIC5

' Oscillator: HS, 8.000 MHz

' Ext. Modules: None

' SW: mikroBasic v7.1

' * NOTES

' - make sure you turn on the correct SW6 switches on your

' EasyPIC5 board (DIS0 - DIS3) (board specific)

' *

program Counter

dim Counter,

BackupC,

i as word

M0, M1,

M2, M3,

T1Count,

toWrite,

_Send as byte

sub procedure Interrupt

INTCON = $00 ' DISABLE INTERRUPTS

inc(T1Count)

if T1Count = 4 then

T1Count = 0

TMR1H = 23

TMR1L = 184

inc(counter)

if counter = 10000 then

counter = 0

end if

_Send = TRUE

end if

ClearBit(PIR1,TMR1IE)

ClearBit(PIR1,RCIF)

ClearBit(PIR1,TXIF)

INTCON = $C0 ' ENABLE INTERRUPTS

end sub

sub function LED_Mask(dim number as byte) as byte ' This function returns led mask for common cathode display.

' Note the return value is not initialized.

select case number ' In case 'number' is not in [0..9], the function will return unknown value

case 0

result = $3F ' mask "0"

case 1

result = $06 ' mask '1'

case 2

result = $5B ' mask '2'

case 3

result = $4F ' mask '3'

case 4

result = $66 ' mask '4'

case 5

result = $6D ' mask '5'

case 6

result = $7D ' mask '6'

case 7

result = $07 ' mask '7'

case 8

result = $7F ' mask '8'

case 9

result = $6F ' mask '9'

end select ' end case

end sub

sub procedure WordToStr2(dim number as word ) ' This procedure splits number into digits.

dim pp as word ' It is assumed that the number is not greater

qq as word ' than 9999.

rr as word

sss as word

sss = (number div 1000) 'sss = 4

M0 = LED_Mask(sss)

sss = sss*1000 'sss = 4000

rr = (number - sss) div 100 'rr = (4321-4000) mod 100 =3

M1 = LED_Mask(rr)

rr = sss+rr*100 'rr = 4000+300

qq = (number -rr) div 10 'qq = 4321 -4300... = 21 div 10 =2

M2 = LED_Mask(qq)

qq = rr+qq*10 'qq = 4300+20= 4320

pp = number -qq 'pp = 4321 - 4320 = 1

M3 = LED_Mask(pp)

end sub

main:

INTCON = $00 ' DISABLE INTERRUPTS

TRISD = $00 ' PORTD ALL OUTPUTS

TRISA = $00 ' PORTA ALL OUTPUTS

T1COUNT = 0

ClearBit(PIE1, RCIE) ' disable usart interrupts

ClearBit(PIE1, TXIE)

SetBit(PIE1, TMR1IE) ' enable interrupt on timer1 overflow

TMR1H = 23 ' these values are calculated for 4MHz

TMR1L = 184

T1CON = $F9 ' set internal clock, start timer, prescaler 18

USART_Init(9600)

INTCON = $C0 ' ENABLE INTERRUPTS

Counter = 0

_Send = FALSE

i = 0

while true ' endless loop

BackupC = Counter ' save counter - interrupt might change it

WordToStr2(BackupC) ' split BackupC to digits

PORTD = M3 ' display digit

PORTA = 1 ' turn ones display on

delay_us(1000) ' wait for a while

PORTA = $00 ' turn all displays off

if BackupC >= 10 then ' turn display on only in case upper digits are not equal to 0

PORTD = M2 ' display digit

PORTA = 2 ' turn tens display on

delay_us(1000)

PORTA = $00 ' turn all displays off

end if

if BackupC >= 100 then

PORTD = M1 ' display digit

PORTA = 4 ' turn hundreds display on

delay_us(1000)

PORTA = $00 ' turn all displays off

end if

if BackupC >= 1000 then

PORTD = M0 ' display digit

PORTA = 8 ' turn thousands display on

delay_us(1000)

PORTA = $00 ' turn all displays off

end if

if _Send then

_Send = FALSE ' not send until next interrupt

ToWrite = Lo(BackupC) ' get lower byte

USART_Write(toWrite) ' send lower byte

toWrite = Hi(BackupC) ' get upper byte

USART_write(toWrite) ' send upper byte

end if

wend

end.

********************************************************

Todos os exemplos no mikroe podem ser usados e difundidos sem ferir propriedades. Compilador extremamente fácil de usar e com centenas de exemplos praticos.

Espero que ajude.

Link para o comentário
Compartilhar em outros sites

Meu amigo cavalodf,

Muito Obrigado! É o que posso te dizer!:D

De verdade eu não sabia que poderia encontrar esse tipo de exemplo na biblioteca de exemplos do software!

No mais, me diz uma coisa, utilizando então a rotina pra uso do TImer0 do PIC 628A como eu faço, por exemplo, pra CHAMAR a rotina que eu escrever do timer0 dentro do meu programa MAIN: É só utilizar depois da linha que eu deseja a instrução GOSUB para executar o Procedure da interrupcao?! Seria isso? Estive tentando usar o TIMER0 de todas as formas, encontrei até uma forma de usa-lo contando 1seg e piscando LEDS, mas na verdade eu queria saber como utiliza-lo para incrementa-lo ao ponto que eu consiga montar um tipo de contador/relogio, onde uma variavel incrementa os segundos, e depois que os segundos chegam a 60, uma outra variavel tipo minutos seja incrementada de 1 também e assim sucessivamente...Desculpe, por tantas questões, mas agradeço desde já a ajuda que puder oferecer assim como outros amigos aqui do forum.

No mais, Obrigado meu amigo!

Abração.

R.Costa.

Link para o comentário
Compartilhar em outros sites

Salve, digam.

Na maioria dos MCUs, os timers são dispositivos independentes. você não "chama" uma rotina de interrupção de timer. Se o timer foi corretamente programado, ela simplesmente acontece. Acontece, porque o tempo em que o timer foi programado, já passou.

Interrupções são eventos que acontecem sem que a CPU tenha controle sobre eles.

Timers contam ciclos de máquina do sistema, e funcionam em função do cristal/oscilador usado pelo MCU.

Por exemplo, máquinas que tenham um ciclo de máquina de 1us, a cada ciclo de máquina o timer vai ser incrementado em uma unidade, o que corresponde a mais 1us.

Pra usar um timer, primeiro é preciso programar o timer pra frequência de clock em que ele vai trabalhar (prescaler). Depois, configurar esse timer pro tempo que você precisa, e depois, escrever a rotina de interrupção desse timer conforme a estrutura do seu compilador. Uma vez habilitada a chave que permite a interrupção, quando o tempo desse temporizador chegar ao final, ele irá interromper a execução do programa, e executar o código que foi escrito na rotina de interrupção. Uma interrupção é um evento tratado à parte pela CPU. Ela pode inclusive, ser descartada, mas, é tratada como uma rotina independente do processamento do programa. Na realidade, quem programa não quer que elas aconteçam, ehehehehehehe

E pra fazer relógios, o melhor é usar a rede de 60Hz como referência externa, ou então usar chips de relógio dedicados, beleza? Ou então, alguma coisa que forneça um pulso externo preciso de 1s.

Mas, se o intuito é didático, você precisa de uma variável para contar os segundos, outra para os minutos, e outra para as horas. Um timer é programado para gerar uma sinalização a cada segundo. Com essa sinalização, é só incrementar as variáveis.

[]'s

Link para o comentário
Compartilhar em outros sites

SALVE Mauricio2006!

você não "chama" uma rotina de interrupção de timer. Se o timer foi corretamente programado, ela simplesmente acontece.

Poxa meu amigo, obrigado por essa explicação! Agora sim ficou CLARO aos meus pequenos conhecimentos! :D

Se eu não CHAMO as interrupcoes provocadas por overflow do TIMER0, elas simplesmente acontecem após aquele determinado tempo para o qual o timer foi programado, então na minha visão limitada eu penso que quando a gente usa o Timer do PIC e faz o nosso programa (main, loops, etc) o timer é como se ficasse num "segundo-plano, background" rodando e rodando e só parando (ou melhor, começando a contagem novamente) apenas quando o timer estoura é isso? E em paralelo a toda essa contagem do timer, o nosso programa fica rodando né?

Putz...sinceramente tem horas que meu raciocínio me decepciona!:( hihihi

Eu na verdade não desejo fazer um relógio exatamente, eu estou mesmo é querendo "brincar", manejar, melhor a programacao em BASIC pro PIC e como faço uso de uma placa de desenvolvimento pequena mas bem util, e nela tem 3 displays 7seg, então eu gostaria (como ontem eu fiquei tentando sem sucesso) utilizar por exemplo esses 3 displays pra simular um tipo de contador, ex: que conte do Zero ao 999 (3 displays!) com intervalos de 1 seg e por exemplo, quando o terceiro display (mais a direita) chegar a 9, então o 2 display mostre o 1 e assim vai até chegar 999. É tão difícil fazer algo assim?!:o:confused:

Estou indo por partes na programacao e estudo das coisas do PIC, então agora estou analisando o uso do timer0 e sinceramente como ainda nao esta CLARO 100% pra mim o uso dele eu nao quero passar pro estudo e simulacoes de interrupcoes externas. Estou muito errado ?!

Eu agradeço mesmo o apoio e explicação a linguagem popular! rss...é muito melhor de "visualizar" as coisas!

Grande Abraço meu amigo.

R.Costa.

Link para o comentário
Compartilhar em outros sites

Se eu não CHAMO as interrupcoes provocadas por overflow do TIMER0, elas simplesmente acontecem após aquele determinado tempo para o qual o timer foi programado, então na minha visão limitada eu penso que quando a gente usa o Timer do PIC e faz o nosso programa (main, loops, etc) o timer é como se ficasse num "segundo-plano, background" rodando e rodando e só parando (ou melhor, começando a contagem novamente) apenas quando o timer estoura é isso? E em paralelo a toda essa contagem do timer, o nosso programa fica rodando né?

Correto! Como eu falei, a gente não quer que as interrupções aconteçam, mas, elas acontecem, ehehehehehehe

A toda hora, e a qualquer hora!

O programa ideal é aquele que corre liso do início ao fim, sem interrupções nem problemas!

O único senão, é que uma vez que o timer for disparado, ele não para nunca mais! Se ele foi programado para contar para cima e for um timer de 8 bits, p. ex., quando chegar em 255 (0xFF), o próximo pulso de clock vai fazer ele zerar e recomeçar a contar do zero de novo. Por isso, se a contagem de tempo precisa ser precisa (ou, pleonasmo, ehehehehehe), as primeiras instruções dentro da rotina de interrupção do timer, são a de recarga do timer. A recarga é executada sem o timer parar. Recarrega rodando, e trata a interrupção naquele momento.

...então eu gostaria (como ontem eu fiquei tentando sem sucesso) utilizar por exemplo esses 3 displays pra simular um tipo de contador, ex: que conte do Zero ao 999 (3 displays!) com intervalos de 1 seg e por exemplo, quando o terceiro display (mais a direita) chegar a 9, então o 2 display mostre o 1 e assim vai até chegar 999. É tão difícil fazer algo assim?!:o:confused:

Eu não conheço nada de PIC e não programo mais em Basic faz é tempo! ehheheheheeh

Então, só posso dar uns pitacos na lógica, o resto, você precisa pegar o manual do PIC e destrinchar, mas os colegas que usam PIC e Basic, com certeza o ajudarão.

Pra contar por interrupção de timer, você precisa fazer aqueles passos iniciais que eu falei antes, primeiro, programar a base de tempo do timer. Vai usar um timer de 8 ou de 16 bits?

P. ex., digamos que a sua máquina tenha um ciclo de clock de 1us, e ela possua um timer de 16 bits. Um timer de 16 bits pode contar até 65535 vezes, o que equivale à um tempo de 65,535ms ou 65535us. Pra ficar melhor os cálculos, você pode fazer esse timer contar 50000 vezes, o que equivale a 50ms, ou seja, a cada 50ms o timer vai gerar uma interrupção quando ele estourar. Pra ter 1 segundo, você precisa contar 50ms, vinte vezes, ok? (50ms x 20 = 1s). Se o timer conta pra cima, você precisa subtrair o máximo valor de contagem dele (65535 + 1) do seu valor de contagem (50000). O valor de carga/recarga do timer, vai ser o resultado dessa equação: 65536 - 50000 = 15536 ==> 3CB0h

Esse é o valor de carga inicial do timer.

Em um ponto qualquer do seu programa você dispara o timer e xau, esquece! Dentro da interrupção, quando contar as 20 vezes (1 segundo), você incrementa suas variáveis.

Dentro do programa principal, quando houver a sinalização do 1 segundo, va faz uma rotina de atualização dos displays. Foi pra conta.

Estou indo por partes na programacao e estudo das coisas do PIC, então agora estou analisando o uso do timer0 e sinceramente como ainda nao esta CLARO 100% pra mim o uso dele eu nao quero passar pro estudo e simulacoes de interrupcoes externas. Estou muito errado ?!

Creio que não. Acho que é o caminho natural. Primeiro, em microcontroladores, você precisa saber como se comportam os pinos de entrada/saída, depois, partir para o uso dos timers, e depois, utilizar interrupções e periféricos externos. Eu acho que você tá no caminho certo! Não para, não!! :P;)

[]'s

Link para o comentário
Compartilhar em outros sites

Caro Mauricio2006!

Meu amigo, poxa, muito obrigado por toda a explicação, de coração meu irmão!;)

Honestamente, eu consigo entender ("visualizar") todas as explicações que você passou, mas o problema mesmo começa na hora que vou pro compilador! hehehe

Enfim, desde a sua última explicação, venho tentando usar o Timer0 do PIC628A (8 bits = 256 contagens). Consegui através de alguns exemplos que achei pela internet utilizar o timer0 pra fazer LEDS na PORTB piscarem em determinado intervalo de tempo (nada preciso ou calculado exatamente). Mas a situação atual é que eu quero mesmo é colocar em prática e BEM ENTENDIDO todas essas informações que consegui juntamente com todas as maravilhosas explicações que você está passando! Vou continuar tentando meu amigo...e obrigado pela dica de dizer que tb acha que não estou indo por caminho errado no estudo da programação dos PICs!:D

Vou tentar fazer um contador básico (só no nome hehehe) utlizando o timer0 como base de tempo de incremento dos I/O da PORTB. Quero ENTENDER isso de qualquer jeito! hihihi

Obrigado meu amigo.

Grande Abraço,

R.Costa.

Link para o comentário
Compartilhar em outros sites

digam

primeiro você pega e faz o trbaalho de RTOS (tempo real)... eu geralmente coloco o timer para estourar a cada 2mseg e cada vez que ele estoura eu somo "1" numa variável de "1 segundo".

quando a variável "1 segundo" atinge o valor 500, eu somo "1" na variável "segundos"...

para pegar e trasnformar a leitura em número para a saída você vai precisar usar um DecToBcd... vai dar um trabalho.

Link para o comentário
Compartilhar em outros sites

Caro Lucas!

Obrigado pelas tentativa de dar mais uma "clareada" no meu cerébro pra que definitivamente eu venha a "dominar" esse timer0!

Eu honestamente entendo a lógica, tanto da explicação do amigo Cavalodf, Mauricio2006 e agora a sua também! Até porque pelo que vi, o metodo que voce usa multiplica 500 por 2ms que vai dar 1000ms = 1seg! Correto?!

Enfim, o que mais está me deixando doido é a hora de calcular pra saber o tempo que o timer0 vai estourar e assim quando eu tenho que incrementar variaveis.

Tambem concordo com você que vai dar trabalho mesmo converter esses valores todos de binario pra decimal (tentei usar a instrucao Bcd2Dec e não aconteceu nada!:confused: Nao entendi. E agora, eu estou pensando, pra mostrar por exemplo valores no meu "contador" de 0 a 99 para 2 displays 7seg. eu preciso "decodificar" 99 numeros?!?!

porque nao sei ate agora porque quando eu usei essa instrucao ela nao converteu nada!

Ops, você disse DECtoBCD!? Nao seria BCDtoDEC?! Ihh..fiquei confuso agora! hihihi...

Gente, de coração meus amigos, Muito Obrigado pela atenção! E por favor, peço a vocês encarecidamente que não "cansem" de ajudar aqui neste topico nao!;) Pode parecer que nao, mas vocês estão ajudando em 100% meu raciocinio entender como definitivamente eu uso e abuso desse maldito timer0 no minimo no PIC628A! rsss

Um Bom domingo a todos!

Vou dar um pulo na rua porque estou atras de uns produtos para dar continuidade em meus projetos já encomendados de PCI!

Mas estou na area!

Obrigado pessoal e NÃO CANSEM de ensinar esse cara aqui não hein! Please!:D

Abração.

R.Costa.

Link para o comentário
Compartilhar em outros sites

Ola,

Vi que tem uma galera fera em Basic aqui e que são muito voluntariosos com o pessoal que esta começando e tem duvidas.

Estou iniciando um projetinho de um robo controlado remotamente. Terá o PIC16F628A, dois Servomotores para controlar as rodas, a placa, os receptores TX/RX e se der tempo uma WebCam.

A principio vou utilizar o CCS C no Mplab. Adquiri o Livro Microcontroladores PIC- Programando em C do Fabio Pereira.

O que procurei foi fugir do Assembler, por indicação de quem ja conhece do assunto. Pelo que to vendo aqui neste Topico o Basic seria a melhor escolha.

O que vocês acham? Um projetinho desses é muito complicado para um iniciante utilizando o CCS C?

Posso contar com os Senhores para possíveis esclarecimentos futuros quando começar a programar? Agora estou na fase de montar o brinquedinho, rodinhas nos servos, carcaça e etc.

Obrigado pela atenção!!!

Link para o comentário
Compartilhar em outros sites

Olá amigo spertnez,

Seja bem-vindo rapaz!

Pode contar comigo e tenho certeza que com todos os amigos aqui do Clube! Grande parte de nós (como eu por exemplo) ainda estamos no processo de aprendizado (como você pode notar pelo tópico)!

Mas é esse o caminho de todo mundo né?! Se você já programa em alguma outra linguagem pode ser o que o C seja uma boa para você...assim como pode ser que não! Tudo é uma decisão muito pessoal mesmo. De qualquer forma, eu iniciei os estudos pelo Assembly, mas "joguei a toalha" menos de 2 meses depois!:(

Por muitas dicas dos amigos aqui do Clube, em especial um cara chamado Paulo (aphawk) que anda meio sumido, mas tenho certeza que ainda vai dar o ar da graça...então parti pro mundo da programacao em BASIC para PICs. Estou ainda no estudo dos TIMERS do PIC, especificamente o 628A, e te digo que essa parte pra mim tá sendo bem complicada, claro que agora menos com as maravilhosas explicações que os amigos do forum, como Mauricio2006, Rodrigo Lange, Cavalodf, queiroz, Danilo, e todos os demais passam!! Sem esses caras aí ficaria mais complicado ainda com certeza!!:D

Se você quiser saber um pouco mais sobre o BASIC, começe dando uma olhada no PSI (PIC SIMULATOR IDE) que é um simulador e compilador tb muito bom para iniciantes ou não! (eu só uso ele e juntamente outra chamado MikroBASIC). Se você procurar aqui no forum mesmo pelo nome desses dois compiladores que citei acima com certeza você irá encontrar uma MINA de OURO contendo muitas explicações de todos nós aqui! Essa é a dica só pra você passar em ter uma ideia do BASIC e programação em geral dos PICs.

Nunca li o livro do Fabio para C (esse que você tem), mas vejo muitos dizendo que o livro é muito bom. Mas, pra você, só você pode decidir né!?

Então é isso aí...estaremos na área para ajudar sempre que possível!;)

Sucesso pra você.

Abração,

R.Costa.

Link para o comentário
Compartilhar em outros sites

Enfim, o que mais está me deixando doido é a hora de calcular pra saber o tempo que o timer0 vai estourar e assim quando eu tenho que incrementar variaveis.

Com relação à programação do PIC eu não sei, mas, a fórmula para calcular esse tempo é padrão pra todo mundo.

Pra calcular, a primeira coisa é saber a frequencia de trabalho do timer. Um timer configurado para rodar em 1MHz, faz uma contagem a cada 1us.

Periodo ( T ) é igual à 1 / Frequencia ==> T = 1 / F ==> T = 1 / 1MHz = 1us

Se for um timer de 8 bits, você pode programar esse timer com o tempo que você quiser, desde 1us até 256us, que é o máximo valor de contagem que um timer de 8 bits conta.

Então, se você programar esse timer para contar 200 vezes, p. ex., então, a cada estouro de contagem, vai ter passado 200us, correto?

Se esse timer conta pra cima, de zero ao máximo, e estoura na passagem do máximo pro zero (gera interrupção), então, o valor de carga desse timer, vai ser o máximo valor que ele conta (256) menos a quantidade de contagens que você quer programar:

256 - 200 = 56

você carrega no timer, o valor de 56D, o que equivale a 200 contagens, já que ele conta pra cima. Quando o timer passar de 255 para zero, ele vai gerar uma interrupção equivalente de 200us.

Quando ele gerar a interrupção, você pode incrementar uma variável até atingir 1 segundo ( 1segundo / 200us = 5000).

Incrementa uma variável. Quando der 5000 nessa variável, sinalize 1 segundo. Foi.

E agora, eu estou pensando, pra mostrar por exemplo valores no meu "contador" de 0 a 99 para 2 displays 7seg. eu preciso "decodificar" 99 numeros?!?!

Normalmente, em displays de LEDs, ou você controla diretamente, ou você utiliza um decoder entre eles. Qual método usa o seu kit?

[]'s

Link para o comentário
Compartilhar em outros sites

Ahh meu amigo Mauricio2006, muito obrigado mais uma vez!

EU vou te dizer muito honestamente, que com todo seu esforço pra me explicar como "trabalha" o TIMER0, eu consegui entender! Também consigo ver de forma mais clara sobre como "carregar" o timer 0 com os valores que nos desejamos! Obrigado pelo cálculo.

O negócio complica mais quando vou "passar" toda essa teoria para o compilador, que no caso estou vendo essa parte no mikroBASIC. Eu acho que preciso estudar e dar mais atencao a como chamar/usar de fato a interrupcao (pelas instrucoes do compilador) gerada pelo timer0 mas no meu programa rodando entende? Pra ficar mais explicito, saber "chamar" essa interrupcao gerada pelo estouro do TIMER!

Eu não quero ficar te dando trabalho não hein! :) Eu agora estou montando 4 PCIs e circuitos pois tenho uma entrega pra amanha ao meio dia. Sendo assim, acredito que ate o final de semana eu nao vou ter tempo pra estudar e dedicar a atencao necessaria ao PIC. De qualquer forma Mauricio, eu vou tentar colocar tudo que está no topico em pratica e aviso se a coisa emperrar!

Normalmente, em displays de LEDs, ou você controla diretamente, ou você utiliza um decoder entre eles. Qual método usa o seu kit?

O meu kit de desenvolvimento trabalha com os displays e leds conectados diretamente à saída do MCU! Os displays 7seg (3) podem ser multiplexados por sao ligados aos 3 pinos I/O da PORTA do PIC! O kit não utiliza decodificadores.

Cara, um grande abraço e obrigado mesmo.

Abração,

R.Costa.

Link para o comentário
Compartilhar em outros sites

Oi pessoal, :D

Estava fazendo nada, ai resolvi fazer um sequencial com controle de velocidade

usando o AD. Vou colocar aqui pra brincarmos e aprendermos com ele.

Codigo: Mikrobasic

*********************************

program sequencial

'pic18f877 8Mhz

'by cavalo - clubedohardware.com.br

'sequencial de N saidas com tempo variavel de 60ms a 5s

symbol led1 = portB,0

symbol led2 = portB,1

symbol led3 = portB,2

symbol led4 = portB,3

symbol led5 = portB,4

symbol led6 = portB,5

symbol led7 = portB,6

symbol led8 = portB,7

dim veloc1 as word

dim veloc10 as dword

dim veloc100 as dword

'REFERENCIA DE tensão considerada como interna 0V 5V

ADCON0=$0

portb=$0

ADCON1 = $80 ' Configure analogico

TRISA = $FF ' PORTA entrada

TRISB = $0 ' portb saida

main:

while true

veloc1 = Adc_Read(0) ' porta de entrada = AN0

DELAY_US(30)

veloc10 = dword(veloc1) * 5000 ' convert adc reading to mV

veloc100 = dword(veloc10) div 1023 ' achando a milhar exata do tempo

if veloc100>50 then

setbit(led1)

Vdelay_ms(veloc100)

clearbit(led1)

setbit(led2)

Vdelay_ms(veloc100)

clearbit(led2)

setbit(led3)

Vdelay_ms(veloc100)

clearbit(led3)

setbit(led4)

Vdelay_ms(veloc100)

clearbit(led4)

setbit(led5)

Vdelay_ms(veloc100)

clearbit(led5)

setbit(led6)

Vdelay_ms(veloc100)

clearbit(led6)

setbit(led7)

Vdelay_ms(veloc100)

clearbit(led7)

setbit(led8)

Vdelay_ms(veloc100)

clearbit(led8)

end if

wend

end.

'***************************************************************AA simulação...

post-86802-13884950796621_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Bom tambem vou postar um

bem parecido..

ele pisca na sequencia e tem dois switch para controlar velocide.

fiz diferente mais funciona legal

para quem quiser olhar.

program Led_Sequencial

symbol led1=portb.0

symbol led2=portb.1

symbol led3=portb.2

symbol led4=portb.3

symbol led5=portb.4

symbol led6=portb.5

symbol led7=portb.6

symbol led8=portb.7

symbol incre=porta.7

symbol decre=porta.6

dim cont as word

trisb=0

trisa=0xFF

cont=200

led1=0

led2=0

led3=0

led4=0

led5=0

led6=0

led7=0

led8=0

main:

sequencia:

led1=1

Vdelay_ms(cont)

led1=0

if (incre=1) then

if (cont>0) and (cont<=900)then

cont = cont + 100

end if

end if

if (decre=1) then

if (cont>=200) and (cont<=1000)then

cont = cont - 100

end if

end if

led2=1

Vdelay_ms(cont)

led2=0

if (incre=1) then

if (cont>0) and (cont<=900)then

cont = cont + 100

end if

end if

if (decre=1) then

if (cont>=200) and (cont<=1000)then

cont = cont - 100

end if

end if

led3=1

Vdelay_ms(cont)

led3=0

if (incre=1) then

if (cont>0) and (cont<=900)then

cont = cont + 100

end if

end if

if (decre=1) then

if (cont>=200) and (cont<=1000)then

cont = cont - 100

end if

end if

led4=1

Vdelay_ms(cont)

led4=0

if (incre=1) then

if (cont>0) and (cont<=900)then

cont = cont + 100

end if

end if

if (decre=1) then

if (cont>=200) and (cont<=1000)then

cont = cont - 100

end if

end if

led5=1

Vdelay_ms(cont)

led5=0

if (incre=1) then

if (cont>0) and (cont<=900)then

cont = cont + 100

end if

end if

if (decre=1) then

if (cont>=200) and (cont<=1000)then

cont = cont - 100

end if

end if

led6=1

Vdelay_ms(cont)

led6=0

if (incre=1) then

if (cont>0) and (cont<=900)then

cont = cont + 100

end if

end if

if (decre=1) then

if (cont>=200) and (cont<=1000)then

cont = cont - 100

end if

end if

led7=1

Vdelay_ms(cont)

led7=0

if (incre=1) then

if (cont>0) and (cont<=900)then

cont = cont + 100

end if

end if

if (decre=1) then

if (cont>=200) and (cont<=1000)then

cont = cont - 100

end if

end if

led8=1

Vdelay_ms(cont)

led8=0

if (incre=1) then

if (cont>0) and (cont<=900)then

cont = cont + 100

end if

end if

if (decre=1) then

if (cont>=200) and (cont<=1000)then

cont = cont - 100

end if

end if

goto sequencia

end.

post-438977-13884950799716_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Muito bom, se você colocar a var 'cont' vindo do AD ela pode ser alterada pelo potenciometro ai vai ficar muito doido.

dei uma melhorada no anterior. pode se colocar centenas de programações com um toque (Eu só fiz 3).

o codigo:

'****************************

program sequencial

'pic18f877 8Mhz

'by cavalo - clubedohardware.com.br

'sequencial de N saidas e N efeitos com tempo variavel de 0ms a 5s

symbol led1 = portB,0

symbol led2 = portB,1

symbol led3 = portB,2

symbol led4 = portB,3

symbol led5 = portB,4

symbol led6 = portB,5

symbol led7 = portB,6

symbol led8 = portB,7

symbol b1 = portc,2

dim veloc1 as word

dim veloc10 as dword

dim veloc100 as dword

dim var as byte

'REFERENCIA DE tensão considerada como interna 0V 5V

ADCON0=$0

portb=$0

portc=255

portd=$0

ADCON1 = $80 ' Configure analogico

TRISA = $FF ' PORTA entrada

TRISB = $0 ' portb saida

TRISc = $FF ' PORTc entrada

TRISd = $0 ' portd saida

var=0

main:

goto inicio

inicio:

while true

gosub adcread

if var=4

then var=1 end if

if Button(B1, 10, 0) then ' APERTE E SEGURE ATÉ LED ACENDER, AI SOLTE...

goto transicao

end if

Select case var

case 1 GOTO prog1 'a edição foi feita aqui, estava "gosub" e é 'goto", porém nao fazia diferença...mas estava errado.

case 2 GOTO prog2

case 3 GOTO prog3

END SELECT

goto inicio

wend

'****************************************************************************

prog1:

gosub adcread

portb=255

Vdelay_ms(veloc100)

gosub bt1

gosub adcread

clearbit(led8)

Vdelay_ms(veloc100)

gosub bt1

gosub adcread

clearbit(led7)

Vdelay_ms(veloc100)

gosub bt1

gosub adcread

clearbit(led6)

Vdelay_ms(veloc100)

gosub bt1

gosub adcread

clearbit(led5)

Vdelay_ms(veloc100)

gosub bt1

gosub adcread

clearbit(led4)

Vdelay_ms(veloc100)

gosub bt1

gosub adcread

clearbit(led3)

Vdelay_ms(veloc100)

gosub bt1

gosub adcread

clearbit(led2)

Vdelay_ms(veloc100)

gosub bt1

gosub adcread

clearbit(led1)

Vdelay_ms(veloc100)

gosub bt1

goto prog1

'******************************

prog2:

gosub adcread

setbit(led1)

Vdelay_ms(veloc100)

clearbit(led1)

gosub bt1

gosub adcread

setbit(led2)

Vdelay_ms(veloc100)

clearbit(led2)

gosub bt1

gosub adcread

setbit(led3)

Vdelay_ms(veloc100)

clearbit(led3)

gosub bt1

gosub adcread

setbit(led4)

Vdelay_ms(veloc100)

clearbit(led4)

gosub bt1

gosub adcread

setbit(led5)

Vdelay_ms(veloc100)

clearbit(led5)

gosub bt1

gosub adcread

setbit(led6)

Vdelay_ms(veloc100)

clearbit(led6)

gosub bt1

gosub adcread

setbit(led7)

Vdelay_ms(veloc100)

clearbit(led7)

gosub bt1

gosub adcread

setbit(led8)

Vdelay_ms(veloc100)

clearbit(led8)

gosub bt1

goto prog2

'***********************************

prog3:

gosub adcread

setbit(led1)

setbit(led2)

Vdelay_ms(veloc100)

clearbit(led1)

clearbit(led2)

gosub bt1

gosub adcread

setbit(led3)

setbit(led4)

Vdelay_ms(veloc100)

clearbit(led3)

clearbit(led4)

gosub bt1

gosub adcread

setbit(led5)

setbit(led6)

Vdelay_ms(veloc100)

clearbit(led5)

clearbit(led6)

gosub bt1

gosub adcread

setbit(led7)

setbit(led8)

Vdelay_ms(veloc100)

clearbit(led7)

clearbit(led8)

gosub bt1

goto prog3

'***********************************

bt1:

if Button(B1, 1, 0) then

goto transicao

else return

end if

transicao:

setbit(portd,4) 'led do sinalizador do botao de prog

if Button(B1, 1, 1) then 'esta solto?

var=(var +1 )

delay_ms(10)

clearbit(portd,4)

goto inicio

else goto transicao

end if

adcread:

veloc1 = Adc_Read(0) ' porta de entrada = AN0

DELAY_US(30)

veloc10 = dword(veloc1) * 5000 ' convert adc reading to mV

veloc100 = dword(veloc10) div 1023 ' achando a milhar exata do tempo

return

end.

':D

'*****************************************************************

Link para o comentário
Compartilhar em outros sites

Então amigo cavalo, eu sei programar legal em outras linguagens, só que não conheço muito bem de pic e basic, então fico meio limitado a programar, eu não sei o que é o "AD" eu preciso saber como faz para o pic ler os comandos direito, as funções internas dele, ai sim eu vou conseguir brincar mais. Eu tava pensando em fazer varia sequencias e colocar cada uma em uma em case ou função para eu fazer a chamanda. Até bolei uma ideia legal só não tenho tempo apra colocar em pratica...

Link para o comentário
Compartilhar em outros sites

Então amigo cavalo, eu sei programar legal em outras linguagens, só que não conheço muito bem de pic e basic, então fico meio limitado a programar, eu não sei o que é o "AD" eu preciso saber como faz para o pic ler os comandos direito, as funções internas dele, ai sim eu vou conseguir brincar mais. Eu tava pensando em fazer varia sequencias e colocar cada uma em uma em case ou função para eu fazer a chamanda. Até bolei uma ideia legal só não tenho tempo apra colocar em pratica...

fácil amigo Queirozfl, No caso deste compilador que uso (Mikroe, parece que você usa o mesmo...ai basta copiar o label adcread do meu pro seu prog e o adcon 0 e 1) O AD "siginifica Analogic/Digital ou seja transformando o sinal analogico em digital- pra quem ainda não sacou gente!" é chamado com um comando (uma biblioteca presente no compilador faz o resto)

"Adc_Read " e a porta an0 "(0)" ao qual foi conectado a tensão a ser medida.(pode usar qualquer uma "AN1 (1) AN2 (2)...")

Basic C e pascal usam comando semelhantes (sempre chamando uma biblioteca procure no seu! por AD,analog/digital ou AN,analogico ou coisa parecida). No caso de ASM vai ter que procurar uma rotina pronta ou fazer uma a mão configurando todo o AD :wacko: . en todos os casos vai te ajudar muito ter o datasheet do PIC que usar, la você encontra estas funções detalhadas.

Abraço

Link para o comentário
Compartilhar em outros sites

fácil amigo Queirozfl, No caso deste compilador que uso (Mikroe, parece que você usa o mesmo...ai basta copiar o label adcread do meu pro seu prog e o adcon 0 e 1) O AD "siginifica Analogic/Digital ou seja transformando o sinal analogico em digital- pra quem ainda não sacou gente!" é chamado com um comando (uma biblioteca presente no compilador faz o resto)

"Adc_Read " e a porta an0 "(0)" ao qual foi conectado a tensão a ser medida.(pode usar qualquer uma "AN1 (1) AN2 (2)...")

Basic C e pascal usam comando semelhantes (sempre chamando uma biblioteca procure no seu! por AD,analog/digital ou AN,analogico ou coisa parecida). No caso de ASM vai ter que procurar uma rotina pronta ou fazer uma a mão configurando todo o AD :wacko: . en todos os casos vai te ajudar muito ter o datasheet do PIC que usar, la você encontra estas funções detalhadas.

Abraço

Então eu uso o Mikroe mesmo inclusive você que falou, achei muito pratico e fácil, eu li o datasheet algumsa vezes, mais é meio confuso..rs

bom valeu pela dica vou dar um olhada com calma, quero usar o PWM infinio para volume acho que é basicamente isso que preciso usar.

assim que eu conseguir fazer eu posto ele aqui, mais acho que vou precisar de uma ajudinha do pessoal aqui..

abraços

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para 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!