Ir ao conteúdo
  • Cadastre-se

Programar pic em Assembler!


douglas.anjos

Posts recomendados

Estou começando agora por isso criei um novo tópico,

Quem tiver um fonte para pic12f675 bem pequeno e comentado pro gentileza me de uma força, entrei neste forum porque vi varios problemas sendo resolvidos, espero que encontre alguem que possa me ajudar.

Já comprei o gravador e junto veio MPlab e ICprog.

Para informação , já li varios aquivos sobre o fonte, como criar um projeto no MPlab e como gravar o fonte .hex no pic,mais ainda tenho muitas dúvidas no q se refere a registros, memórias eprom, interupções, resumindo não sei nada ainda o bastante para fazer nem sequer um pisca led, mais conto com a ajuda de vôces porque o que já li não abrangeu as minhas necesidades.

Desde já agradeço a todos que vão me ajudar e creio q esse tópico vão ser muito usado ainda por iniciantes como eu!!

Douglas.anjos

JESUS é o caminho verdade e a vida, ninguem vem ao PAI senão por "MIM".

Link para o comentário
Compartilhar em outros sites

Ola amigo, primeiro parabens por escolher um PIC da familia 12F, eu partcularmente, acho os melhores pra quem está começando.

vou te ajudar postando um codigo bem simples, mas qualquer duvida pergunte ok!


#INCLUDE "P12F675.INC" ;SELECIONA MCU
__CONFIG MCLRE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT ;Oscilador interno DESABILITA MASTER RESET E WATCHDOG TIMER
#DEFINE LED GPIO,2 ;DEFINE QUE LED SERA GP2
#DEFINE BOTÃO GPIO,1 ;DEFINE QUE BOTAO SERA GP1

ORG 0X00 ;AQUI É O ENDEREÇO ONDE O PROGRAMA COMEÇA
GOTO INICIO ;DESVIA PARA O INICIO

INICIO:
BANKSEL OSCCAL ; SELECIONA PARA O BANCO ONDE ESTA O REGISTRADOR
CALL 3FFH ;CALIBRA OSCILADOR PARA 4MHz
MOVWF OSCCAL;MANDA A CONFIGURAÇÃO PARA OSCCAL
BANKSEL GPIO ;SELECIONA O BANCO ONDE ESTA GPIO
CLRF GPIO ; LIMPA REG. GPIO (COLOCA TUDO EM '0')
BANKSEL ANSEL
CLRF ANSEL; LIMPRA REG. ANSEL
BANKSEL CMCON; SELECIONA REG. DO COMPARADOR
MOVLW 07H ;CARREGA w COM 7 EM HEXA (111 EM BINARIO)
MOVWF CMCON; MOVE 7 PARA CMCON E DESLIGA COMPARADOR
BANKSEL TRISIO ; SELECIONA TRISIO.
MOVLW 02H ;CARREGA W COM 02 EM HEXA (01 EM BINARIO)
MOVWF TRISIO; CONFIGURA i/o DE MODO QUE GP2 = SAIDA GP1 = ENTRADA
BCF STATUS,RP0 ;VOLTA AO BANCO 0

LOOP:
BTFSC BOTAO ; TESTA O VALOR BOTAO
GOTO LED_APAGA ; É 1 ENTÃO VAI PRA LED_APAGA
BSF LED ; É ZERO ENTÃO LIGA LED
GOTO LOOP
LED_APAGA:
BCF LED ;DESLIGA LED
GOTO LOOP ;E VOLTA AO LOOP
END ;FIM DO CODIGO

como voce pode ver, é bem simples, e perdemos mais tempo configurando o PIc do que com o codigo principal, então desde que voce aprenda a configurar bem teu MCU, o resto é bem mais fácil, depende da tua criatividade, esse programa ai, fica monitorando o botão enquanto ele estiver solto, o led fica apagado, quando voce o pressiona ele acende o led.

mais duvidas pergunte!

abs.

Link para o comentário
Compartilhar em outros sites

porque quer aprender o assembly em questao,ja q temos linguagens mais faceis.Eu ja programei em asm,mais agora q achei o pic basic mudei rapidim kkkkkkkk,imagine so q pra um delay de 1ms em asm vai algumas linhas enquanto no basic apenas delay_ms 1000.Mais segue um dimmer de chuveiro com display sete seg em asm q desenvolvi


;* ARQUIVOS DE DEFINIÇÕES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#INCLUDE <P16F84.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F84

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* PAGINAÇÃO DE MEMÓRIA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA

#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA

CBLOCK 0x0C ;ENDEREÇO INICIAL DA MEMÓRIA DE
;USUÁRIO

W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA
STATUS_TEMP ;INTERRUPÇÕES
;ESTAS VARIÁVEIS NEM SERÃO UTI-
;LIZADAS
CONTADOR ;ARMAZENA O VALOR DA CONTAGEM
FLAGS ;ARMAZENA OS FLAGS DE CONTROLE
FILTRO1 ;FILTRAGEM PARA O BOTÃO 1
FILTRO2 ;FILTRAGEM PARA O BOTÃO 2
PERIODO
ENDC ;FIM DO BLOCO DE MEMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FLAGS INTERNOS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA

#DEFINE ST_BT1 FLAGS,0 ;STATUS DO BOTÃO 1
#DEFINE ST_BT2 FLAGS,1 ;STATUS DO BOTÃO 2

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* CONSTANTES *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA

MIN EQU .0 ;VALOR MÍNIMO PARA O CONTADOR
MAX EQU .9 ;VALOR MÁXIMO PARA O CONTADOR
T_FILTRO EQU .255 ;FILTRO PARA BOTÃO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ENTRADAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)

#DEFINE BOTAO1 PORTA,1 ;PORTA DO BOTÃO
; 0 -> PRESSIONADO
; 1 -> LIBERADO

#DEFINE BOTAO2 PORTA,2 ;PORTA DO BOTÃO
; 0 -> PRESSIONADO
; 1 -> LIBERADO

#DEFINE LED PORTA,0 ;LED PARA CONTADOR > 15

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* SAÍDAS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)


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

ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO
GOTO INICIO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INÍCIO DA INTERRUPÇÃO *

ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO
MOVWF W_TEMP ;COPIA W PARA W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP ;COPIA STATUS PARA STATUS_TEMP

BTFSS INTCON,INTF ;FOI INTERRUPÇÃO EXTERNA RB0?
GOTO SAI_INT ;NÃO, SAI SEM AÇÃO
;SIM, ENTÃO PASSOU 1MS
BCF INTCON,INTF ;LIMPA FLAG DA INTERRUPÇÃO

MOVLW .9
XORWF PERIODO,W
BTFSC STATUS,Z ;PERÍODO = 9?
CLRF PERIODO ;SIM, ENTÃO PERIÓDO = 0
;NÃO
MOVF PERIODO,F
BTFSC STATUS,Z ;PERÍDODO = 0?
BSF LED ;SIM, ENTÃO LIGA A SAÍDA
;NÃO
MOVF PERIODO,W
XORWF CONTADOR,W
BTFSC STATUS,Z ;PERÍODO = CONTADOR?
BCF LED ;SIM, DESLIGA A SAÍDA
;NÃO
INCF PERIODO,F ;INCREMENTA PERÍODO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FIM DA INTERRUPÇÃO *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
SAI_INT
SWAPF STATUS_TEMP,W ;COPIA STATUS_TEMP PARA STATUS
MOVWF STATUS
SWAPF W_TEMP,F ;COPIA W_TEMP PARA W
SWAPF W_TEMP,W
RETFIE ;RETORNA DA INTERRUPÇÃO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA DE CONVERSÃO BINÁRIO -> DISPLAY *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA IRÁ RETORNAR EM W, O SIMBOLO CORRETO QUE DEVE SER
; MOSTRADO NO DISPLAY PARA CADA VALOR DE CONTADOR. O RETORNO JÁ ESTÁ
; FORMATADO PARA AS CONDIÇÕES DE LIGAÇÃO DO DISPLAY AO PORTB.
; a
; **********
; * *
; f * * b
; * g *
; **********
; * *
; e * * c
; * d *
; ********** *.

CONVERTE
addwf PCL
; ABCDEFG
retlw B'01111110' ;0
retlw B'00110000' ;1
retlw B'01101101' ;2
retlw B'01111001' ;3
retlw B'00110011' ;4
retlw B'01011011' ;5
retlw B'01011111' ;6
retlw B'01110000' ;7
retlw B'01111111' ;8
retlw B'01111011' ;9


;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIO DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

INICIO
BANK1 ;ALTERA PARA O BANCO 1
MOVLW B'11111111'
MOVWF TRISA ;DEFINE RA1 E 2 COMO ENTRADA E DEMAIS
;COMO SAÍDAS
MOVLW B'00000001'
MOVWF TRISB ;DEFINE TODO O PORTB COMO SAÍDA

MOVLW B'10010000'
MOVWF INTCON ;TODAS AS INTERRUPÇÕES DESLIGADAS
BANK0 ;RETORNA PARA O BANCO 0

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* INICIALIZAÇÃO DAS VARIÁVEIS *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
CLRWDT
CLRF PORTA ;LIMPA O PORTA
CLRF PORTB ;LIMPA O PORTB
CLRF FLAGS ;LIMPA TODOS OS FLAGS

MOVLW MIN
MOVWF CONTADOR ;INICIA CONTADOR = MIN
GOTO ATUALIZA ;ATUALIZA O DISPLAY INICIALMENTE

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* ROTINA PRINCIPAL *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
MAIN
MOVLW T_FILTRO
MOVWF FILTRO1 ;INICIALIZA FILTRO1 = T_FILTRO
MOVWF FILTRO2 ;INICIALIZA FILTRO2 = T_FILTRO

CHECA_BT1
BTFSC BOTAO1 ;O BOTÃO 1 ESTÁ PRESSIONADO?
GOTO BT1_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO
;SIM
DECFSZ FILTRO1,F ;DECREMENTA O FILTRO DO BOTÃO
;TERMINOU?
GOTO CHECA_BT1 ;NÃO, CONTINUA ESPERANDO
;SIM
BTFSS ST_BT1 ;BOTÃO JÁ ESTAVA PRESSIONADO?
GOTO DEC ;NÃO, EXECUTA AÇÃO DO BOTÃO
GOTO CHECA_BT2 ;SIM, CHECA BOTÃO 2

BT1_LIB
BCF ST_BT1 ;MARCA BOTÃO 1 COMO LIBERADO

CHECA_BT2
BTFSC BOTAO2 ;O BOTÃO 2 ESTÁ PRESSIONADO?
GOTO BT2_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO
;SIM
DECFSZ FILTRO2,F ;DECREMENTA O FILTRO DO BOTÃO
;TERMINOU?
GOTO CHECA_BT2 ;NÃO, CONTINUA ESPERANDO
;SIM
BTFSS ST_BT2 ;BOTÃO JÁ ESTAVA PRESSIONADO?
GOTO INC ;NÃO, EXECUTA AÇÃO DO BOTÃO
GOTO MAIN ;SIM, VOLTA AO LOOPING

BT2_LIB
BCF ST_BT2 ;MARCA BOTÃO 2 COMO LIBERADO
GOTO MAIN ;RETORNA AO LOOPING

DEC ;AÇÃO DE DECREMENTAR
BSF ST_BT1 ;MARCA BOTÃO 1 COMO JÁ PRESSIONADO
MOVF CONTADOR,W ;COLOCA CONTADOR EM W
XORLW MIN ;APLICA XOR ENTRE CONTADOR E MIN
;PARA TESTAR IGUALDADE. SE FOREM
;IGUAIS, O RESULTADO SERÁ ZERO
BTFSC STATUS,Z ;RESULTOU EM ZERO?
GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT.
;NÃO
DECF CONTADOR,F ;DECREMENTA O CONTADOR
GOTO ATUALIZA ;ATUALIZA O DISPLAY

INC ;AÇÃO DE INCREMENTAR
BSF ST_BT2 ;MARCA BOTÃO 2 COMO JÁ PRESSIONADO
MOVF CONTADOR,W ;COLOCA CONTADOR EM W
XORLW MAX ;APLICA XOR ENTRE CONTADOR E MAX
;PARA TESTAR IGUALDADE. SE FOREM
;IGUAIS, O RESULTADO SERÁ ZERO
BTFSC STATUS,Z ;RESULTOU EM ZERO?
GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT.
;NÃO
INCF CONTADOR,F ;INCREMENTA O CONTADOR
GOTO ATUALIZA ;ATUALIZA O DISPLAY

ATUALIZA

MOVF CONTADOR,W
CALL CONVERTE ;CONVERTE CONTADOR NO NÚMERO DO
;DISPLAY
MOVWF PORTB ;ATUALIZA O PORTB PARA
;VISUALIZARMOS O VALOR DE CONTADOR
;NO DISPLAY
GOTO MAIN ;NÃO, VOLTA AO LOOP PRINCIPAL

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* FIM DO PROGRAMA *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

END ;OBRIGATÓRIO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Link para o comentário
Compartilhar em outros sites

Bom programar em assembly, tem as suas vantagens e não são poucas, as praticas são o fato de voce ter um controle total sobre o que acontece com cada parte do MCU, segundo voce ganha velocidade de processamento, ja que um arquivo compilado de linguagem assembly é muito mais leve do que um de qualquer linguagem de mais alto nivel, mas mesmo assim é sempre bom saber os dois, pois para uma interface grafica com o usuario por exemplo é muito maior custo x beneficio de se programar em C por exemplo usando bibliotecas prontas, so aplicando a logica!

abs.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Link para o comentário
Compartilhar em outros sites

Por acaso cv não tem uma tabela com as instruções para linguagem asm, vejo que o que já li não tem todas instruções usadas.

se diz isso pelo Banksel, esqueça nenhuma tabela tem ela, pois nao é uma instrução e sim um diretiva do compilador, voce escreve e na hora de compilar o MPlab por exemplo substitui pelas instruções equivalentes!

as diretivas do compilador podem ser encontradas em varios livros!

abs.

Link para o comentário
Compartilhar em outros sites

Por acaso cv não tem uma tabela com as instruções para linguagem asm, vejo que o que já li não tem todas instruções usadas.

Neste manual do fabricante tem a descrição de todas as instruções:

http://ww1.microchip.com/downloads/en/DeviceDoc/33023a.pdf

E aqui o manual do MPASM, que faz parte do MPLAB IDE da Microchip:

http://ww1.microchip.com/downloads/en/DeviceDoc/33014K.pdf

Também estou à disposição para solucionar suas dúvidas.

Ao contrário do que a maioria pensa, eu acredito que primeiramente deveriamos aprender a programar os microcontroladores em Assembly, para depois partir para linguagens de nível mais alto.

Link para o comentário
Compartilhar em outros sites

Valeu pelo incentivo, ao contrário d muitos q já tem suas opiniões definidas a respeito de linguagem e ficam vendendo seu peixe ao invés de ajudar, muitos já me disseram pra migrar pra basic, c, mais acho q como eu não conheço nenhuma linguagem,em ASM não vou conseguir enxergar tantas 'dificuldades' pois como já disse não conheço nada a não ser um começo em ASM.

Mais vou precisar muito de sua ajuda, inclusive o felipe postou um fonte legal pra iniciar, mais na hora de compilar não consegui zerar os 'error', dai consegui gravar mais ainda não testei em loco, porq estou providenciando os outros componentes q faltam.

Para informação estou compilando no MPlab, Falou.

Salva ai !!.

Ate aqui via agradecimentos para, FELIPE_ELETRONIC>SOS_CHIP>MULDER_FOX.

Não desmerecendo ninguem, pois é contra regra, mais esses tem ajudado muito a mim e a outros do forum, VALEU.

Link para o comentário
Compartilhar em outros sites

Valeu pelo incentivo, ao contrário d muitos q já tem suas opiniões definidas a respeito de linguagem e ficam vendendo seu peixe ao invés de ajudar, muitos já me disseram pra migrar pra basic, c, mais acho q como eu não conheço nenhuma linguagem,em ASM não vou conseguir enxergar tantas 'dificuldades' pois como já disse não conheço nada a não ser um começo em ASM.

Mais vou precisar muito de sua ajuda, inclusive o felipe postou um fonte legal pra iniciar, mais na hora de compilar não consegui zerar os 'error', dai consegui gravar mais ainda não testei em loco, porq estou providenciando os outros componentes q faltam.

Para informação estou compilando no MPlab, Falou.

Salva ai !!.

Ate aqui via agradecimentos para, FELIPE_ELETRONIC>SOS_CHIP>MULDER_FOX.

Não desmerecendo ninguem, pois é contra regra, mais esses tem ajudado muito a mim e a outros do forum, VALEU.

É isto aí.

O importante é não desanimar.

Quando resolvi aprender a utilizar os microcontroladores, somente tinha conhecimento de eletrônica analógica e digital, mas nada de programação.

Comprei um livro que ensinava a utilizar o PIC16F628A e a programá-lo em Assembly.

É claro que penei um pouco no começo.

Somente depois é que fiquei sabendo que poderia utilizar outras linguagens.

Mas, até hoje programo apenas em Assembly.

Para mim, Basic e C e que são estranhos :)

Mas eu não sou profissional e, portanto, não tenho que concluir rapidamente meus projetos.

As linguagens de nível mais alto tem esta grande vantagem: agilidade.

Para você ter uma ideia do ponto onde cheguei, veja este programa que fiz para o PIC16F877A e agora vou ter de adaptá-lo para o PIC18F452, pois, não coube na memória:

http://www.esnips.com/doc/5885255c-f176-4729-a804-ff1620488792/SIIM-16F

Não estou querendo me gabar não. Longe disto.

Apenas quero que saiba que, se se esforçar, poderá me ultrapassar.

Já sabe que pode contar comigo para esclarecer suas dúvidas.

Link para o comentário
Compartilhar em outros sites

Para mim acho q vai se mais fácil começando em ASM, já q não conheço nenhuma outra linguagem.

Acho q muitos querem vender seu peixe (BASIC, C), porq já estão familiarizados com outra linguagem.Mais vou persistir até conseguir acender um led, heheh.

Ai sabe esse fonte q o felipe postou nesse tópico? Então, não estou conseguindo

eliminar todos 'error' na compilação, uso MPlab. Consegui gravar mais não sei se vai funcionar por causa da compilação.

Tambem não sei simular, alguem pode me ajudar nessa compilação?

Obrigado.

Link para o comentário
Compartilhar em outros sites

Building PIC1.HEX...

Compiling PIC1.ASM:

Command line: "C:\ARQUIV~1\MPLAB\MPASMWIN.EXE /aINHX8M /e+ /l+ /x- /w0 /c- /p12F675 /q C:\0PIC\LED1\PIC1.ASM"

Error[108] C:\0PIC\LED1\PIC1.ASM 2 : Illegal character (&)

Message[302] C:\0PIC\LED1\PIC1.ASM 12 : Register in operand not in bank 0. Ensure that bank bits are correct.

Message[302] C:\0PIC\LED1\PIC1.ASM 16 : Register in operand not in bank 0. Ensure that bank bits are correct.

Message[302] C:\0PIC\LED1\PIC1.ASM 22 : Register in operand not in bank 0. Ensure that bank bits are correct.

MPLAB is unable to find output file "PIC1.HEX". This may be due to a compile, assemble, or link process failure.

Build failed.

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