Ir ao conteúdo
  • Cadastre-se

Aos entendedores de asm


jorgeletronico

Posts recomendados

Ae pessoal,o felipao deixou este codigo a disposicao


POrtadora:
Código:

;ROTINA PRODUZ A MODULAÇÃO DO BIT EM 38kHZ COM DC DE 50%
T2_ISR:
BCF T2CON,TMR2ON ;DESABILITA CONTAGEM DO TIMER
BTFSC INV_FLAG ;SETA A PORTA OU...
BCF SERIAL
BTFSS INV_FLAG ;LIMPA A PORTA
BSF SERIAL
COMF FLAGS,F
MOVF FLAGS,W
ANDLW B'00000001'
MOVWF FLAGS
CLRF TMR2
BCF PIR1,TMR2IF ; LIMPA FLAG DE INTERRUPÇÃO
BSF T2CON,TMR2ON ;RETORNA A CONTAGEM
GOTO END_ISR

Configuração do timer2:
Código:

BANKSEL T2CON
MOVLW B'00000000';CONFIGURA TIMER2
MOVWF T2CON
BANKSEL PR2
MOVLW 0X0D ;ACERTA VALOR DE ESTOURO
MOVWF PR2
BANKSEL PIE1
BSF PIE1,TMR2IE ;CONFIGURA SUA INTERRUPÇÃO

Quero montar este codigo em c ,alguem pode me auxiliar,qual a frequencia do oscilador pra gerar esta portadora?

Link para o comentário
Compartilhar em outros sites

Se o compilador foi o Hitech é tranquilo de fazer a tradução, mas eu não consigo entender a lógica desse trecho de código. Ele configura o timer2 sem prescaler nem post pra estourar com 14 incrementos, isso é muito rápido. Ele também não liga o timer após configurar.

Link para o comentário
Compartilhar em outros sites

Exatamente vtrx,ele usou este codigo em uma torneira automatica com sensor se nao me engano,o meu proposito é o mesmo.Eu fiz um sensor e funciona muito bem,porém eu uso um controle remoto pra gerar a portadora,ficou perfeito,mais queria unir tudo em 1,o pic enviar a portadora e tbem temporizar o tempo de abertura.

Link para o comentário
Compartilhar em outros sites

Mas ai é simples, nem precisa pegar o código do cara. Você só precisa configurar o timer 2 para estourar a cada metade do período e fazer com que mude o nível lógico de um pino qualquer. Veja bem:

1/38kHz = 26.31µs

26.31µs/2 = 13.15µs

Digamos que esteja usando um cristal de 4MHz, cada ciclo de máquina gasta 1µs, ou seja, são necessários 13 ciclos para mudar o nível. Basta colocar 12 no PR2 e configurar o timer sem prescaler nem post (como o código apresentado fez) que ele estoura nesse tempo.

Porém creio que terás alguns problemas com isso. Como a frequência é elevada, o PIC ficará interrompendo muito frequentemente atrasando muito o desenvolvimento do programa principal. Novamente, como o tempo é muito curto, o tempo gasto para processar a interrupção irá interferir significativamente no periodo do sinal.

Para solucionar isso eu vejo duas opções, elevar a frequência do clock para 20MHz o que te dará uma interrupção a cada 65 ciclos (continua não sendo muito eficaz). Ou utilizar o módulo CCP como PWM. Desse jeito você configura os parametros para que oscile com 38kHz e duty 50% que o hardware fará todo o trabalho sem ter que interferir no programa principal (creio que seja a alternativa mais viável).

Utilizando o módulo CCP estarás limitado ao sinal no pino P1A (no pic 16F690 é o RC5), utilizando interrupções no timer2 poderás colocar o sinal no pino que desejar.

Link para o comentário
Compartilhar em outros sites

Calma la, tem um equivoco ai, essa rotina ai ela é responsável por produzir modulação de bits, usei esse código para fazer meu dimmerPIC e enviar os comandos seriais ou seja os bits modulados em 38KHz para serem recebidos pelo controlador de fase la do outro lado, onde possuia um decoder serial.

Ou seja no código original eu efetuo um teste de bit antes de cair nessa rotina, caso o bit seja 1 esse trecho de código é executado e produz uma modulação OOK (On-Off-Shift Keying) em tempo real ou seja ele vai modulando os bits e o processador pode ir executando outras coisas.

Concluindo se for para gerar um sinal puro de 38KHz sem dados, apenas a portadora, basta configurar o Timer2 do modo que usei e apenas chavear um pino a cada interrupção dele.

Agora se o objetivo for somar um comando (de controle remoto por exemplo) codificar e modular para envio, ai essa rotina atende a parte de modulação de bits.

Ele configura o timer2 sem prescaler nem post pra estourar com 14 incrementos, isso é muito rápido

é ai que está o segredo o timer2 é utilizado para gerar uma interrupção a cada 76KHz precisos, para isso tive que remover o prescaler e desligar o post pois preciso que a int seja executada a cada 1 estouro, configuro apenas do PR2 para gerar o limite de estouro dele.

Ele também não liga o timer após configurar

Não habilito a contagem pois so uso a rotina de modulação caso o proximo bit a ser transmitido seja 1. Repare que dentro da rotina de modulação é que efeitvamente ligo a contagem.

xatamente vtrx,ele usou este codigo em uma torneira automatica com sensor

Quase jorge, o que eu usei para a torneira usava apenas a base de tempo do timer2, mas nao a estrategia de modulação, esse ai usei para o dimmerPIC.

Abs.

Link para o comentário
Compartilhar em outros sites

Quase jorge, o que eu usei para a torneira usava apenas a base de tempo do timer2, mas nao a estrategia de modulação, esse ai usei para o dimmerPIC.

E você poderia então passar este que usou ,ou explicar como posso gerar,qual valor do oscilador.

Eu tenho este aqui que o matheus me passou ,mais nao ta funcionando


#include <16f628a.h>
#fuses intrc_io, nowdt, noprotect, put, nobrownout, mclr, nolvp, nocpd
#use delay(clock=4000000)




void main()
{
setup_ccp1(ccp_pwm);
setup_timer_2(T2_DIV_BY_1,25, 1);
set_pwm1_duty(12);

while(TRUE);
}

Link para o comentário
Compartilhar em outros sites

Boa noite galera,so retornando trazendo o codigo que fiz ,funcionando e testado em protoboard.Ficou ate legal.Agora é testar na torneira,tava usando led para representar o rele da valvula,mais vou por em açao kkkkkkkk.Bom deixa explicar aqui,é gerado o pwm no ccp1,e o receptor de ir ,ao receber a portadora vai a nivel baixo,que é sentido no pino a0,notem que ha um pisca pisca,que na verdade alem de mostrar que foi identificado a mao da pessoa ,serve de debounce.Ha tbem dois botões de incremento e decremento que mudam o tempo de acionamento.A temporizaçao é feita a partir do timer 1.Aqui nos testes ficou massa,mais quero opinioes e melhorias ,ideias serao bem vindas.

#include <16f628a.h>
#fuses intrc_io, nowdt, noprotect, put, nobrownout, mclr, nolvp, nocpd
#use delay(clock=4000000)
#define incremento pin_a1
#define decremento pin_a2
int s=0,x=0,contador=0,cnt=5;

#int_TIMER1
void TIMER1_isr(void)
{
s++;
if(s==2){
if (x==1){
output_high(pin_b0);
contador++;}
if(contador==cnt){
output_low(pin_b0);
contador=0;
x=0;
}
s=0;
}

set_timer1(3036 + get_timer1());

}

void main()
{
setup_comparator(NC_NC_NC_NC);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer1(3036);

setup_ccp1(ccp_pwm);
setup_timer_2(T2_DIV_BY_1,25, 1);
set_pwm1_duty(13);
enable_interrupts(int_timer1);
enable_interrupts(GLOBAL);
#priority timer1, timer2 // Define a prioridade das interrupções
while(TRUE){

if(!input(incremento)){
delay_ms(300);
cnt++;}

if(!input(decremento)){
delay_ms(300);
cnt--;}
if(cnt<0){
cnt=0;}

if(!input(pin_a0)){
output_high(pin_b1);
delay_ms(50);
output_low(pin_b1);
delay_ms(50);
output_high(pin_b1);
delay_ms(50);
output_low(pin_b1);

x=1;

}
}

}


Link para o comentário
Compartilhar em outros sites

Bom dia a Todos!!!

Então, não estou conseguindo compilar um arquivo ASM. pois no MPLAB dá a seguinte erro na tela dizendo BUILD FAILED. Aparece a seguinte tela com vários mensagens de erro: AlameMPLABMPASMWIN.png

E sendo assim não estou conseguindo gerar o arquivo .HEX

Se algum puder me dar um auxilio, ficarei agradecido;

Obrigado.

Tiago Souza

Link para o comentário
Compartilhar em outros sites

Bom dia a Todos!!!

Então, não estou conseguindo compilar um arquivo ASM. pois no MPLAB dá a seguinte erro na tela dizendo BUILD FAILED. Aparece a seguinte tela com vários mensagens de erro: %7Boption%7Dhttp://i1190.photobucket.com/albums/z454/ogaittiago/AlameMPLABMPASMWIN.png[/img

E sendo assim não estou conseguindo gerar o arquivo .HEX

Se algum puder me dar um auxilio, ficarei agradecido;

Obrigado.

Tiago Souza

Repare que o erro está na linha 23. Se puder, poste o programa aqui.

Link para o comentário
Compartilhar em outros sites

O MPLAB não está aceitando o nome CONFIG para variável.


;*********************************************************************************

LIST P=16F630 ;f=inhx8m
#include "P16F630.inc"
__CONFIG 3F84; (oscilador interno, sem WDT, Power Up Timer)

;VARIÁVEIS DE USUÁRIO A PARTIR DA POSIÇÃO 32
TEMPO EQU .32
EM_BAIXO EQU .33
QUANT EQU .34
NUM1 EQU .35
NUM2 EQU .36
PWM1 EQU .37
PWM2 EQU .38
TMP_T EQU .39
[B][COLOR="Red"]CONFIG EQU .40[/COLOR][/B]
FASE1 EQU .41
FASE2 EQU .42
FASE3 EQU .43
PWM_TEMPO EQU .44


#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MEMÓRIA
#DEFINE ABAIXO_60HZ PORTA,0 ;LED INDICADOR DE FREQUENCIA ABAIXO DE 60HZ
#DEFINE ACIMA_60HZ PORTA,1 ;LED INDICADOR DE FREQUENCIA ABAIXO DE 60HZ

#DEFINE SOBEF1 [B][COLOR="red"]CONFIG,0[/COLOR][/B] ;FLAG INCICADOR DE SUBIDA DA FASE 1
#DEFINE SOBEF2 [B][COLOR="red"]CONFIG,1[/COLOR][/B] ;FLAG INCICADOR DE SUBIDA DA FASE 1
#DEFINE SOBEF3 [B][COLOR="red"]CONFIG,2[/COLOR][/B] ;FLAG INCICADOR DE SUBIDA DA FASE 1
#DEFINE PARADO [B][COLOR="red"]CONFIG,3[/COLOR][/B] ;FLAG INCICADOR DE SUBIDA DA FASE 1


ORG .0 ; INICIO DO PROGRAMA

Repare que basta mudar o nome dela que ele monta o projeto.

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!