Ir ao conteúdo

Posts recomendados

Postado

Olá!

Estou reiniciando o estudo do micro da Atmel, o AVR e para entender o hardware preciso entender a linguagem Assembler. Tenho algumas dúvidas, que agradeceria o auxílio de vocês.

O exercício é para fazer um trecho de programa, que é uma soma de 8 bits. Recebe uma parcela pela porta C e outra parcela pela porta D. O resultado envia pela porta B.

Eu fiz o seguinte:
 

.def Parcela1 = r1
.def Parcela2 = r2
.def Soma = r3

in Parcela1, Portc
in Parcela2, Portd
mov Soma, Parcela1
add Soma, Parcela2
out Portb

Dúvidas:

1 - Como fazer a portac ser entrada? Qual é a instrução?

2 - Como fazer a portab ser saída? Qual é a instrução?

3 - Um micro com 32kB de flash poderia aceitar cerca de 16k de instruções, já que as instruções possuem 16 bits?

4 - Qual instrução que copia o valor da variável da RAM para um registro rd (0<= d <= 31)?

5 - E a instrução inversa do item 4?

6 - Nos itens 4 e 5 é necessário usar um dos três registros duplos ou existe uma instrução direta, sem indexar os três registros?

7 - Como escrever na porta B, se os bits 6 e 7 usam o cristal? Teria que usar o oscilador interno?

8 - Como ler da porta C, se não encontro o bit 7 no uC?

9 - O pino PC6 pode ser usado como entrada, além do reset?

 

Agradeço pelas dicas.

MOR_AL

  • Membro VIP
Postado

Moris, você pode não acreditar.. mas se eu der alt-tab agora, caio num projeto com avr que estou a a concluir!! Sério! Só que é 100% c mas há conexões com suas inquietações. Então vejamos...Vou considerar que é um atmega8 ok?

 

1 - Como fazer a portac ser entrada? Qual é a instrução?

Não é instrução. Basta escrever 0b00000000 no registro DDRC. Vide datasheet

2 - Como fazer a portab ser saída? Qual é a instrução?

A mesma coisa. Escreva 0b11111111 ou 0xff ou 255 no registro DDRB

Perceba que é o contrário dos pic´s

3 - Um micro com 32kB de flash poderia aceitar cerca de 16k de instruções, já que as instruções possuem 16 bits?

É isso. Geralmente um bom compilador c otimiza o uso fazendo caber 4 letras em 16 bits já que o asc-ii vai até 127 pex quando você cria uma tabela ou frase. A qualquer momento vejo se o meu faz isso.

4 - Qual instrução que copia o valor da variável da RAM para um registro rd (0<= d <= 31)?

deve ser um mov ou out qualquer.@aphawkou d.s. confirma

5 - E a instrução inversa do item 4?

@aphawkou d.s.

6 - Nos itens 4 e 5 é necessário usar um dos três registros duplos ou existe uma instrução direta, sem indexar os três registros?

@aphawkou d.s.

7 - Como escrever na porta B, se os bits 6 e 7 usam o cristal? Teria que usar o oscilador interno?

Em c PORTB=valor. SIm, deve configurar os fuses como osc int

8 - Como ler da porta C, se não encontro o bit 7 no uC?

Ele não existe. No seu sw deve ser desconsiderado o bit7

9 - O pino PC6 pode ser usado como entrada, além do reset?

Aqui cabem informações superimportantississíssimas. Se for encapsulamento DIP E você está gravando com um gravador com algoritimo em PARALELO, sim você pode usar como pino IO. Mas se for SMD e você obviamente deve gravar com aquele algoritimo SERIAL, NUNCA, MAS NUNCA MESMO use como IO. Apenas como reset ok? (você define isso nos fuses ou no progamador) É que depois de gravado este pino não aceita mais VPP de 12V para gravação. A explicação é simples. Ele se desconecta do RESET que aceita 12V e se conecta ao buffer de I/O que não aceita +. De fato (é sério!) fiz isso e perdi um ci smd o que não foi problema pois tenho acesso a centenas mas deu um certo trampo pra descobrir porque parou, tempo perdido de pesquisa na net, tempo  perdido para troca

 

Agora um off topic 1/2 on... Penso que não há necessidade de se passar pelo asm para se conectar às entranhas do mc. Basta saber a função de cada registro (dos que va usar em determinado projeto) e acessá-los/modificá-los com sua linguagem não assembly. Este argumento de "domínio total, código menor, não confia no compilador " e etc é paradigma que está quase à margem da racionalidade (ou melhor, razões técnicas), e passou da hora de ser quebrado. Falando por mim 1 pouco, já fiz projetos com mc´s LPC ARM, 8051, AMD, pic ATMEGA, ATTINY, (esqueci outros) 100% em c com sucesso absoluto sem contato com asm e que vendeu e está a vender até hoje.

 

Mas, claro, não vá por mim não. Siga seu destino com progressos e sucessos! E vá contando comigo... 1...2...3...4.

 

Postado

Ok, Isa!

4...3...2...1...0

Não é instrução. Basta escrever 0b00000000 no registro DDRC. Vide datasheet

É esta a minha dúvida. Consultei o datasheet, mas não consegui identificar a instrução. Ontem à noite baixei um arquivo com detalhes do funcionamento das instruções. Hoje eu descubro a bendita.

Perceba que é o contrário dos pic´s 

É! percebi!

Não vou usar o pino de reset para outra finalidade :(

Agora um off topic 1/2 on... Penso que não há necessidade de se passar pelo asm para se conectar às entranhas do mc. ... 100% em c com sucesso absoluto sem contato com asm e que vendeu e está a vender até hoje.

Concordo com você!

A quantidade de periféricos internos, compartilhados no mesmo pino, aumentou muito, juntamente com a memória flash, a tal ponto, que fica muito difícil controlar todos os detalhes necessários para seu correto uso.

Daí a migração do Assembler para uma linguagem de mais alto nível.

Vou procurar seguir sua dica, mas ainda lendo a apostila com a linguagem Assembler. Sei lá! Acho que são reminiscências do passado, querer saber nos mínimos detalhes.

 

Não estou acostumado com os datasheets Atmel da AVR. São muito mais complicados, que os da Microchip.

 

Vamos aguardar as dicas do Aphawk.

 

MOR_AL

 

  • Membro VIP
Postado
58 minutos atrás, MOR disse:

Ok, Isa!

4...3...2...1...0

Não é instrução. Basta escrever 0b00000000 no registro DDRC. Vide datasheet

É esta a minha dúvida. Consultei o datasheet, mas não consegui identificar a instrução.

 

ok môr... é mamão com açúcar...

 

Não achei rapidamente algo pronto na net por isso usei minha cota de upload do forum mesmo.  Veja a captura de tela que também estava no meu alt-tab

Os manuais dos avr´s geralmente tem um exemplo em assembly e em c. Veja que bacana. Penso que isso deve saciar sua sede inicial... e trocadilhamente portas devem se abrir pra você amigo. kk56d83f7d5927c_readetranferncia02.thumb.j

 

Se aqueles (1<<PB7) e etc te parecer confuso, pergunte...

Dica: traduza ldi r16,(1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0) por

ldi r16,0b11000011;'//não sei como é a representação binária pro seu assembler

Percebeste a posição dos bits em 1?

Aparentemente no assembly não se pode escrever no port diretamente e precisamos passar 1º num registro pra isso. Em c, "pode"

 

Puts, mas cadê o Paulão hein?! kk

Postado

kkkkk pera pessoal estou no interior de São Paulo vendo um pedido de meu cliente, de noite postarei as respostas.

 

É muito ruim digitar num Iphone 5 pequeno , quando se tem dedos enormes ....

 

Paulo

Postado
4 horas atrás, Isadora Ferraz disse:

 

ok môr... é mamão com açúcar...

 

Não achei rapidamente algo pronto na net por isso usei minha cota de upload do forum mesmo.  Veja a captura de tela que também estava no meu alt-tab

Os manuais dos avr´s geralmente tem um exemplo em assembly e em c. Veja que bacana. Penso que isso deve saciar sua sede inicial... e trocadilhamente portas devem se abrir pra você amigo. kk56d83f7d5927c_readetranferncia02.thumb.j

 

Se aqueles (1<<PB7) e etc te parecer confuso, pergunte...

Dica: traduza ldi r16,(1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0) por

ldi r16,0b11000011;'//não sei como é a representação binária pro seu assembler

Ainda estou confuso com o símbolo "<<", mas entendi que seria equivalente a colocar "1" nos bits correspondentes. Mas não vi a garantia dos outros bits serem nulos.

Percebeste a posição dos bits em 1? Sim.

Aparentemente no assembly não se pode escrever no port diretamente e precisamos passar 1º num registro pra isso. Em c, "pode"

Acho... não! Tenho certeza que usam isso para que os bits sejam transferidos corretamente para a saída. O procedimento DEVE ser semelhante aos uC da Microchip, que para escrever, eles leem a saída e depois escrevem nela. Qualquer capacitância parasita impede que a saída seja alterada tão rápido quanto o intervalo entre duas instruções OUT PORTx, Reg seguidas. Se ocorrerem as duas instruções seguidas, a segunda ainda lerá a entrada, sem que a tensão tenha sido alterada pela primeira instrução, produzindo um erro.

 

A linguagem C DEVE levar isso em consideração. Por curiosidade, quando você for usar o C, inclua as duas instruções seguidas e verifique como ficou no Assembler.

... Mas observe a instrução NOP que colocaram na linguagem C. Pode ser para prevenir este fato.

Tenho que aprender também as palavras reservadas. PINB deve ser a porta B e não o pino.

Citação

Puts, mas cadê o Paulão hein?! kk

Tá chegando...

MOR_AL

 

Agora que observei, que ele escreve na porta B, ANTES de determinar os pinos como saída. Vai ver que por isso é que incluíram o NOP.

Postado
19 horas atrás, MOR disse:

Olá!

Estou reiniciando o estudo do micro da Atmel, o AVR e para entender o hardware preciso entender a linguagem Assembler. Tenho algumas dúvidas, que agradeceria o auxílio de vocês.

O exercício é para fazer um trecho de programa, que é uma soma de 8 bits. Recebe uma parcela pela porta C e outra parcela pela porta D. O resultado envia pela porta B.

Eu fiz o seguinte:
 


.def Parcela1 = r1
.def Parcela2 = r2
.def Soma = r3

in Parcela1, Portc
in Parcela2, Portd
mov Soma, Parcela1
add Soma, Parcela2
out Portb

Dúvidas:

1 - Como fazer a portac ser entrada? Qual é a instrução?

2 - Como fazer a portab ser saída? Qual é a instrução?

3 - Um micro com 32kB de flash poderia aceitar cerca de 16k de instruções, já que as instruções possuem 16 bits?

4 - Qual instrução que copia o valor da variável da RAM para um registro rd (0<= d <= 31)?

5 - E a instrução inversa do item 4?

6 - Nos itens 4 e 5 é necessário usar um dos três registros duplos ou existe uma instrução direta, sem indexar os três registros?

7 - Como escrever na porta B, se os bits 6 e 7 usam o cristal? Teria que usar o oscilador interno?

8 - Como ler da porta C, se não encontro o bit 7 no uC?

9 - O pino PC6 pode ser usado como entrada, além do reset?

 

Agradeço pelas dicas.

MOR_AL

 

Eu uso sempre o Bascom para fazer isso, mas se você quiser, veja abaixo como é é traduzida cada instrução do Bascom para o Assembly :

 

25iro29.jpg

 

Repara que logo abaixo onde defino as portas, uso o ASM direto para fazer a soma sair no Port B.

Detalhe : essa soma foi sem o carry...

 

1 - Escrevendo 00h na porta, mas antes temos de carregar para um registro, e depois enviamos para a porta, veja exemplo acima.

 

2 - Escrevendo FFh na porta, mesmo processo da questão acima.

 

3 - Sim, isso mesmo.

 

4 -  LDS rd, K

 

5 -  STS K, rr

 

6 - Não, não precisa, mas existem instruções muito poderosas que trabalham com os famosos 3 pares de registradores ( X, Y e Z ), como index, inclusive já incrementando ou decrementando o par de registros, ganha-se um baita tempo com isso.

 

7 - Ué, não se preocupe com isso. Quando você definiu o oscilador a cristal nos FUSES, o bit 7 e 6 simplesmente ficam desabilitados..... ou seja, não mudam nem quando você le, e nem quando você grava.

 

8 - voce le normalmente, mas o bit 7 sempre vai retornar 1 , lembre de seu programa ignorar ele !

 

9 - Poder, pode. Mas é o que alguém já falou aqui..., adeus, programação via serial !   Se fizer isso e precisar regravar, só tem uma maneira : usar um hardware bem específico, que é um tipo de gravador paralelo de alta tensão, que consegue resetar todos os fuses ao valor original do fabricante, ok ?

 

Paulo

 

 

  • Membro VIP
Postado
1 hora atrás, MOR disse:

Tenho que aprender também as palavras reservadas. PINB deve ser a porta B e não o pino.

 

 

SIm você pode chamar de palavra reservada se quiser mas de fato são termos e nomes dos registros predefinidos num #include qualquer.  P.ex. em algum lugar a palavra chave PB7 foi definida como .. 7. Só isso. Seria uma constante. Traduza portanto 1<<PB7 para 1<<7 e traduza de novo  para 1 deslocado 7 vezes pra esquerda e continue traduzindo para 0x80. E o "|" é operação OR. Junte as peças agora.

Sobre PINB tá mais pra pino faltando a definição. Não seria PINB0 p.ex.? De fato, depende do compilador. No IAR C p.ex. é PORTB_Bit0 ou PINB_Bit0

 

ok depois tento PORTx=0x55 e PORTx=0xaa em alguns mc pra ver

Postado

Paulo!

Valeu pela respostas. Elucidou todas elas.

Isa!

Valeu também.

 

Vou continuar daqui, caso eu tenha mais dúvidas conto com vocês.

[]'s

MOR_AL

Postado

@Isadora Ferraz ,

 

Mas que coisa mais maluca esse C ..... nunca vou entender essa simbologia doida...

 

 

@MOR ,

 

Disponha meu amigo, tem bastante coisa de Asm no tópico destacado do Bascom, pode tirar algumas dúvidas com os programinhas que estão lá.

 

Paulo

 

Postado
48 minutos atrás, aphawk disse:

@Isadora Ferraz ,

 

Mas que coisa mais maluca esse C ..... nunca vou entender essa simbologia doida...

Maluca mesmo, né?

 

@MOR ,

 

Disponha meu amigo, tem bastante coisa de Asm no tópico destacado do Bascom, pode tirar algumas dúvidas com os programinhas que estão lá.

Grato, Paulo.

Paulo

 

Ok!

Vou pesquisar

MOR_AL

Visitante
Este tópico está impedido de receber 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!