پاسخ : راه اندازی ATmega8A با کریستال خارجی برای UART
نرم افزار khazama ,progisp
نوشته اصلی توسط Reza Sede



عکس بده جنازه تحویل بگیر =))
عکس بده جنازه تحویل بگیر =))

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include "N11/N1100_LCD.h"
#define F_CPU 8000000ul
unsigned char buff;
int main(void)
{
UCSRB=(1<<RXEN)|(1<<RXCIE);
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UBRRL=51;
N11_initialize();
sei();
while(1)
{
_delay_ms(1000);
N11_CLS();
N11_Puts(buff);
}
}
ISR(USART_RXC_vect)
{
sprintf(buff,"%c",UDR);
}
)#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define BaudRate(x) {UBRRH=0; UBRRL = (F_CPU/(16UL*(x)))-1;}
char buff[10];
volatile unsigned char index=0;
ISR(USART_RXC_vect)
{
char st,dt;
st=UCSRA;
dt=UDR;
if(!(st & (_BV(FE) | _BV(PE) | _BV(DOR)))) // Check data
{
buff[index++] = dt;
}
}
void _putchar(char c)
{
while ((UCSRA & _BV(UDRE))==0);
UDR=c;
}
void _puts(char *str)
{
while(*str) _putchar(*str++);
}
int main(void)
{
UCSRA=0;
UCSRB=_BV(RXEN) |_BV(RXCIE) | _BV(TXEN); // TX and RX = enable and RX ISR = enable
UCSRC=_BV(URSEL)|_BV(UCSZ1) | _BV(UCSZ0); // 8bit Mode
BaudRate(9600UL);
index=0;
sei();
_puts("Write 10 Char\r\n ");
while(1)
{
if(index == sizeof(buff))
{
cli();
_puts((char*)&buff);
index=0;
sei();
}
}
}
)#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define BaudRate(x) {UBRRH=0; UBRRL = (F_CPU/(16UL*(x)))-1;}
char buff[10];
volatile unsigned char index=0;
ISR(USART_RXC_vect)
{
char st,dt;
st=UCSRA;
dt=UDR;
if(!(st & (_BV(FE) | _BV(PE) | _BV(DOR)))) // Check data
{
buff[index++] = dt;
}
}
void _putchar(char c)
{
while ((UCSRA & _BV(UDRE))==0);
UDR=c;
}
void _puts(char *str)
{
while(*str) _putchar(*str++);
}
int main(void)
{
UCSRA=0;
UCSRB=_BV(RXEN) |_BV(RXCIE) | _BV(TXEN); // TX and RX = enable and RX ISR = enable
UCSRC=_BV(URSEL)|_BV(UCSZ1) | _BV(UCSZ0); // 8bit Mode
BaudRate(9600UL);
index=0;
sei();
_puts("Write 10 Char\r\n ");
while(1)
{
if(index == sizeof(buff))
{
cli();
_puts((char*)&buff);
index=0;
sei();
}
}
}

_puts((char*)&buff);

_puts((char*)&buff);

بله مشکلی ندارهتابع puts_ همونطور که مشخصه ورودیش اشاره گر (pointer) هست عبارت *char نوع اشاره گر را مشخص میکنه و buff& آدرس بافر برای اشاره گر هست.برای دریافت بهتره از وقفه استفاده کنی (اصولی تر هست) ولی برای ارسال نیازی به وقفه نیست
while(*str) UART_Putchar(*str++);
while(*str) UART_Putchar(*str++);


ISR(USARTUDRE_vect)
{
if (!(_UART_BUFFER[_UART_COUNTER]))
{
_UART_COUNTER=0;
UCSRB&=0xdf;
return;
}
UDR=_UART_BUFFER[_UART_COUNTER++];
}
دیدگاه