• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Programowanie mikrokontrolera AtMega8

Object Storage Arubacloud
+1 głos
429 wizyt
pytanie zadane 13 marca 2016 w C i C++ przez Mavimix Dyskutant (8,390 p.)

Witam,

Mam nadajnik i odbiornik - FS100A. Na wyświetlaczu albo się nic nie wyświetla, albo pokazują się "krzaczki".

Program nadajnika:

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

// define some macros
#define BAUD 9600                                   // define baud
#define BAUDRATE ((F_CPU)/(BAUD*16UL)-1)            // set baud rate value for UBRR

// function to initialize UART
void uart_init (void)
{
    UBRRH = (BAUDRATE>>8);                      // shift the register right by 8 bits
    UBRRL = BAUDRATE;                           // set baud rate
    UCSRB|= (1<<TXEN)|(1<<RXEN);                // enable receiver and transmitter
    UCSRC|= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);   // 8bit data format
}

// function to send data
/*void uart_transmit (unsigned char data)
{
    while (!( UCSRA & (1<<UDRE)));                // wait while register is free
    UDR = data;                                   // load data in the register
}*/

void uart_Transmit( unsigned char data )
{
                                 /* Wait for empty transmit buffer */
   while ( !( UCSRA & (1<<UDRE)));
                                 /* Copy 9th bit to TXB8 */
      UCSRB &= ~(1<<TXB8);
      if ( data & 0x0100 )
         UCSRB |= (1<<TXB8);
                                 /* Put data into buffer, sends the data */
   UDR= data;
}

// function to receive data
unsigned char uart_recieve (void)
{
    while(!(UCSRA) & (1<<RXC));                   // wait while data is being received
    return UDR;                                   // return 8-bit data
}

int main(void)
{
	uart_init();

	sei();

	unsigned char wyslij = 'A';

	while(1)
	{
		uart_Transmit(wyslij);
	}

}

Program odbiornika:

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

// define some macros
#define BAUD 9600                                   // define baud
#define BAUDRATE ((F_CPU)/(BAUD*16UL)-1)            // set baud rate value for UBRR

// function to initialize UART
void uart_init (void)
{
    UBRRH = (BAUDRATE>>8);                      // shift the register right by 8 bits
    UBRRL = BAUDRATE;                           // set baud rate
    UCSRB|= (1<<TXEN)|(1<<RXEN);                // enable receiver and transmitter
    UCSRC|= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);   // 8bit data format
}

// function to send data
void uart_transmit (unsigned char data)
{
    while (!( UCSRA & (1<<UDRE)));                // wait while register is free
    UDR = data;                                   // load data in the register
}

// function to receive data
unsigned char uart_recieve (void)
{
    while(!(UCSRA) & (1<<RXC));                   // wait while data is being received
    return UDR;                                   // return 8-bit data
}

int main(void)
{
	//_delay_ms(1000);

	    	LCD_Ini();

	    	sei();

	    	uart_init();

	    	while(1)
	    	{

				LCD_XY(0,0);

				char i = uart_recieve();

				LCD_ZapiszText(i);

				_delay_ms(1000);
				LCD_Czysc();

				LCD_ZapiszText("TEST");
				_delay_ms(500);

				LCD_Czysc();
	    	}
}

Podłączenia są na 100% poprawne.

1 odpowiedź

0 głosów
odpowiedź 13 marca 2016 przez Krawiec91 Pasjonat (19,600 p.)
Nie wiem, w jakim środowisku piszesz kod (Atmel Studio, Eclipse czy cokolwiek innego). Masz zdefiniowaną w projekcie, częstotliwości pracy oscylatora ? Jeśli tak, to na jaką, bo od tego zależy jaką wartość trzeba wpisać do rejestrów odpowiedzialnych za UART. Domyślnie, jak nie ruszałeś fusebitów mikrokontrolera, to jest 1Mhz z wewnętrznego oscylatora RC. Więc względem tego trzeba było wyliczać wartości, jakie trzeba wpisać od rejestrów UARTU.
komentarz 13 marca 2016 przez Mavimix Dyskutant (8,390 p.)
edycja 13 marca 2016 przez Mavimix
Korzystam z Eclipse, częstotliwość uC mam ustawioną na 8MHz. Jaka jest funkcja na zdefiniowanie częstotliwości UART?
komentarz 13 marca 2016 przez Krawiec91 Pasjonat (19,600 p.)

Podobne pytania

0 głosów
2 odpowiedzi 588 wizyt
pytanie zadane 23 marca 2016 w C i C++ przez Mavimix Dyskutant (8,390 p.)
0 głosów
2 odpowiedzi 197 wizyt
+1 głos
1 odpowiedź 115 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...