Ir ao conteúdo
  • Cadastre-se

Pisca led com 16f877a


CeDahmer

Posts recomendados

Boa noite.

Mais uma vez estou pedindo a ajuda dos amigos, que já resolveram um punhado de problemas, dando dicas preciosas.

Estou começando com microcontroladores agora, optei pela familia PIC e estou trabalhando com o MPLAB para a geração do software direto em assembler. Consegui vários testes diferentes com o 16f84a, como gerar onda quadrada, ligar display, lcd, entrada digital. Mas agora estou querendo trabalhar com o 16f877a, para utilizar os conversores analógicos digitais e a comunicação serial.

Mas o problema é que não estou conseguindo fazer o 16f877a funcionar para gerar uma onda quadrada ou fazer um led piscar, vou descrever o código que utilizo no 16f84a e que funciona

list p=16f84a

radix dec

include <p16f84a.inc>

__config _xt_osc & _cp_off & _wdt_off & _pwrte_on

clrf portb

bsf status,rp0

clrf trisb

bcf status,rp0

repete

bsf portb,7

bcf portb,7

goto repete

end

Agora existem muitas modificações para fazer isso funcionar com o 16f877a.

O esquema elétrico do 16f877a que montei é assim:

pinos 1 e 11 +5V

pino 12 0V

pinos 13 e 14 oscilador 4Mhz com capacitor de 47 pF ligados ao 0V

pino 21 led ligado a resistor de 470 e ao +5V

O problema está no código, ou na montagem do circuito?

Obrigado.

Link para o comentário
Compartilhar em outros sites

No código que você postou, o pino RB7 é setado e já na instrução seguinte é apagado.

Isto faz com que o tempo que o pino fique setado seja igual ao período do ciclo de instrução.

Para o caso de um clock de 4MHz, o período do ciclo de instrução é igual a 1us.

O tempo que o pino RB7 fica apagado é igual a 2 vezes este tempo.

A frequência do sinal gerado neste pino será, então de 333,333 kHz.

Não se percebe um LED piscar numa frequência maior do que 60 Hz.

No PIC16F877A, o pino 21 corresponde ao RD2.

Link para o comentário
Compartilhar em outros sites

Mulder, com a sua permissão (Sei que estou me intrometendo ... mas quem sabe ajuda o nosso amigo !) :

Programa para fazer pisca-pisca na frequência de 1 Hz, onda quadrada, clock de 4 Mhz.

Código fonte em Basic do PSI :


Define CONF_WORD = 0x3f72

AllDigital
TRISD = 0x00

loop:
PORTD.2 = 0
WaitMs 500
PORTD.2 = 1
WaitMs 500
Goto loop
End

Listagem .asm gerada pelo compilador :


; Compiled with: PIC Simulator IDE - v6.73
; Microcontroller model: PIC16F877A
; Clock frequency: 4.0 MHz
; Begin
R0L EQU 0x20
R0H EQU 0x21
R1L EQU 0x22
R1H EQU 0x23
R2L EQU 0x24
R2H EQU 0x25
R3L EQU 0x26
R3H EQU 0x27
R4L EQU 0x28
R4H EQU 0x29
R5L EQU 0x2A
R5H EQU 0x2B

ORG 0x0000
BCF PCLATH,3
BCF PCLATH,4
GOTO L0002
ORG 0x0004
RETFIE
L0002:
; 1: Define CONF_WORD = 0x3f72
; 2:
; 3: AllDigital
BSF STATUS,RP0
MOVLW 0x06
MOVWF 0x1F
MOVLW 0x07
MOVWF 0x1C
; 4: TRISD = 0x00
CLRF 0x08
; 5:
BCF STATUS,RP0
; 6: loop:
L0001:
; 7: PORTD.2 = 0
BCF 0x08,2
; 8: WaitMs 500
MOVLW 0xF4
MOVWF R0L
MOVLW 0x01
MOVWF R0H
CALL W001
; 9: PORTD.2 = 1
BSF 0x08,2
; 10: WaitMs 500
MOVLW 0xF4
MOVWF R0L
MOVLW 0x01
MOVWF R0H
CALL W001
; 11: Goto loop
GOTO L0001
; 12: End
L0003: GOTO L0003
; End of program
L0004: GOTO L0004
; Waitms Routine
W001: MOVF R0L,F
BTFSC STATUS,Z
GOTO W002
CALL W003
DECF R0L,F
NOP
NOP
NOP
NOP
NOP
GOTO W001
W002: MOVF R0H,F
BTFSC STATUS,Z
RETURN
CALL W003
DECF R0H,F
DECF R0L,F
GOTO W001
W003: MOVLW 0x0C
MOVWF R2H
W004: DECFSZ R2H,F
GOTO W004
NOP
NOP
MOVLW 0x12
MOVWF R1L
W005: DECFSZ R1L,F
GOTO W006
CALL W007
CALL W007
NOP
NOP
RETURN
W006: CALL W007
GOTO W005
W007: MOVLW 0x0D
MOVWF R2L
W008: DECFSZ R2L,F
GOTO W008
NOP
RETURN
; Configuration word settings
ORG 0x2007
DW 0x3F72
; End of listing
END

Tá vendo como estou ficando bom em Assembler ????? heheheheheh

Não importa o tamanho do gato, desde que ele coma ratos !

Paulo

Link para o comentário
Compartilhar em outros sites

Conforme o amigo Mulder o RB7 é no pino 30, e é neste que liguei o led em série com 470 ohms e ao +5V, e realmente a frequência de operação é muito alta, imperceptível ao olho, mas simplifiquei o código para reduzir os erros, para mim se o led ficasse ligado já seria um indicio de que está funcionando.

Mas agora percebi uma coisa estranha o pic está esquentando um pouco após uns 30 minutos ligado, será que o problema não está nele.

O amigo Felipe pediu para desenhar o circuito, mas não sei usar as ferramentas de desenho ou pelo menos a versão do kicad que tenho não encontrei o 16f877a.

Obrigado a todos.

Link para o comentário
Compartilhar em outros sites

Fiz alterações que o Felipe e o Mulder sugeriram mas ainda não funcionou.

Coloquei & _LVP_OFF na linha de config ficou assim:

__config _xt_osc & _cp_off & _wdt_off & _pwrte_on & _lvp_off

e também coloquei o +5V nos pinos 11 e 32 e o 0V nos pinos 12 e 31

no pino 1 o resistor é de 2K ligado ao +5V.

Vi em um esquema em algum site que usa o cristal de 4 mhz em conjunto com capacitor de 12pf , mas eu estou usando com o cristal de 4 MHz dois capacitores de 47 pf, será que isso interferiria a ponto de não funcionar?

Obrigado pela atenção.

Link para o comentário
Compartilhar em outros sites

Heheheh poxa ,Mulder, e eu que sei ???????????????

Falando sério, o compilador do PSI muda a rotina de delay,de acordo com o clock escolhido, e ele faz isso quase sempre mudando o número desses Nop's seguidos ....

É a famosa rotina WaitMS ....

Caramba, num me faz pergunta difícil né !!!!!!!!!!!!!!!! :D

Paulo

Link para o comentário
Compartilhar em outros sites

Sei não heim aphawk(_(

Não me convenci desta explicação :lol:

Bem, fiz um programa aqui em assembly, também para piscar o LED numa frequência de 1 Hz (na verdade 0,954 Hz)

Demorei 30 minutos, inclusive para simular.

;***********************************************
;PISCA LED 1 HZ
;VERSÃO 1.0
;DESENVOLVIDO POR: MULDER_FOX (FORUM DO Clube do Hardware)
;DATA DE CONCLUSÃO: 26/09/2009

;****************************************************
#INCLUDE <P16F877A.INC> ;ARQUIVO padrão MICROCHIP PARA O PIC16F877A

;****************************************************
;BITS DE CONFIGURAÇÃO
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_ON & _CP_OFF & _CPD_OFF & _LVP_OFF

*****************************************************
;PAGINACAO DE MEMORIA DE DADOS

#DEFINE BANCO_0 BCF STATUS,RP0 ;SELECIONA O BANCO 0 DE MEMORIA
#DEFINE BANCO_1 BSF STATUS,RP0 ;SELECIONA O BANCO 1 DE MEMORIA

;****************************************************
;SAIDA

#DEFINE LED PORTB,7 ;0 = ACESO, 1 = APAGADO

;****************************************************
;VETOR DE RESET

ORG 0X00 ;ENDERECO INICIAL DE PROCESSAMENTO
GOTO INICIO ;DESVIA PARA INICIO

;****************************************************
;ROTINA DA INTERRUPCAO

;A INTERRUPCAO DO TIMER 1 SERA TRATADA

ORG 0X04 ;ENDERECO INICIAL DA INTERRUPCAO

;ROTINA QUE TESTA QUAL FOI A INTERRUPÇÃO

BTFSC PIR1,TMR1IF ;INTERRUPÇÃO DO TIMER 1?
GOTO INT_TMR1 ;SIM
RETFIE ;NAO, RETORNA DA INTERRUPCAO

INT_TMR1 ;ROTINA DE INTERRUPCAO DO TIMER 1

BCF PIR1,TMR1IF ;APAGA FLAG DE INTERRUPCAO DO TIMER 1
BTFSS LED ;LED ACESO?
GOTO APAGA_LED ;SIM
BCF LED ;NAO, ACENDE LED
RETFIE ;RETORNA DA INTERRUPCAO

APAGA_LED

BSF LED ;APAGA LED
RETFIE ;RETORNA DA INTERRUPCAO

;****************************************************
;configuração DOS REGISTRADORES

INICIO

BANCO_1 ;SELECIONA BANCO 1 DE MEMORIA
MOVLW B'01111111'
MOVWF TRISB ;DEFINE RB7 COMO SAIDA, DEMAIS COMO ENTRADA
MOVLW B'10000000'
MOVWF OPTION_REG ;PULL_UPS DESABILITADOS, DEMAIS BITS IRRELEVANTES
MOVLW B'11000000'
MOVWF INTCON ;HABILITA INTERRUPCAO DE PERIFERICOS
MOVLW B'00000001'
MOVWF PIE1 ;HABILITA INTERRUPCAO DO TIMER 1
BANCO_0 ;SELECIONA BANCO 0 DE MEMORIA
MOVLW B'00110001'
MOVWF T1CON ;TIMER 1 ATIVADO COM PRESCALER DE 1:8, INCREMENTADO PELO CICLO DE INSTRUCAO

;*****************************************************
;ROTINA PRINCIPAL

MAIN

GOTO MAIN ;LOOP

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

END ;FIM DO PROGRAMA

Link para o comentário
Compartilhar em outros sites

Beleza de programa, Mulder ! :)

Mais uma vez, é a prova que nenhum compilador chega perto de um programa em Assembler, escrito por quem sabe, claro !

voce fêz direto pela interrupção, é um exemplo bem didático, espero que todos os que estão aprendendo assembler estudem a técnica !

Parabéns, Mulder !!!! Aliás, cadê o seu tutorial, né ???????????????? :D

Paulo

Link para o comentário
Compartilhar em outros sites

Nossa fantástico a dedicação do Mulder, que dedicou meia hora de sua vida, desenvolvendo um exemplo para ajudar a nós simples mortais com intenção de aprender Assembly para programar microcontroladores.

Mas ou o esquema elétrico que montei está errado ou o próprio pic está queimado, pois não tive sinal de vida.

vou tentar postar o esquema, mas desculpem que fiz ele no paint, mas acho que dá pra entender.

Pelo que entendi do seu programa precisso ter um botão ligado em algum pino do pic

BTFSC PIR1,TMR1IF

GOTO INT_TMR1

RETFIE

Desculpe minha ignorância em Assembly em em PIC.

Link para o comentário
Compartilhar em outros sites

Beleza de programa, Mulder ! :)

Mais uma vez, é a prova que nenhum compilador chega perto de um programa em Assembler, escrito por quem sabe, claro !

voce fêz direto pela interrupção, é um exemplo bem didático, espero que todos os que estão aprendendo assembler estudem a técnica !

Parabéns, Mulder !!!! Aliás, cadê o seu tutorial, né ???????????????? :D

Paulo

Obrigado aphawk.

Foi a maneira mais prática que encontrei para gerar este sinal de 1 Hz.

Sobre o tutorial, preciso terminar um projeto que estou fazendo.

Creio que termino dentro de 15 dias.

O Cacio J Gazola, colega nosso aqui do fórum, entrou em contato comigo, pois, ele já está fazendo um tutorial de Assembly.

Ele me propôs ajudá-lo para fazermos um único tutorial.

Link para o comentário
Compartilhar em outros sites

Nossa fantástico a dedicação do Mulder, que dedicou meia hora de sua vida, desenvolvendo um exemplo para ajudar a nós simples mortais com intenção de aprender Assembly para programar microcontroladores.

Mas ou o esquema elétrico que montei está errado ou o próprio pic está queimado, pois não tive sinal de vida.

vou tentar postar o esquema, mas desculpem que fiz ele no paint, mas acho que dá pra entender.

Pelo que entendi do seu programa precisso ter um botão ligado em algum pino do pic

BTFSC PIR1,TMR1IF

GOTO INT_TMR1

RETFIE

Desculpe minha ignorância em Assembly em em PIC.

CeDahmer, eu também sou um pobre mortal.

Eletrônica é meu hobby.

Desde meus 12 anos de idade, me apaixonei por esta ciência e desde então, tenho estudado em livros e revistas, e, recentemente na Internet.

Há cerca de 3 anos atrás, comecei a estudar sobre microcontroladores PIC.

Comprei o livro Microcontroladores PIC16F628A/648A Uma Abordagem Prática e Objetiva de autoria de Wagner da Silva Zanco para aprender a mexer com estas belezinhas.

Eu tinha conhecimentos de eletrônica analógica e digital, mas, absolutamente nada de programação.

Como o livro ensina a programar em Assembly, foi esta linguagem que aprendi.

Somente depois é que fiquei sabendo sobre as outras linguagens, mas, como já tinha aprendido o Assembly e não programo profissionalmente, até agora não aprendi outra linguagem.

Eu não tive dificuldade em aprender o Assembly, talvez por causa de meus conhecimentos em eletrônica digital.

Como disse, sou amador e é um prazer para mim gastar minhas horas vagas mexendo com eletrônica, principalmente se for para ajudar alguém.

A gente tem que preencher nosso tempo livre com alguma coisa não é? E melhor que seja com algo útil.

Sobre o programa que postei, ele não prevê a ligação de botão, somente o LED ligado ao pino RB7.

BTFSC PIR1,TMR1IF

Esta instrução testa o flag de interrupção do timer 1.

Com o valor do resistor em 740R, a corrente no LED será de cerca de 4mA.

Você poderia diminuir o valor deste resistor para 330R.

Por via das dúvidas, ligue tamtém o pino 32 ao VDD e o 31 ao VSS.

Deveria funcionar.

Link para o comentário
Compartilhar em outros sites

Gostei da ideia do tutorial de Assembly, será de muita ajuda, tenho certeza que será feita de uma forma fácil de entender, com exemplos práticos. Já li bastante material sobre Assembly, mas o problema é que não compreendo o autor, tem muita enrolação, estava lendo um artigo com duzentas e poucas páginas, até a centéssima página, não achei nada que me servisse, além de conhecer a história dos PICs, e a teoria do funcionamentos dos periféricos da próprio microcontrolador.

Mas vamos lá, em algum site li que é necessário configurar os fusíveis do PIC, agora quando estava gravando notei na tela do programa gravador várias configurações para os fusíveis, vou postar a tela do programa ICProg que está com o exemplo postado pelo Mulder, o meu gravador é um tal de PicBurner, comprado no mercado livre, mas ele está funcionando pois grava o 16f84a que funciona.

Liguei também os outros pinos de alimentação, mas o Pic continua morto, o estranho é que se eu retiro a alimentação positiva, o led acende.

post-9775-13884953163304_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Os fusíveis são configurados pela linha __CONFIG do programa.

Num dos primeiros posts, você disse que o PIC estava esquentando.

Continua esquentando?

Você poderia ligar o LED em outro pino, alterando as seguintes linhas:

#DEFINE LED PORTB,7

Em negrito o pino onde está ligado o LED.

MOVLW B'01111111'

MOVWF TRISB ;DEFINE RB7 COMO SAIDA, DEMAIS COMO ENTRADA

Nesta linha, se quiser, por exemplo, ligar o LED no RB0, troque o último 1 por 0.

0 significa que o pino será configurado com saída e 1 como entrada.

Eu prefiro deixar os pinos não usados como entrada, para o caso de se fazer uma ligação errada no circuito, já que quando configurado como entrada, o pino assume alta impedância.

Está certo de que este cristal está bom?

Certa vez, comprei um cristal de 12MHz o qual, não funcionou nem na primeira vez.

Se estiver testando em protoboard, leia estas dicas do aphawk para evitar instabilidades:

http://forum.clubedohardware.com.br/showpost.php?p=3808241&postcount=10

Se não funcionar, teste com outro PIC.

Link para o comentário
Compartilhar em outros sites

Muito boa esta explicação do Aphawk, eu já utilizava o protoboard dessa forma, o que não tinha feito era usar os capacitores de 1 nF ligados aos pinos de alimentação e em paralelo ao capacitor eletrolítico, fiz estas alterações, na verdade não sei para que serve o capacitor que é usado em paralelo com o eletrolítico, seria para melhorar o filtro?

O meu cristal está bom, pois testei com outro que está funcionando, agora estou achando que o problema pode estar na forma como estou usando a protoboard. Em uma ponta dela coloquei um 16f84a, que está funcionando e do outro lado coloquei o 16f877a que está morto, a alimentação retiro da fonte do computador fios vermelho e preto, +5V e 0V respectivamento, a única retificação que fiz é o capacitor eletrolítico instalado na protoboard.

O 16f877a esquentou 2 vezes que eu percebi, foi quando tentei usar o conversor A/D, através de um exemplo que achei na internet, e liguei um resistor 10K no pino 2.

Obrigado pela explicação do Mulder sobre o significado das linhas do código, eu as uso nos teste com o 16f84a, mas não sabia para que serviam. Mais uma coisa que eu aprendi.

É grande minha ignorância sobre Pics e eletrônica em geral, mas não tive tempo de fazer um curso bom nesta área, e nunca tive acesso a livros técnicos, na minha cidade não tem livraria, banca, nada. Programo computadores há 10 anos, com VB, e há 2 anos começei a fazer painéis de controle, utilizando a saída paralela do microcomputador, mas essa é extremamente deficiente em recursos e cheia de falhas, além do custo. Por isso decidi fazer os painéis com PIC, e com a ajuda dos amigos, ainda vou conseguir.

Link para o comentário
Compartilhar em outros sites

CeDahmer, vai conseguir sim, e vai ver que é bem fácil. Se voce precisa correr, sugiro fazer em Basic, para facilitar, enquanto voce aprende o Assembler ok ?

Quanto à sua pergunta sobre os capacitores , a resposta vem da prática, e não da teoria !

Capacitores eletrolíticos são péssimos em frequencias mais altas, pois o formato físico das camadas internas acaba representando um indutor, e como tal, ele influi, e muito na resposta em frequências altas.

Por exemplo, um capacitor eletrolítico, que em 100 hz apresenta uma baixíssima impedância, da ordem de ohms, pode apresentar uma impedância acima de 1000 Ohms nas frequências acima de 100 Khz.

E um cristal desses usados em PIC oscila na faixa de Megahertz.

O projeto do circuito osclador dos Pics funciona apenas se a impedância a sinais AC da fonte de alimentação for muito baixa, senão não ocorre a oscilação.

A função dos pequenos capacitores de 1 nF é exatamente esta, pois eles não apresentam o comportamento indutivo, e realmente abaixam a impedância em AC para valores bem dentro da tolerância dos circuitos osciladores.

Porisso que sempre recomendo o par de capacitores.

Resumindo, é para melhorar ( e muito !!! ) o filtro em alta frequência ok ?

Se voce quiser, forneça qual o cristal que voce está usando, qual pino do PIC voce quer colocar um Led para teste, e eu compilo e te passo um arquivo .hex para voce gravar e testar o seu PIC com um pisca-pisca ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

  • mês depois...

Apenas para fechar esse tópico.

Como verifiquei o número de visitas a esse tópico é bastante elevado, conclui que esta dúvida é bastante pertinente. Pois deve ser a primeira coisa que se tenta fazer quando se começa a estudar o funcionamento de microcontroladores.

O único problema que o meu Pic não piscava o led, era o simples motivo do PIC estar queimado, por isso perdi um mês e pouco tentando, mas foi bom eu ter encontrado esse problema já de início, isso me fez desistir de usar assembler, e partir para o uso da linguagem C. Googleei muito, comprei livros, li milhares de páginas, e só resolvi o problema quando troquei de PIC. Mas ficou o conhecimento e a experiência. E hoje estou engatinhando, mas já consigo fazer coisas bem mais complexas.

Então se alguém precissar fazer um led piscar ou um relê "bater", pode usar o exemplo abaixo que vai funcionar. Lembrando que o compilador que usei é o CCS com a linguagem em C:

#include <16F877a.h> //Especifica o tipo do uC e abre a biblioteca de funções específicas a ele

#use delay(clock=4000000)// Frequência do Oscilador

#fuses hs,put,nowdt,noprotect,nobrownout,NOLVP,NOCPD //Configurações

void main()// Rotina principal

{

for( ; ; ) //loop infinito

{

output_high(pin_b7); //acende o led no pino B7

delay_ms(500); //atraza meio segundo

output_low(pin_b7);//apaga o led

delay_ms(500);//atraso

}

}

Para alterar o uC basta alterar a primeira linha e os fuses, que qualquer PIC vai funcionar (desde que não esteja queimado, e que o esquema elétrico esteja correto).

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