isis'te herhangi bir sorun yok ama devre üzernde herhangi bir çıkış alamıyorum
#include <avr/io.h>
#include <inttypes.h>
#include <stdio.h>
#include <util/delay.h>
#define gsm_power PORTB.2
char dizi[20]=" ";
unsigned char i;
//This function is used to initialize the USART
//at a given UBRR value
void USARTInit(uint16_t ubrr_value)
{
//Set Baud rate
UBRRL = ubrr_value;
UBRRH = (ubrr_value>>8);
/*Set Frame Format
>> Asynchronous mode
>> No Parity
>> 1 StopBit
>> char size 8
*/
UCSRC=(1<<URSEL)|(3<<UCSZ0);
//Enable The receiver and transmitter
UCSRB=(1<<RXEN)|(1<<TXEN);
}
//This function is used to read the available data
//from USART. This function will wait untill data is
//available.
char USARTReadChar()
{
//Wait untill a data is available
while(!(UCSRA & (1<<RXC)))
{
//Do nothing
}
//Now USART has got data from host
//and is available is buffer
return UDR;
}
void transmit( unsigned char data )
{
//buffer bosalana kadar bekle
while ( !( UCSRA & (1<<UDRE)))
;
/* Copy 9th bit to TXB8 */
UCSRB &= ~(1<<TXB8);
if ( data & 0x0100 )
UCSRB |= (1<<TXB8);
UDR = data;
}
void send_string(char *str)
{
while(*str!=0)
{
transmit(*str++);
}
}
int main()
{
PORTA =0x00;
PORTB =0x00;
PORTC =0x00;
PORTD =0x00;
DDRB=0xFD;
PORTB=0x02;
USARTInit(51); //UBRR = 51
while(1)
{
/*
//gsm modülü acma
for(i=0;i<20;i++)
_delay_ms(200);
PORTB|=_BV(2);
for(i=0;i<20;i++)
_delay_ms(200);
PORTB&=~_BV(2);
for(i=0;i<30;i++)
_delay_ms(200);
*/
_delay_ms(200);
za:
_delay_ms(300);
sprintf(dizi,"Test Mesaji");
send_string(dizi);
sprintf(dizi,"26");
send_string(dizi);
goto za;
for(;;);
}
}
dahili 8 mhz osc kullanıyorum
veriler hatası gitse bil razıyım ama skop ile bakıyorum usart pinlerinden hiç çıkış yok
Sorunun fuse ayarlarından olup olmadığını anlamak için gönderme yaptığınız ana döngüde çıkış olarak ayarladığınız bir pinin durumunu değiştirip dışarıdan gözlemleyebilirsiniz.
ilgili pinde hiç hareket yoksa fuse ayarlarınızı kontrol edin. Pin normal toggle yapıyorsa usart ayarlarını gözden geçirmek gerekebilir.
hocam zaten pinde toogle yaptım herhangi bir sorun yok ama
usart'ın tx pininden çıkış alamıyorum
sizde denediğiniz bir kod var mı
sadece hex'de işimi görür
UCSRC=(1<<URSEL)|(3<<UCSZ0);
burada 3<<UCSZ0 işleminde hata var.
char size 8 bit yapmak için UCSZ'ye 3 (binary 011) yazman gerekli bu doğru ama bu şekilde yazamazsın.
doğrusu:
UCSRC=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
bunu bir dene bakalım olmazsa örnek bir kod yollayayım.
hocam o şekilde bir sorun olacağını sanmıyorum çünkü c kitabındada aynı şekilde bilgi yazıryor ve nitekim aynı kodla çalıştıabildim devreyi
sorun data pinleirni farklı yerden kontrol etmemöiş :-X
ancak pc tarafından gönderdigim verileri inceliyorum karma karışık birşeyler görünüyor, fakat isiste herşey normal
aşağıdaki kodları geçen yıl kullandım çalışıyordu
faydası olur belki bir deneyin
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "UART_routines.h"
//**************************************************
//Function initialize UART0
//desired baud rate: 19200
//actual: baud rate:19231 (0.2%)
//char size: 8 bit
//parity: Disabled
//**************************************************
void USART_init(void)
{
//seri haberleşme değerlerini burayı açarak girebilirsin
/* UBRRH = (unsigned char)(ubrr>>8); // Set baud rate
UBRRL = (unsigned char)ubrr;
UCSRB = (1<<RXEN)|(1<<TXEN); // Enable receiver and transmitter
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); // Set frame format: 8data, 2stop bit
*/
/*UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x33; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x98;*/
}
//**************************************************
//Function to receive a single byte
//*************************************************
unsigned char receiveByte( void )
{
//unsigned char USART_Receive( void )
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) ); // Wait for incomming data
/* Get and return received data from buffer */
return UDR;
}
//***************************************************
//Function to transmit a single byte
//***************************************************
void transmitByte( unsigned char data )
{
while ( !( UCSRA & (1<<UDRE)) ); /* Wait for empty transmit buffer */
UDR = data; /* Put data into buffer, sends the data */
}
//***************************************************
//Function to transmit a string in Flash
//***************************************************
void transmitString_F(char* string)
{
while (pgm_read_byte(&(*string)))
transmitByte(pgm_read_byte(&(*string++)));
}
//***************************************************
//Function to transmit a string in RAM
//***************************************************
void transmitString(char* string)
{
while (*string)
transmitByte(*string++);
}
// **************************************************************
// *** UART_ROUTINES HEADER FILE ********
// **************************************************************
#define TX_NEWLINE {transmitByte(0x0d); transmitByte(0x0a);}
void USART_init(void);
unsigned char receiveByte(void);
void transmitByte(unsigned char);
void transmitString_F(char*);
void transmitString(char*);
kaç mhz osc için hocam register ayarları
hiç bir değişiklik yapmadan o donanımlarla kurmak istiyorum devreyi
4 mhz de kurup denemişim sadece gönderme kısmı ile çalıştım tek taraflı olarak