Ir ao conteúdo
  • Cadastre-se

Assembly 8051 - Programação & Hardware sobre este MCU


xyko-2020

Posts recomendados

  • Membro VIP

A elektor de junho de 2005 tem um circuito que analisa o logotipo do canal e bloqueia os anuncios quando este não está na tela.

http://www.fbentobrasil.com.br/elektor/edicoes/index.asp?id_revista=38

Original

http://notes.ump.edu.my/fkee/e-Magazine/Elektor%202004/Articles/E/e047S20.pdf

Link para o comentário
Compartilhar em outros sites

  • mês depois...

Olá soschip, quero, quero muito programar, experimentar e trabalhar futuramente com uC!

Eu gostaria de saber como começar, tipo qual uC estão sendo mais usados, que linguagem...

Ouvi falar que um tal psoc é tendencia pro mercado!

Vi que você parou de usar o 8051, está utrapassado?

Tenho um pequeno conhecimento de assembly, bem pequeno mesmo!

E tenho em mão um uC da Motorolla JL3!

Por onde eu inicio a minha jornada de aprendizagem?? Pois muito se falou de nesse tópico eu eu não vejo a hora de compreender tudo isso!!

Obrigado desde já!!

Link para o comentário
Compartilhar em outros sites

Olá pessoal!!! Estou entrando no site pela primeira vez e pude ver que vocês já estão num estágio avançado em assembly...porém, eu estou começando a aprender agora esta linguagem para o 8051. Alguém teria exemplos basicos desta programação para me ajudar?

Desde já, obrigado....

Link para o comentário
Compartilhar em outros sites

Esse livro, do Denys, descreve o microcontrolador 8051 em detalhes, a programação em ASM, a forma de criar, compilar e testar programas, e exemplos de programação para todos os periféricos internos do 8051.

http://www.editoraerica.com.br/buscafinal.asp?cod=721X

O livro é excelente!

[]'s

Link para o comentário
Compartilhar em outros sites

Pesquisei bastante, como sugerido, por onde começar e decidi começar por PIC em assembly!

Achei mais fácil porque facilmente encontra-se material em português, como por exemplo o livro "Desbravando o PIC", muito bom este livro! Embora seja mais fácil, ainda é bem complexo, pra iciantes como eu!

Mas fica aqui minha sugestão!

Obrigado!

Link para o comentário
Compartilhar em outros sites

ae..

ve se alguém consegue me ajudar..

montem o esquema qe tá anexo aí.. pra programar o 89S52

ele tá funcionando, mas com a seguinte condição..

menos de 10cm de cabo!

tava testando com um cabo de 2m..

e não funcionava! de vez em quando, ele pegava a signature do uC, mas quase nunca!

aí lembrei desse problema da distancia.. então, tentei usar um cabo de 1m, qe é o qe eu tinha aqi..

dessa vez ele pegava sempre a signature do uC.. mas, não escrevia dado nenhum.. já dava erro no endereço 0000

então, peguei e liguei o programador direto na lpt1.. com fiozinhos minusculos, qe devem ter uns 10cm.. foi o menor qe consegui, sem me atrapalhar..

e aí, ele programa, lê, funciona tudo direitinho!

não sabia qe o comprimento do cabo podia influenciar tanto assim..

alguém tem uma ideia do qe eu posso fazer? eu precisava usar pelo menos um cabo de 1m.. pra conseguir ligar no pc, com a placa em cima da minha mesa né!

nem qe eu tenha qe interromper o cabo no meio, colocar algum tipo de coisa, sei lá!

me deêm idéias!

post-383534-13884953373449_thumb.jpg

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

-Use cabos de boa qualidade. Eu resolvi um problema parecido usando cabo USB de alta velocidade.

-Coloque o CI próximo a porta, se possível monte dentro do conector DB25 e o cabo de 1 metro saindo do CI 74hc para o dispositivo a ser gravado.

Está usando o 74HC541 ???

edit:

Pode colocar PULL-UPs de 4K7 nas entradas do CI.

Link para o comentário
Compartilhar em outros sites

sim, to usando o 74HC541.. pqe o espanto? heauhaeu

esses resistores de pull-up dão uma boa ajuda, vce acha?

vou tentar fazer esse lance do colocar o 74hc perto do conector..

é perto do conector macho qe ponho no pc, né? e aí, mais um metro de cabo saindo dele, certo?

e mesmo assim coloco o pull-up?

pqe eu sei qe lá na minha facul, os kits são exatamente esse esquema aí.. e o 74hc tá na placa, não tem pull-up

acontece qe tem um latch no meio do caminho no cabo, qe não tem nada especificado no esquema.. e eu nem olhei lá pra ver o qe tinha dentro daqele pedaço do cabo!

amanhã vou tentar por os pull-up e ver no qe dá!

quando aos pull-up.. como coloco? do jeito qe coloqei na imagem anexada? não tenho certeza se ligo eles no vcc ou terra

e outra coisa..

qe qe tu usa pra simular em assembly?

eu uso o pinnacle, mas ele parou de ser atualizado

e a ultima versão não funciona formatação de texto e nem barra de rolagem

são frescuras, mas em códigos grandes enche muito o saco não ter barra de rolagem..

e o texto fica tudo da mesma cor, é ruim também

post-383534-13884953374123_thumb.jpg

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Pull-up é sempre vcc (up). Se fosse GND seria PULL-DOWN.

Dá uma olhada neste projeto e verá que alguns também tiveram problemas de cabo, e portanto tem algumas dicas de como resolver.

http://www.ikalogic.com/isp.php

Aquele resistor no RESET IN não pode ser pull-dowm, aliás não se pode colocar pull-dowm na saída da paralela, pois como o problema é sempre do nível alto estar abaixo de 5V, o resistor vai derrubar mais ainda.

Ah...Não uso e nunca usei simuladores. Meus programas sempre foram testados em placas reais e finais (nada de placa padrão ou kit de desenvolvimento).

Link para o comentário
Compartilhar em outros sites

resistores pull up não adiantaram nada! =\

eles aumentaram a tensão qe entra na paralela de 3,3 pra 3,8V

mas não mudou em nada.. e com os 10cm de cabo, continua funcionando normal

essa semana tento por o 74hc perto do conector macho, rpa ver no qe é qe dá!

então, me falaram qe esses pull down na reset são proteção..

e não tão atrapalhando, o uC reseta normal.. vejo pelos leds ligados na P2 qe acendem todos enquanto o isppgm tenta comunicar com o uC.. no reset a P2 vai inteira pra high né..

outra coisa..

tava usando um 74ls244 pra acender os leds

mas, sem qerer eu queimei ele hje.. o fio caiu da minha mão e coloqei gnd da paralela no vcc! ainda bem qe não deu nada no pc.. mas sei lá por qe motivo o 74ls244 queimou

e é muito difícil achar esse ci.. eu tinha pedido pra um amigo comprar, em sp pra mim.. mas sei lá quando vou conseguir comprar outro desse... tem algum mais fácil de encontrar qe serve pra isso? na loja d eletronica me falaram qe toda essa linha 74 não tá tendo mais..

dá pra eu usar pull up e por no led de 3v?

ou pela arquitetura das portas, é mais fácil acender leds com nível zero, pqe a corrente é maior?

uso um transistor, operando como chave, qe nem o do led de reset no circuito qe mandei?

me lembro qe alguma porta do 8051 podem queimar se eu ligar pullup de jeito errado nela.. até pqe tem nível qe a corrente é negativa, e entra no uC né?

nossa, post meio grande, espero qe dê pra me ajudar! hehe! =D

Link para o comentário
Compartilhar em outros sites

então cara..

aqele esquema é pro meu 8051 funcionar..

e pra eu programar ele..

agora eu tenho, por exemplo, uma placa de leds, qe eu ligo em uma porta por exemplo..

eu não tenho nenhum esqema pronto, pqe fui fazendo de cabeça. e não to no meu pc agora..

fiz um aqui pra te mostrar.. mas tá meio porto, acho qe dá pra entender..

o problema é o qe eu disse.. preciso de alternativas pro ci 74ls244 pqe não tenho mais ele!

pqe ligando direto na porta, os leds acendem muito fracos

post-383534-13884953380572_thumb.jpg

Link para o comentário
Compartilhar em outros sites

e esse ci aí é fácil de achar?

ql qe é? 74ls240?

sabe meu problema? eu sei muito a teoria das coisas, como tudo funciona! por causa da facul..

mas desde qe comecei a tentar a por as coisas na prática, descobri qe nem tudo qe vce quer, vce encontra nas lojas! e aí eu fico meio perdido, sobre quais ci's usar!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Amigo, vá à luta.... o google está ai para isto. O LS240 é tão fácil quanto o 244.

Eu não fiz faculdade, mas pesquiso datasheets e lojas todos os dias.

Existem milhares de lojas virtuais que vendem chips e sites de datasheets.

http://www.soldafria.com.br/advanced_search_result.php?keywords=74ls240&x=0&y=0

Compomil Componentes Eletrônicos Ltda

Farnell Newark

Milcomp Produtos Eletrônicos Ltda :. Loja eletrônica

A prática é algo que só você pode adquirir.

Consulte os datasheets aqui:

www.datasheetcatalog.com

Link para o comentário
Compartilhar em outros sites

o problema de comprar em lojas online é que pago mais de frete do que duzias de ci's

por isso procuro em lojas físicas.. não vou comprar quantidades suficientes pra valer a pena comprar na net...

e.. vir aqui procurar ajuda já é ir a luta...

o google tá aí pra isso, exatamente, foi no google que eu achei esse fórum!

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Galera eu fiz um código em assembly para piscar um led.

Mas to com um problema..


LED EQU P1.0 ; define LED como pino 0 porta 1

org 0

sjmp INICIO ; vaí para o início do programa

org 0003h ; interrupção int0
cjne R1, #0, INTERRUPCAO_TIMER0 ; compara flash R0 E R1 e se R1 e R0 forem iguais então pula para PISCAR_LED
sjmp PISCAR_LED
reti ; retorna para onde estava

INTERRUPCAO_TIMER0:
dec R1 ; incrementa flag R1

; reconfigura timer
clr TR0 ; desliga timer0
; valor inicial 50000
mov TH0, #HIGH (65535 - 50000)
mov TL0, #LOW (65535 - 50000)

setb TR0 ; liga timer0

PISCAR_LED:
clr TR0 ; desliga timer0
jnb LED, ACENDER_LED ; se LED estiver 0 (desligado) então liga
jb LED, APAGAR_LED ; se LED estiver 1 (ligado) então desliga

ACENDER_LED:
setb LED ; LED agora é 1

APAGAR_LED:
clr LED ; LED agora é 0

INICIO:
; configurar timer
mov TMOD, #01h ; timer0 modo 1
; valor inicial 50000
mov TH0, #HIGH (65535 - 50000)
mov TL0, #LOW (65535 - 50000)
mov IE, #82h ; habilita interrupções globais e do timer0
mov IP, #02h ; timer0 com prioridade alta e os demais em baixa

setb TR0 ; liga timer0

sjmp ACENDER_LED ; acender LED

end ; fim do programa

Problema é que o led não pisca, acende normal e tal.

QUal o meu erro?

Link para o comentário
Compartilhar em outros sites

Ja reparou que no fragmento:

INTERRUPCAO_TIMER0:
dec R1 ; incrementa flag R1

; reconfigura timer
clr TR0 ; desliga timer0
; valor inicial 50000
mov TH0, #HIGH (65535 - 50000)
mov TL0, #LOW (65535 - 50000)

setb TR0 ; liga timer0

Ja reparou que ele sempre vai para a rotina piscar LED, e limpar o Timer? não deveria haver um desvio nessa rotina para sair dessa interrupção tipo um sjmp, alias nenhum de seus labels e subrotinas tem desvios, logo o programa vai fazer TODAS as rotinas ignorando as condições, alem do mais não tem um loop principal to teu codigo, como espera que ele pisque se ele não fica "parado" aguardando estouro do timer ?

abs.

Link para o comentário
Compartilhar em outros sites

Hm...


LED EQU P1.0 ; define LED como pino 0 porta 1

org 0

sjmp INICIO ; vaí para o início do programa

org 0003h ; interrupção int0
cjne R1, #0, INTERRUPCAO_TIMER0 ; compara flash R0 E R1 e se R1 e R0 forem iguais então pula para PISCAR_LED
sjmp PISCAR_LED
reti ; retorna para onde estava

INTERRUPCAO_TIMER0:
dec R1 ; incrementa flag R1

; reconfigura timer
clr TR0 ; desliga timer0
; valor inicial 50000
mov TH0, #HIGH (65535 - 50000)
mov TL0, #LOW (65535 - 50000)

setb TR0 ; liga timer0
sjmp LOOP ; desvia para o loop

PISCAR_LED:
clr TR0 ; desliga timer0
jnb LED, ACENDER_LED ; se LED estiver 0 (desligado) então liga
jb LED, APAGAR_LED ; se LED estiver 1 (ligado) então desliga
sjmp LOOP ; desvia para o loop

ACENDER_LED:
setb LED ; LED agora é 1
sjmp LOOP ; desvia para o loop

APAGAR_LED:
clr LED ; LED agora é 0
sjmp LOOP ; desvia para o loop

INICIO:
; configurar timer
mov TMOD, #01h ; timer0 modo 1
; valor inicial 50000
mov TH0, #HIGH (65535 - 50000)
mov TL0, #LOW (65535 - 50000)
mov IE, #82h ; habilita interrupções globais e do timer0
mov IP, #02h ; timer0 com prioridade alta e os demais em baixa

setb TR0 ; liga timer0

acall ACENDER_LED ; acender LED

sjmp LOOP ; desvia para o loop

LOOP:
; fazer código para controlar o tempo do estouro do tmr0 por meio de chaves (p0.1 e p0.2)

sjmp LOOP ; fica em loop

end ; fim do programa

Bom, agora creio eu estar certo, porém mesmo assim não pisca.

Link para o comentário
Compartilhar em outros sites

cara, eu não entendi teu código..

vce entra nas interrupções, e pula de uma pra outra, e aí volta pro programa, não dá reti não dá nada, ele fica pra sempre na rotina do timer..!

mas, tem uma coisa


cjne R1, #0, INTERRUPCAO_TIMER0 ; compara flash R0 E R1 e se R1 e R0 forem iguais então pula para PISCAR_LED

nessa linha ele tá comparando R1 com o número zero, e não com o endereço do R0

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Nunca entre numa rotina de interrupção através de um salto, pois quande der RETI, sua pilha (SP=Stack Pointer) ficará bagunçada, e o PC (Program Counter) se perderá.

Se quer inverter uma saída, não precisa ver como ela está, basta fazer:

CPL LED ; complementa bit ou Px.y

O programinha tá tão confuso que nem dá pra analisar.

Evite colocar sua rotina de interrupção logo no início. Coloque sempre no final. Fica melhor organizado.

No início, 0000h coloque um jump para o 0030h e inicie ali., pois é onde não tem mais vetores de interrupção.

No vetor de interrupção, simplesmente coloque um JUMP para a rotina de tratamento da mesmo.

No início da Rotina de interrupção sempre salve os registros mais importantes como Acumulador e demais registros que você possa usar internamente sem comprometer os demais fora da rotina. Exemplo: Imagine se você está fazendo uma multiplicação A*B e neste instante uma interrupção é gerada. Se dentro você usar o Acc ou o Registro B, os resultados da multiplicação serão alterados.

Use PUSH, para salvar e POP para recuperar. Existe regras para usar estas instruções.

Link para o comentário
Compartilhar em outros sites

Certo amigo soschip, fiz umas alterações..


LED EQU P1.0 ; define LED como pino 0 porta 1

org 0

sjmp INICIO ; vaí para o início do programa

org 0003h ; interrupção int0
mov A, R1 ; acomulador agora tem o valor de R1

jz PISCAR_LED ; compara acomulador com 0, se for vaí para PISCAR_lED

dec R1 ; incrementa flag R1

; reconfigura timer
clr TR0 ; desliga timer0
; valor inicial 50000
mov TH0, #HIGH (65535 - 50000)
mov TL0, #LOW (65535 - 50000)

setb TR0 ; liga timer0
reti ; retorna para onde estava

PISCAR_LED:
clr TR0 ; desliga timer0
cpl LED ; liga ou desliga LED

INICIO:
; configurar timer
mov TMOD, #01h ; timer0 modo 1
; valor inicial 50000
mov TH0, #HIGH (65535 - 50000)
mov TL0, #LOW (65535 - 50000)
mov IE, #82h ; habilita interrupções globais e do timer0
mov IP, #02h ; timer0 com prioridade alta e os demais em baixa

setb TR0 ; liga timer0

setb LED ; acender LED

sjmp LOOP ; desvia para o loop

LOOP:
; fazer código para controlar o tempo do estouro do tmr0 por meio de chaves (p0.1 e p0.2)

sjmp LOOP ; fica em loop

end ; fim do programa

Tá quase certo ou piorou?

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!