Ir ao conteúdo
  • Cadastre-se

BASCOM 8051 - alguém tem apostila.


bene_tec

Posts recomendados

Olá, pessoal !

Bom, eu já estou acostumado com a programação assembler do 8051 num programa IDE da acebus ( http://www.acebus.com ).

Acontece que a vesão demo só aceita 14KB no editor assembler, o que não dá para fazer nem o programa completo pra um AT89C2051 de 2KB. Não dá porque gosto de editar colocando muitos comentários em cada rotina.

Então baixei este BASCOM 8051 mas não o conheço bem e não tem um arquivo Help tão detalhado como ao programa que citei anteriormente.

Se alguém tiver alguma apostila, e se puder, por favor passe para mim.

Aguadeço desde já...

Link para o comentário
Compartilhar em outros sites

Ola !!! Bene_tec , o BASCOM-8051 tem uma versão demo de 4K , ou seja ,

você pode escrever programas para micros com até 4K de RAM ou o AT89C4051 . Mas tem uma coisa a respeito ,você tem que escrever o programa em Qbasic.

Se você já está familiarizado com o asm do 8051 e não tem tempo para aprender uma nova forma de programar , pode usar um compilador para o

8051 que aceita asm ou c sem o limite de 4K o ( Reads51 ).

Aqui ( http://www.rigelcorp.com/8051soft.htm ).

Esquema do programador HMP ( http://at89c2051-4051.blogspot.com/ ).

Abaixo um link, com alguns exemplos que escrevi em Qbasic para o BASCOM-8051.

http://www.4shared.com/file/79579157/b393c747/Bascom_exemplos.html

Forte abraço de Angelo Cialla Filho ... ( py1acb )

Link para o comentário
Compartilhar em outros sites

py1acb, obrigado pela dica. Baixei o programa e agora vou ver o que posso fazer com ele. Preciso criar pequenas rotinas somente para testar antes de migrar definitivamente.

você não acredita o que estou tendo que fazer para meus programas caberem no editor que estou usando. Aquele do primeiro post.

Estou pegando as rotinas maiores já testadas e colocando no editor em códigos hexadecimais tipo assim:

org xxxh

rotina: ;rotina exemplo a ser chamada por: lcall rotina

db xxh,yyh,............zzh,22h ; 22h é código para RET.

é mole?

OBS: não estou conseguindo acessar http://py1acb.hpg.com.br/at89c2051.html

Link para o comentário
Compartilhar em outros sites

bene_tec! Experimenta esse daqui:

http://www.pjrc.com/tech/8051/

É o AS31. Não sei te dizer se ele é bom porque faz muito tempo que eu não programo em ASM. Mas, é aberto e free.

Dá uma olhada nisto daqui tb:

http://www.google.com.br/search?hl=pt-BR&q=8051+assembler+program+download&btnG=Pesquisa+Google&meta=

[]'s

Link para o comentário
Compartilhar em outros sites

beleza, Maurício.

Então, o que uso é este:

http://www.acebus.com/win8051.htm

Com ele, entro com as linhas em assembler sem nenhuma "frescura".

Se tiver erros, na hora de montar, ele informa a linha e o erro.

O problema com os demais é que não consigo copiar o que já editei neste programa e colar no outro e assim 'assemblar' (criar códigos e HEXadecimal para programação).

Acho que falta alguma coisa antes, como uma declaração que o programa é assembly 51 e não C ou BASIC.

Como eu disse antes, meu forte é o assembler 'puro', e até já tenho decorado todas as instruções do 8051 e até mesmo todos os registros e seu endereços.

Pra que aprender uma linguagem de alto nível quando posso manipular diretamente o microcontrolador da forma como eu quero?

Antigamente, antes das famosas IDEs, eu criava os programas em HEXADECIMAL e dava certo...

Uma vez até fiz o programa inteiro em binário, pois não tinha um programador e então programei através de chaves byte a byte, daí minha facilidade com os códigos.

Link para o comentário
Compartilhar em outros sites

Baixe daqui o BASCOM-8051 Manual

http://www.mcselec.com/index.php?option=com_docman&task=doc_download&gid=164&Itemid=54

Nota:

No bascom para "inserir" assembler ten de usar as directivas:

$ASM

.

.

.

.

$END ASM

---------------------------------

EX

$ASM

Ldi R27 , $00 'Load R27 with MSB of address

Ldi R26 , $60 'Load R26 with LSB of address

Ld R1, X 'load memory location $60 into R1

SWAP R1 'swap nibbles

$END ASM

-------------------------------------

Outra possibilidade será usar um assembler sem essas limitaç~es que disse de tamanhos.

Experimente este.

http://www.atmel.com/dyn/resources/prod_documents/ASMB51.EXE

Link para o comentário
Compartilhar em outros sites

Valeu, zurca...

mas será que eu poderia editar o programa inteiro em assembler entre essas duas diretivas ?

Exemplo:

$ASM

org 0

mov a, #0ffh ; esta é a sintaxe do 8051-IDE da acebus

loop: mov p1,a

lcall delay

cpl a

sjmp loop

$END ASM

Qual seria a forma correta de editar esta simples rotina no bascom8051 e como criar o arquivo HEX ?

Obrigado!

Link para o comentário
Compartilhar em outros sites

Nunca me tinha lembrado disso de incluir TODO o programa.

Mas com o bascom_avr (Costumo trabalhar mais com AVRs)que uso permite com pequenas alterações.

por esemplo tem de remover a definição micro do seu programa

A definição tem de ser feita com

$regfile = "8051.dat" antes de $ASM

Outra coisa que tem de retirar do seu programa serão as definições do Registos isto se tiver no seu programa.

Mas experimente que vai ver não é difícil pois o software dá a indicação do erro e da respectiva linha.

Quanto a editar o seu programa pode fazer com qualquer editor e renomear de

xxxx.asm para xxxx.bas.

Depois no bascom basta abrir o p ficheiro xxxx.bas e compilar .Se tiver erros vai indicar a linha e o erro.

Acredite que não é difícil , claro que tem de saber um pouco de programação em basic e tipo de estruturas.

O resto é sintaxe mas como indica os erros é fácil .

Link para o comentário
Compartilhar em outros sites

Pra que aprender uma linguagem de alto nível quando posso manipular diretamente o microcontrolador da forma como eu quero?

Como eu digo no meu livro (de C), é muito mais simples procurar bugs em algumas linhas de código de alto nível do que milhares de linhas de assembly, mas.... :D

Quando você precisar trabalhar com cálculos em números maiores do que 8 bits, e números com ponto flutuante, aí você vai ver pra que que serve uma linguagem de alto nível, ehehehehehe

[]'s

Link para o comentário
Compartilhar em outros sites

De forma alguma quis dizer que o C ou o BASIC não são necessários, mas todas as liguagens de alto nível foram criadas em assembly. Então fica a pergunta:

Qual é a mais importante de se conhecer bem?

No meu caso, para cálculos (muito raros) uso alguns algorítimos que aprendi desde a época em que se usava o co-processador matemático 8087 dos antigos XTs.

O que não quero é me acostumar com um compilador C ou Basic. E o dia em que eu precisar do assenbly puro?

É como só fazer contas com calculadora e no dia que faltar, não saberá nem fazer uma simples soma no lápis...hehehe. Não leve a mal, é só a minha opinião.

É mais ou menos assim que penso: Aprenda todos os idiomas que quiser, mas primeiro aprenda bem o Português... não concorda?

Link para o comentário
Compartilhar em outros sites

Não!! ehehehehehe

Pra você ver.... Escreví um livro de C pro 8051 e hoje programo pro AVR.

Não sei uma instrução em ASM pro AVR!!! :lol: (mentira, vai! Sei duas: clear interrupts e enable interrupts!!!! :D) Só!! Mais nada! :D:rolleyes:

Nunca mais usei ASM! Não precisa, ehehehehehehe

Não adianta! Eu não vou tentar te convencer, mas, não tem papo: linguagem de alto nível é outra história. Além da portabilidade ser muito, mas muito maior do que em ASM!

Se você programa em ASM pro 51, você só vai portar esse programa pra um outro 51! Migrar seu código ASM prum outro MCU?? Vixe!!! Possível, é! Mas, dá um trabáio!!! :lol:

Migrei todas as minhas rotinas C do 8051 pro AVR. Tudo funcionou quase de cara! Agora, se eu tivesse escrito em ASM de 8051.... :lol:

Depois que você cria suas bibliotecas, você escreve APLICAÇÕES quase que imediatamente!!!

Tenho que reconhecer que realmente C só não resolve UMA VEZ POR ANO!!! ...só que é a cada 10 anos!!! :lol:

Abraços bene_tec, e boas programações. É isso que importa.:-BEER

Link para o comentário
Compartilhar em outros sites

Não!! ehehehehehe

Se você programa em ASM pro 51, você só vai portar esse programa pra um outro 51! Migrar seu código ASM prum outro MCU?? Vixe!!! Possível, é! Mas, dá um trabáio!!! :lol:

Migrei todas as minhas rotinas C do 8051 pro AVR. Tudo funcionou quase de cara! Agora, se eu tivesse escrito em ASM de 8051.... :lol:

Agora você me tentou a aprender! hehehe

É que faz um tempão que estou querendo usar AVR, mais precisamente o ATTiny11, 13 ou 15 por causa do número reduzido de pinos. Cheguei a comprar PICs (12F629 e 12F675) para decodificar HT6P20 pra CR de 4 canais mas não nenho a mínima vontade de usar PIC e acabei usando mesmo o bom e velho AT89C2051. funciona muito bem, mas sobram 8 pinos e falta espaço.

realmente olhando o mapa de registros destes pequenos mas poderosos uCons, é complicado trabalhar em assembly.

Você mencionou um livro num post anterior... Acha que é possível aprender C somente com livros e apostilas. É que já estou com 42 e não tenho mais tempo de ir em escolas. Queria frisar que aprendi 8051 somente com databook da INTEL e portanto me acho apto a encarar esta 'missão'.

Me indique um bom livro de C para AVR. Valeu!

Pra terminar este post, um pequeno desafio (sei que pra você o pro zurca deve ser moleza)

Como ficaria uma rotina de um oscilador de 1Hz no AVR e no PIC12F629 ( 500mS on / 500mS off) com saída em qualquer um dos pinos e se possível fazer a mesma rotina em C ou BASIC e em assembly pra gente comparar?

Os osciladores internos destes uC são precisos ?

Link para o comentário
Compartilhar em outros sites

Aqui tem como é simples no bascom (com atmega8)

' Exemplo simples pisca led porda D pino 4 com 500 mS

'

'

$regfile = "m8def.dat"

$swstack = 32

'$source = On

$crystal = 12000000

Declare Sub Initports()

' Start pgm ---------------------------------------------------

Call Initports()

' Main loop ---------------------------------------------------

Do

Set Portd.4

Waitms 500

Reset Portd.4

Waitms 500

Loop

'----------------------Subs --------------------------

Sub Initports()

Ddrd = &B11110000

End Sub

-------------------------------------

:1000000012C0189518951895189518951895189563

:100010001895189518951895189518951895189578

:100020001895189518958FE58DBFC0E4E0E24E2E27

:1000300084E08EBFD4E0F4E05F2EEEEFF3E0A0E6C4

:10004000B0E088278D933197E9F7662409D0949A18

:1000500084EF91E011D0949884EF91E00DD0F7CF28

:1000600080EF81BB08953197F1F70895689462F8A5

:100070000895E89462F80895EF93FF93EE27E82B34

:10008000E92B31F0E8EBFBE03197F1F70197D1F77D

:06009000FF91EF910895BD

:00000001FF

Link para o comentário
Compartilhar em outros sites

Se usar o Fastavr seria assim (com atmega8)

$Device= m8

$Stack = 32

$Clock = 12

Declare Sub Initports()

' Start pgm ---------------------------------------------------

Initports()

' Main loop ---------------------------------------------------

Do

Set PORTD.4

WaitMs 500

Reset PORTD.4

WaitMs 500

Loop

'----------------------Subs --------------------------

Sub Initports()

DDRD = &B11110000

End Sub

--------------------------

Este tem a vantagem de gerar tambem o asm alem do hex.

;FastAVR Basic Compiler, ver.4.3.0, by MicroDesign

;Created 20:35:35, 05-12-2007

;

.include "E:\FastAVR430\inc\m8def.inc"

;

.DSEG

.CSEG

.ORG 0x0000

_Reset:

ldi yl,byte1(RAMEND)

out SPL,yl

ldi yh,byte2(RAMEND)

out SPL+1,yh

sbiw yl,32

;****** USERS BASIC CODE **********************

;-Line--0013----Initports()--

call initports

;-Line--0018----Do--

L0000:

;-Line--0020----Set PORTD.4--

sbi PORTD,4

;-Line--0021----WaitMs 500--

ldi zl,byte1(500)

ldi zh,byte2(500)

call _Wms

;-Line--0022----Reset PORTD.4--

cbi PORTD,4

;-Line--0023----WaitMs 500--

ldi zl,byte1(500)

ldi zh,byte2(500)

call _Wms

;-Line--0025----Loop--

rjmp L0000

L0001:

;-Line--0029----Sub Initports()--

initports:

;-Line--0031----DDRD = &B11110000--

ldi zl,byte1(240)

out DDRD,zl

;-Line--0033----End Sub--

L0002:

ret

;****** END OF USER BASIC CODE ****************

;////// _Waitms ///////////////////////////

_Wms: ldi r20,0x14

_Wms1: ldi r21,0xC7

_Wms2: dec r21

brne _Wms2

dec r20

brne _Wms1

dec zl

brne _Wms

ret

;System Global Variables: 0 bytes

;User Global Variables: 0 bytes

-----------------------------

:020000020000FC

:10000000CFE5CDBFD4E0DEBFA0970E941200949A46

:10001000E4EFF1E00E9415009498E4EFF1E00E9413

:100020001500F5CFE0EFE1BB089544E157EC5A9598

:0C003000F1F74A95D9F7EA95C1F7089559

:00000001FF

Link para o comentário
Compartilhar em outros sites

Muito bom, zurca!

Estou vendo que no Fast AVR o número de bytes usados ficou menor que no BASCOM.

E já tenho o FastAVR.

E é justamente com isso que as vezes me preocupo, pois o attiny13, por exemplo, tem apenas 1KByte de flash. Então, se tenho que criar várias tabelas ou vários modelos de telas para LCDs seriais gráficos, tenho que economizar ao máximo a memória de programa.

consegui abrir os E-Books da forma como me indicou, desabilitando o DAP.

Agora vou estudar um pouco e futuramente posto o resultado do que aprendi.

Mais uma dúvida: posso usar qualquer posição livre da RAM para contagem assim como no 8051 ?

Ex: djnz 10h ; Decrement and Jump if Not Zero ( 10h pode ser de 00 a 7Fh)

ou inc 10h ; (10h) = (10h)+1 - incrementa conteúdo desse endereço da RAM

Por enquanto, muito obrigado!

Link para o comentário
Compartilhar em outros sites

Ainda bem que conseguiu.

Eu sei que sim mas o facto é que alguns programas deste tipo podem ser otimizados.

Note que nos exemplos acima "atirei" com as instruções . Não fiz qualquer setup do compilador. Isto leva a que um possa incfluir codigo desnecessário.

Mas tudo isso se pode evitar com esses software, basta excluir o desnecessário , utilizar as opções de otimização etc etc.

Mas isto como bem sabe só vai conseguir aprendendo e testando .

Note que tambem uso assembler mas apenas no caso de tempos serem mesmo muito criticos .

Se desejar usar C tente o WinAvr.

Se desejar pascal tem por exemplo o Avrpascal da E-LAB.

Se desejar pode mesmo nem aprender nada , use o Algorithm Builder

Link para o comentário
Compartilhar em outros sites

Agora você me tentou a aprender! hehehe

É que faz um tempão que estou querendo usar AVR, mais precisamente o ATTiny11, 13 ou 15 por causa do número reduzido de pinos. Cheguei a comprar PICs (12F629 e 12F675) para decodificar HT6P20 pra CR de 4 canais mas não nenho a mínima vontade de usar PIC e acabei usando mesmo o bom e velho AT89C2051. funciona muito bem, mas sobram 8 pinos e falta espaço.

realmente olhando o mapa de registros destes pequenos mas poderosos uCons, é complicado trabalhar em assembly.

Você mencionou um livro num post anterior... Acha que é possível aprender C somente com livros e apostilas. É que já estou com 42 e não tenho mais tempo de ir em escolas. Queria frisar que aprendi 8051 somente com databook da INTEL e portanto me acho apto a encarar esta 'missão'.

Me indique um bom livro de C para AVR. Valeu!

Pra terminar este post, um pequeno desafio (sei que pra você o pro zurca deve ser moleza)

Como ficaria uma rotina de um oscilador de 1Hz no AVR e no PIC12F629 ( 500mS on / 500mS off) com saída em qualquer um dos pinos e se possível fazer a mesma rotina em C ou BASIC e em assembly pra gente comparar?

Os osciladores internos destes uC são precisos ?

Boa safra essa nossa, ehehehehehehe :D

Claro que dá pra aprender por conta própria!! Basta que o autor tenha didática e o aluno tenha boa-vontade, e faça os exemplos, né?

Eu tb aprendí C através de livros e apostilas, e depois, pra programar pro 51 tive muita ajuda de quem não ganhava nada pra ajudar!

Nesse fórum, que eu frequento tb, é só de eletrônica e MCUs. Dá uma passada lá pra conhecer:

http://www.asm51.eng.br/phpbb/index.php

O Fábio Pereira, um dos mais conhecidos autores sobre MCUs, tb está lá, além de outros autores, tb.

Em português, não conheço nenhum livro de C pra AVR.

Sem querer puxar, mas já puxando, leia o meu livro pro 8051 e depois a gente dá as dicas pro AVR. C é C!!! Só muda a máquina!! :cool:

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

Se for comprar, não compra lá não! Procura na net que você acha bem mais barato!

/******************************

AVR ATTINY2313

TIMER1 - 16 BITS

OSCILADOR INTERNO - 1MHz

CICLO DE MÁQUINA - 1uS

CONTA 1000 CONTAGENS

******************************/

#define PINO_SAIDA PORTB.0

int conta_tempo = 0;

interrupt [TIM1_OVF] void timer1_ovf_isr(void)

{

// INTERRUPÇÃO A CADA 1mS

// RECARGA DOS VALORES DO TIMER

TCNT1H=0xFC;

TCNT1L=0x18;

if (++conta_tempo == 500 ) //quando atingir 500 (500ms) executa

{

PINO_SAIDA = ~PINO_SAIDA; // inverte o estado do pino

conta_tempo = 0; // zera a variável pra começar a contar novamente

}

}

void main ( void )

{

while (1); //aguarda eternamente pelas interrupções

}

Nesse programa, tb não estão incluídas as etapas de inicialização da máquina.

O CodeVision configura a máquina inteira pra você!

afff!! estou ficando mal acostumado!! :lol:

Com relação à precisão dos osciladores internos, eu não sei dizer, porque não tenho instrumentos para medir, mas, como as minhas aplicações são todas de baixa velocidade e até agora eu não precisei de precisão absoluta, eles funcionam perfeitamente.

Os AVRs tb funcionam com osciladores externos.

Grande máquina!! Excelente!!

[]'s

Link para o comentário
Compartilhar em outros sites

ahhh! O programa anterior foi feito através de interrupção.

O CodeVision dispõe tb da função: delay_ms().

Nesse caso, o programa ficaria dessa forma, sem interrupção e sem inicialização:

#include <tiny2313.h> // esquecí disso no programa anterior

#include <delay.h>

#define PINO_SAIDA PORTB.0

void main ( void )

{

while ( 1 )

{

delay_ms ( 500 );

PINO_SAIDA = ~PINO_SAIDA;

}

}

[]'s

Link para o comentário
Compartilhar em outros sites

Depois dessas explicações e exemplos tanto do Maurício quanto do Zurca, só me resta parar de 'encher o saco' (mas só por enquanto, hehehe) e testar na prática.

Valeu mesmo pelas dicas.

E, maurício, me passe por MP o título do seu livro, pois já percebi que não quer fazer desse forum um canal de propaganda. É isso aí... Abraço!

Link para o comentário
Compartilhar em outros sites

É... Uma pergunta várias respostas, parece religião vários caminhos para se chegar ao céu HiHi .

Desculpe mas vou incistir no Reads51 pois para quem gosta de asm , sua sintaxe é muito

parecida com outros compiladores e não tem limite no tamanho do código .

Eu uso somente ele para o AT89C2051 que é seu alvo no momento .

Espero encontrar alguns códigos feito por você aqui no clubedohardware , claro livres para uso e abuso .Todos podemos aprender coisas novas com um simples código feito de uma forma que nunca imaginamos.

( http://py1acb.blogspot.com/ )

Py1acb ... Angelo

Link para o comentário
Compartilhar em outros sites

Ô, amigo py1acb.

Esqueci de te agradecer também. Obrigado!

O programa já está instalado e logo vou testar também. É claro que não vou deixar de usar asm pois é a única linguagem que sei no momento e ... o trabalho não pode parar.

Só um comentário... Já perceberam como a gente sempre defende aquilo que mais sabe?

Quem sabe AVR, defende AVR

Quem sabe 8051, ...

Quem sabe PIC, ...

Quem usa ASM, ...

Quem usa C, ...

Quem usa BASIC, ...

Mas sempre temos que deixar a mente aberta para aprender coisas novas.

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