Codigos ASM p/ Avrs

Software e Hardware para ATMEL

Moderadores: 51, guest2003, brasilma

Codigos ASM p/ Avrs

Mensagempor Alirio926 » 02 Jan 2010 09:57

Bom dia, e um 2010 cheio de alegrias, realizações e muita paz para todos.
Bom estou começando no estudo de avrs e inicialmente estava com a MCU Java(programo em java), mas já encontrei algumas limitações, e decidir estudar asm.
1º O uso de cristal externo é pra se obter uma frequencia que com o ocilador interno não se consegue, em que influencia a frequencia em um ADC?
2º Aprender asm realmente é mas facil que aprender C?
3º A apostila que estou usando de asm não tem exemplos de codigos inteiros, apenas de trexos, e sem aplicações praticas ficou um pouco dificil entender.
4º Alguem aqui usa java pra atmega8?
5º Alguem teria uma apostila de asm ou de C com exemplos inteiros pra iniciantes?

Obrigado!!!
Alirio926
Bit
 
Mensagens: 23
Registrado em: 23 Dez 2009 21:02

Mensagempor Djalma Toledo Rodrigues » 02 Jan 2010 10:30

Os µProcessadores e µControladores possuem um Set de Instuções.

Instruction Set Summary (Parcial)
Mnemonics Operands Description Operation Flags #Clocks
ARITHMETIC AND LOGIC INSTRUCTIONS
ADD Rd, Rr Add two Registers Rd ← Rd + Rr Z,C,N,V,H 1
ADC Rd, Rr Add with Carry two Registers Rd ← Rd + Rr + C Z,C,N,V,H 1
ADIW Rdl,K Add Immediate to Word Rdh:Rdl ← Rdh:Rdl + K Z,C,N,V,S 2
SUB Rd, Rr Subtract two Registers Rd ← Rd - Rr Z,C,N,V,H 1
SUBI Rd, K Subtract Constant from Register Rd ← Rd - K Z,C,N,V,H 1
SBC Rd, Rr Subtract with Carry two Registers Rd ← Rd - Rr - C Z,C,N,V,H 1
SBCI Rd, K Subtract with Carry Constant from Reg. Rd ← Rd - K - C Z,C,N,V,H 1
SBIW Rdl,K Subtract Immediate from Word Rdh:Rdl ← Rdh:Rdl - K Z,C,N,V,S 2
AND Rd, Rr Logical AND Registers Rd ← Rd • Rr Z,N,V 1
ANDI Rd, K Logical AND Register and Constant Rd ← Rd • K Z,N,V 1
OR Rd, Rr Logical OR Registers Rd ← Rd v Rr Z,N,V 1


Programar em ASM é selecionar as Intruções que atendam o objetivo

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Re: Codigos ASM p/ Avrs

Mensagempor tcpipchip » 04 Jan 2010 09:38

Alirio926 escreveu:Bom dia, e um 2010 cheio de alegrias, realizações e muita paz para todos.
Bom estou começando no estudo de avrs e inicialmente estava com a MCU Java(programo em java), mas já encontrei algumas limitações, e decidir estudar asm.

QUE TIPO DE LIMITAÇÂO ?

1º O uso de cristal externo é pra se obter uma frequencia que com o ocilador interno não se consegue, em que influencia a frequencia em um ADC?

TEMPO DE CONVERSAO.

2º Aprender asm realmente é mas facil que aprender C?

NÃO. CAI O NIVEL DE ABSTRAÇÃO TOTALMENTE.

3º A apostila que estou usando de asm não tem exemplos de codigos inteiros, apenas de trexos, e sem aplicações praticas ficou um pouco dificil entender.

SERIA INTERESSANTE BUSCARES LIVROS...

4º Alguem aqui usa java pra atmega8?

PROVAVELMENTE O PESSOAL SO PROGRAMA J2ME...

5º Alguem teria uma apostila de asm ou de C com exemplos inteiros pra iniciantes?

VOLTO A QUESTAO DE LIVROS...

Obrigado!!!
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: Codigos ASM p/ Avrs

Mensagempor Jozias del Rios » 05 Jan 2010 06:11

Alirio926 escreveu:Bom dia, e um 2010 cheio de alegrias, realizações e muita paz para todos.
Bom estou começando no estudo de avrs e inicialmente estava com a MCU Java(programo em java), mas já encontrei algumas limitações, e decidir estudar asm.

1º O uso de cristal externo é pra se obter uma frequencia que com o ocilador interno não se consegue, em que influencia a frequencia em um ADC?


A frequencia principal do sistema não influencia o ADC, pois o ADC tem um clock máximo lá por 200KHz que é obtido por subdivisões do clock principal. Se vc dobra o clock principal, deverá redividí-lo por 2 para alimentar o ADC.
Mas de fato, só com cristal irá conseguir atingir os 16 ou 20 MHz que um ATMEGA8 ou ATMEGA88 conseguem, pois seu oscilador interno está limitado a 8MHz na melhor configuração.

Os cristais são realmente necessários também quando é necessário uma base de clock mais estável e calibrada, por vários motivos. Por exemplo, se sua UART não funciona direito sem motivo aparente, pode ser um desvio da frequencia!

Alirio926 escreveu:2º Aprender asm realmente é mas facil que aprender C?

No caso de MCU, creio que ASM seja mais fácil (isso está mais para gosto...), porém a medida que vc se sofistica, irá naturalmente para a linguagem C ou C++, até mesmo para ter portabilidade quando for para 32 bits futura e inevitavelmente...

Alirio926 escreveu:3º A apostila que estou usando de asm não tem exemplos de codigos inteiros, apenas de trexos, e sem aplicações praticas ficou um pouco dificil entender.

procure na net. tem muita coisa... avrfreaks tem uma coleção enorme de codigos-fonte e projetos.
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Rotina C p/ LCD

Mensagempor Alirio926 » 05 Jan 2010 15:09

Boa tarde.
Bem, resolvi pular pro C, e estou tendo algumas dificuldades.
Achei uma apostila da centec(nem lembro o nome rsrs) e estou pensando em comprar.
Fiquei a observer o codigo para escrita em lcd 16x2 e tentei criar um baseado no que tinha visto, segue abaixo:
Código: Selecionar todos
#include<avr/io.h>
#include<avr/delay.h>

#define PORT         PORTD
#define DDR         DDRD

#define EN_PIN         3
#define RS_PIN         5
//#define RW_PIN      #
#define CONTROL_MASK   0x28 // = 5 + 3 = 0010-1000 = 0x5
#define DATA_MASK      0xF0 // pinos 4 5 6 7 porta D

/*-------------------------------
-----Controle dos bits do LCD----
--------------------------------*/
#define EN_ENABLE      PORTC |= _BV(EN_PIN)
#define EN_DISABLE      PORTC &= ~_BV(EN_PIN)
//#define WRITER_LCD      CONTROL_PORT &= ~_BV(RW_PIN)
#define RS_DATA         PORTC |= _BV(RS_PIN)
#define RS_CODE         PORTC &= ~_BV(RS_PIN)
#define delay(a)      _delay_ms(a)

/*-------------------------------
--------------Funcoes-------------
--------------------------------*/
void Init_Ports(void);
void Init_Lcd(void);
void delay_ms(unsigned char time_ms);
void Lcd_Send(unsigned char a, unsigned char rs);

void main()
{
   int len, i;
   char strings[] = {'G','C','C','-','A','V','R'};
   Init_Ports();
   Init_Lcd();
   len = 6;
   RS_DATA;
   for(i=0;i<len;i++)
      Lcd_Send(strings[i], 1);
}
void Lcd_Send(unsigned char a,unsigned char rs)
{
   if(rs)
      rs = (1<<RS_PIN);

   PORT = (DATA_MASK &(a >> 4)) |rs;
   
   EN_ENABLE;
   delay(30);
   EN_DISABLE;
   
   PORT = (a & DATA_MASK) | rs;

   EN_ENABLE;
   delay(30);
   EN_DISABLE;

   /* PRIMEIRO TENTEI ASSIM, MAS NÃO FUNCIONOU   
   *PORTD &= ~_BV(1<<4);
   *PORTD &= ~_BV(1<<5);
   *PORTD &= ~_BV(1<<6);
   *PORTD &= ~_BV(1<<7);

   *if(a & 0x80) PORTD |= _BV(1<<4);
   *if(a & 0x40) PORTD |= _BV(1<<5);
   *if(a & 0x20) PORTD |= _BV(1<<6);
   *if(a & 0x10) PORTD |= _BV(1<<7);
      
   *EN_ENABLE;
   *delay(30);
   *EN_DISABLE;

   *PORTD &= ~_BV(1<<4);
   *PORTD &= ~_BV(1<<5);
   *PORTD &= ~_BV(1<<6);
   *PORTD &= ~_BV(1<<7);

   *if(a & 0x08) PORTD |= _BV(1<<4);
   *if(a & 0x04) PORTD |= _BV(1<<5);
   *if(a & 0x02) PORTD |= _BV(1<<6);
   *if(a & 0x01) PORTD |= _BV(1<<7);
   
   *EN_ENABLE;
   *delay(30);
   *EN_DISABLE;

   *PORTD |= _BV(1<<4);
   *PORTD |= _BV(1<<5);
   *PORTD |= _BV(1<<6);
   *PORTD |= _BV(1<<7);
   */
}
void Init_Ports(void){
   DDRD = DATA_MASK; //porta de dados config p/ saida.
   DDRC = CONTROL_MASK;//Somente os pinos usados são afetados
   PORTC &= ~(_BV(EN_PIN)|_BV(RS_PIN));//todos com valor 0.
}
void Init_Lcd(void)
{
   char init[10];
   int i;
   init[0] = 0x33;
   init[1] = 0x32;
   init[2] = 0x28;
   init[3] = 0x08;
   init[4] = 0x0c;
   init[5] = 0x01;
   init[6] = 0x06;
   for(i=0;i<5;i++)
      Lcd_Send(init[i], 0);
   
}

Mas esse codigo imprime no LCD &&&&&"&, como se a codificação de caracteres fosse diferente.
Fiz um ADC em java e enviei os dados por UART.
Mas mesmo modificando a V na entrada Pino 23, o dado recebido pela serial n muda sempre igual e errada.Segue o codigo só pra informação.
Código: Selecionar todos
import mcujavasource.mcu.*;
import mcujavasource.mcu.io.UartOutputStream;

/**
 */
public class Main extends Microcontroller
{
    private static final int REFERENCE_VOLTAGE = 5000;
    private static final String POWER_ON = "Power on.";
    private static final String MESSAGE_END = " V";
    private Adc adc;
    private UartOutputStream uartOutput;

  @Override
  public void init()
  { //register initialization on startup
    getHardware().setAllPortsDirection(Pin.IN);
    getHardware().setAllPortsPullUp(true);

    //Uart
    Uart uart = getHardware().getDefaultUart();
    uart.init(25, true, 8, Uart.Parity.NONE, false);
    uartOutput = uart.getOutputStream();

    //ADC
    adc = getHardware().getAdc();
    adc.setInput(0);
    adc.setPrescaling(8);
    adc.setVoltageReference(Adc.VoltageReference.AVCC);
    VoltageEvent voltageEvent = new VoltageEvent();
    adc.addAdcListener(voltageEvent);
    adc.setConversionCompletedFired(true);
    adc.setEnabled(true);

    // Temporizador
    Timer timer = getHardware().getDefaultTimer(16,1);
    timer.setMode(TimerMode.CTC);
    timer.setPrescaling(1024);
    timer.setEnabled(true);
    TimerCompare compare = timer.getOutputCompare("A");

    // divide 976 para 1Mhz, 7812 para 8Mhz
    compare.setValue(976);

    TimerHandler timerHandler = new TimerHandler();
    compare.addTimerCompareListener(timerHandler);
    compare.setCompareMatchFired(true);
  }
 
  @Override
  public void start()
  { //main program
    getHardware().setInterruptsEnabled(true);
    uartOutput.write(POWER_ON);
  }

  private void sendDigit(int a)
  {
    int b = a + 0x30;
    uartOutput.write(b);
  }
  private class VoltageEvent implements AdcListener{

        @Override
        public void conversionCompleted() {
           int v = adc.getValue() * REFERENCE_VOLTAGE / 1024;
           int t = adc.getValue() + 0x30;
          uartOutput.write(t);
           sendDigit(v / 1000);
          uartOutput.write('.');
          sendDigit((v%1000) / 100);
          sendDigit((v%100) / 10);
          sendDigit(v%10);
          uartOutput.write(MESSAGE_END);
        }
  }
  private class TimerHandler implements TimerCompareListener{

        @Override
        public void compareMatched() {
            adc.setBusy(true);
        }
  }
}

Java seria muito mas facil pra mim, mas tive um problema em converter int pra String ja que a MCU java só aceita final String, não consegui converter int pra String, e resolvi aprender outra linguagem.
Claro que sei converter int e String etc... mas a mcu java é bastante limitada. E não encontrei quem o saiba fazer.
Agora que você citou a frequencia vs serial, pode até ser que seja esse o problema do codigo.
Por hora ficaria satisteito resolvendo o codigo C.

Obrigado.
Alirio926
Bit
 
Mensagens: 23
Registrado em: 23 Dez 2009 21:02

Mensagempor Djalma Toledo Rodrigues » 05 Jan 2010 17:06

A Editar

DJ
Editado pela última vez por Djalma Toledo Rodrigues em 07 Jan 2010 06:47, em um total de 1 vez.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Alirio926 » 07 Jan 2010 02:44

"Se é Caracter como pode ser Inteiro ? " não entendi onde vc viu isso ><
Qual livro é mas indicado pra aprender AVR em linguagem C na integra?
http://www.cerne-tec.com.br/Apostila_C_AVRwinavr_04.pdf essa é boa? vi o livro Microcontroladores AVR - Teoria e Aplicações praticas mas esse é baseado em ASM, seria a melhor escolha? ja procurei na net e não encontro muitos livros sobre AVR( parece que PIC domina >< ).

Obrigado pela atenção.
Alirio926
Bit
 
Mensagens: 23
Registrado em: 23 Dez 2009 21:02

Mensagempor Djalma Toledo Rodrigues » 07 Jan 2010 06:52

Ops! Desculpe nada a ver com inteiro.

Já foi removido

---------------------------
Sugiro ASM, depois que domina-lo bem você passa para o C

O PIC é mais "Popular" mas, os µC da Atmel são muito superiores.

------
DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Sergio38br » 07 Jan 2010 09:29

Bom dia, estes sites possuem alguns tutoriais sobre avr e C (GCC, WINAVR)

http://winavr.scienceprog.com/

http://www.avrtutor.com/tutorial/thermo/welcome.php

[ ] 's
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP


Voltar para AVR

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes

x