Codigos ASM p/ Avrs

Enviado:
02 Jan 2010 09:57
por Alirio926
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!!!

Enviado:
02 Jan 2010 10:30
por Djalma Toledo Rodrigues
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
Re: Codigos ASM p/ Avrs

Enviado:
05 Jan 2010 06:11
por Jozias del Rios
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.
Rotina C p/ LCD

Enviado:
05 Jan 2010 15:09
por Alirio926
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.

Enviado:
05 Jan 2010 17:06
por Djalma Toledo Rodrigues
A Editar
DJ

Enviado:
07 Jan 2010 02:44
por Alirio926
"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.

Enviado:
07 Jan 2010 06:52
por Djalma Toledo Rodrigues
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

Enviado:
07 Jan 2010 09:29
por Sergio38br
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