atmega8 uart
Moderátor: Moderátoři
atmega8 uart
Díky
(code)
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1000000UL
int main (void)
{
DDRB = 0x13;
int j=0x00;
int k;
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j=0x01;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j = j + 0x02;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j= j + 0x04;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j= j + 0x08;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j = j + 0x10;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j= j+0x20;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j = j+ 0x40;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
PORTB = 0x02;
if(bit_is_set(PINB,3))
{j= j+0x80;}
while(1)
{
PORTB = 0x01;
k=0;
while(1){
_delay_ms(1);
k++;
if(k==j)break;
}
PORTB = 0x00;
k=0;
while(1){
_delay_ms(1);
k++;
if(k==j)break;
}
}
return 0;
}
(/code)
oscilátor jsem nastavil Hfuse d9 a lfuse ec
Vyber vždycky řádek s nejdelším startovacím časem (+64 ms).
Lfuse bude FD.
A pokud nastavíš krystal, tak musí být připojený, jinak čip s programátorem nekomunikuje.
Uart podle mých zkušeností chodí i s novým mega8, který má nastavený vnitřní oscilátor 1 MHz. Ale max. rychlost při 1 MHz je 4800 baudů (9600 pro double speed).
Nezdržuj se nějakým bitbangovým testováním.
Uart zkoušej s nějakým terminálem. Já používám Hercules
http://www.hw-group.com/products/hercules/index_en.html
1. Na terminálu nastav číslo portu a rychlost 4800 baud. Otevři port.
2. Seriový kabel připoj do PC.
3. Na druhé straně kabelu zkratuj piny 2,3.
4. Znaky které napíšeš v terminálu se vrací a zobrazují.
5. Zapoj MAX 232.
6. U MAX32 zkratuj piny které jdou na TXD, RXD procesoru (procesor zatím není připojený). Terminál musí zase opakovat znaky.
Tím je vyzkoušeno, že cesta z PC k mproc funguje.
Teď zkus program (opět vrací znaky vyslané z terminálu).
Kód: Vybrat vše
#ifndef F_CPU
#define F_CPU 1000000UL
#endif
#include <avr/io.h>
//--------------------------------------------------------------------------
void uart_init(uint32_t baud)
{
//set baud rate
UBRRH = ((F_CPU/(16*baud)-1)) >> 8;
UBRRL = (uint8_t)((F_CPU/(16*baud)-1));
//enable receiver and transmitter
UCSRB = (1<<RXEN)|(1<<TXEN);
}
//--------------------------------------------------------------------------
// receive a byte
unsigned char uart_getc( void )
{
while ( !(UCSRA & (1<<RXC)) )
;
return UDR;
}
//--------------------------------------------------------------------------
// send a byte
void uart_putc(unsigned char data )
{
while ( !( UCSRA & (1<<UDRE)) )
;
UDR = data;
}
unsigned char received_byte;
// ============================================
int main (void)
{
uart_init(4800);
while(1)
{
received_byte = uart_getc();
uart_putc(received_byte);
}
}