Documente Academic
Documente Profesional
Documente Cultură
O mica descrie:
Un microcontroler de mare performanta cu consum redus pe 8 biti;
Arhitectura RISC avansata ;
128K Bytes de memorie flash autoprogramabila ;
4K Bytes memorie EEPROM;
4K Bytes memorie interna SRAM;
Pastrarea datelor pe o perioada de 20 de ani la 85°C / 100 ani la 25°C;
Optional sectiune de cod bootabil cu blocarea independenta a bitilor;
Pana la 64K Bytes memorie externa optionala;
Blocarea programului pentru securitatea softului;
Interfata SPI pentru programare;
Interfata JTAG ;
2 timere pe 8 biti cu moduri separate prescalare si comparare;
2 timere extinse pe 16 biti;
Numarator in timp real cu oscilator extern;
6 canale PWN cu programare de la 2 la 16 biti;
8 canale ADC pe 10 biti;
2 seriale programabile USART ;
Interfata seriala SPI Master/Slave;
Ceas de garda programabil cu oscilatorul intern;
Calibrare interna RC;
Sursa de intreruperi externa si interna;
Tensiune recomandata : 4.5 - 5.5V;
Oscilator intre 0 – 16MHz;
Configuratia pinilor:
Descrierea ADC-ului:
Generatorul de ceas.
Ceasul logic genereaza baza ceasului pentru transmitere si primirea datelor.
USART suporta, pentru ceas, 4 moduri de operare: Normal Asincron, Asincron cu viteza
dubla, Master Sincron si Slave Sincron. Bitul UMSEL din UCSRC face selectia intre
modul de operare asincron si sincron. Ceasul cu viteza dubla este controlat de U2X ce se
gaseste in registrul UCSRA. Cand se foloseste modul sincron , adica UMSEL=1, pinul
XCK controleza daca generatorul de ceas este intern (master mode) sau extern (slave
mode). Pinul XCK este activ doar daca se foloseste modul sincron.
Initializarea USART:
USART trebuie initializat inainte de inceperea comunicarii. Procesul de
initializare consta in mod normal in stabilirea ratei de transfer, stabilind formatul cadru si
activand transmiterea sau receptionarea datelor, in functie de utilizare. Pentru
intreruperea produsa de USART, flagul de intreruperile globale trebuie sa fie gol
(intreruperile globale fiind dezactivate), cand se face initializarea.
Urmatoarul cod C este pentru initializarea USART-ului. Exemplul descrie modul
de operare asincron, folosind un proces de votare (fara flag de intreruperi) si un cadru fix.
Banda de transfer este data ca si parametru de functionare.
Oscilatorul de ceas
Pentru controlerul AVR cu oscilator de ceas (pini TOSC1 si TOSC2), cristalul se
conecteaza intre cei doi pini. Nu este necesar nici un condensator extern. Oscilatorul este
optimizat pentru a folosi o frecventa de 32.768 kHz. Aplicarea unui ceas extern pinului
TOSC1 nu este recomandata
int i = ReadADC(0);
printf("\r\n%d", i);
Codul programului:
#ifndef _SERIALA_H
#pragma device_specific_function putchar
void putchar( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSR1A & (1<<UDRE1)) )
;
/* Put data into buffer, sends the data */
UDR1 = data;
}
#endif
#include <iom128v.h>
#include <macros.h>
#include "Seriala.h"
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0xFF;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}
//ADC initialize
// Conversion time: 75uS
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
ADMUX = 0x00; //select adc input 0
ACSR = 0x80;
ADCSRA = 0xC6;
}
//UART1 initialize
// desired baud rate:115200
// actual baud rate:115198 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart1_init(void)
{
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00;
UCSR1C = 0x06;
UBRR1L = 0x05; //set baud rate lo
UBRR1H = 0x00; //set baud rate hi
UCSR1B = 0x18;
}
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void putchar(unsigned char);
unsigned char getchar();
int ReadADC( unsigned char);
//
void main(void)
{
unsigned char buff = 0x00;
unsigned char buffi = 0x00;
unsigned int adc0 = 0;
init_devices();
//insert your functional code here...
PORTC = 0xFF;
while(1)
{
buff = getchar();
buffi = buff-0x30;
if(buffi > 0x09 || buffi <0x00)
PORTC = 0xFF;
else
PORTC = buffi;
putchar(buff);
//printf("\n\rtest");
adc0 = ReadADC(0); //citeste de pe canal 0
printf("\n\r%d",adc0," ");
}
}
return ADC;
}