Witam
Posiadam zestaw uruchomieniowy ATmega8 zl2avr taktowany 1MHz(fabrycznie) i chciałem napisac program przesyłajacy dowolny znak na PC, ma byc odczytywane w hyperterminal. Ale niestety nie mia transmisji zadanego przeze mnie znaku. W trakcie transmisji (wskazuje ją świecaca się dioda) kursor w hyperterminalu mryga szybciej, czyli wnioskuje ze cos sie na tym RS-ie dzieje. Zadany przeze mnie w programie na sztywno baud rate wynosu 2400, bo przy czestotliwosci 1MHz błąd wynosi 0.2%, wiec raczej transmisja powinna zostac odebrana poprawnie, ale jak pisałem wyzej nic nie jest odbierane.
Oto kod mojego programu:
main.c
funkcje.c
projdat.h
Prosze o pomoc, bo nie wiem co juz robic
Posiadam zestaw uruchomieniowy ATmega8 zl2avr taktowany 1MHz(fabrycznie) i chciałem napisac program przesyłajacy dowolny znak na PC, ma byc odczytywane w hyperterminal. Ale niestety nie mia transmisji zadanego przeze mnie znaku. W trakcie transmisji (wskazuje ją świecaca się dioda) kursor w hyperterminalu mryga szybciej, czyli wnioskuje ze cos sie na tym RS-ie dzieje. Zadany przeze mnie w programie na sztywno baud rate wynosu 2400, bo przy czestotliwosci 1MHz błąd wynosi 0.2%, wiec raczej transmisja powinna zostac odebrana poprawnie, ale jak pisałem wyzej nic nie jest odbierane.
Oto kod mojego programu:
main.c
#include "projdat.h"
// dane :
// funkcje :
//====================
// funkcja main()
int main(void)
{
// inicjalizacja
//== start ======================= inicjalizacja portów =======================
DDRB = 0xFF; //--- inicjalizacja portu B jako output na wszystkich flagach
PORTB = 0xFF; //---
DDRC = 0xFF; //--- inicjalizacja portu C jako output
PORTC = 0xFF; //--- port C obsługuje wysw 7 seg, stan niski oznacza zapaloną "pałke" wyswietlacza
DDRD = 0; //--- inicjalizacja portu D jako intput
PORTD = 0xFF; // port D obsluguje przyciski, kiedy przycisk jest załaczony mamy stan niski czyli 0, port musi byc zainicjalizowany z jedynkami
//== stop ======================== inicjalizacja portów =======================
init_usart(25);
//sei();
//char *string = "usart dziala jak ulal";
// pętla główna
while (1)
{
if(BUTTON4_CLICK)
{
PORTC &=~ _BV(5); //-- zapala diode by zasygnalizowac wysyłanie
//transmit_string_usart(string);
transmit_usart('W');
PORTC |= _BV(5); //--- gasi diode gdy dane zostaną wyslane
}
}
}funkcje.c
//---------------------------------------
void init_usart(uint baud_rate)//--- funkcja inicjalizujaca USART
{
//UCSRC &=~ _BV(UMSEL); //--- ustawienie trybu aynchronicznego
UBRRH = (uchar)(baud_rate>>8); //--- ustawienie baud rate pobranego z parametru funkcji
UBRRL = (uchar) baud_rate;
UCSRB = _BV(RXEN) | _BV(TXEN); //--- ustawienie Transmiter'a i Receivere'a
UCSRC = _BV(UCSZ0) | _BV(UCSZ1); //--- ustawienie ramki, kolejno: długosc slowa - 8bitów
UCSRC |= _BV(USBS); //--- ilosc bitów stop - 2
UCSRC |= _BV(URSEL); //--- zapis/odczyt danych z/do UCSRC
//---
}
//---------------------------------------
void transmit_usart(uchar data)//--- funkcja transmitujaca dane przez usart
{
while(!(UCSRA & _BV(UDRE))); //--- sprawdzanie czy rejest UDR jest pusty zanim bedzie mogła nastąpic kolejna transmisja, jest nie jest pusty, wykonuje pusta petle
UDR = data; //--- załadowanie nowych danych do wysłania
//_NOP;
//_NOP;
}
//---------------------------------------
void transmit_string_usart(uchar *data)//--- funkcja transmitujaca słowo danych
{
while(*data) transmit_usart(*(data++));
}
//--------------------------------------- projdat.h
// plik nagłówkowy globalnych danych projektu
#ifndef _PROJ_DAT_H_
#define _PROJ_DAT_H_
// #include :
#include <avr/delay.h>
#include <avr/io.h>
// #define :
#define F_CPU 1000000
#define BUTTON4_CLICK (!(PIND & _BV(3)))
// deklaracje funkcji
// extern char Myfunc(int,char);
extern void init_usart(uint baud_rate);
extern void transmit_usart(uchar data);
extern void transmit_string_usart(uchar *data);
#endifProsze o pomoc, bo nie wiem co juz robic