-
Path: news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!goblin1!goblin.s
tu.neva.ru!news.motzarella.org!motzarella.org!news.motzarella.org!not-for-mail
From: Piotr <p...@g...com>
Newsgroups: pl.misc.elektronika
Subject: Atmega8 i USART
Date: Sun, 04 Jan 2009 17:31:11 +0100
Organization: A noiseless patient Spider
Lines: 112
Message-ID: <gjqo8s$691$1@news.motzarella.org>
Reply-To: p...@g...com
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-2; format=flowed
Content-Transfer-Encoding: 8bit
X-Trace: news.eternal-september.org
U2FsdGVkX1+/Z4vE2IcmeauhLeleNStVXh3JqREPA/vnVBboOGi6xLoWpgmvOAnUhwZanlPBu/YQMyPRN/CfjGUMYh8cRRBZznhko7pwwYm3c8zh9Khfv9qQgNcJvmxvSl7hDnLUIVs=
X-Complaints-To: Please send complaints to a...@m...org with full headers
NNTP-Posting-Date: Sun, 4 Jan 2009 16:31:25 +0000 (UTC)
X-Antivirus-Status: Clean
X-Auth-Sender: U2FsdGVkX19UyPNRo1d8IcWu9eEpVXuWqFfDc+sML1k=
X-Antivirus: avast! (VPS 090104-0, 2009-01-04), Outbound message
X-Face: Mv4(E%UaE*shXz=?X`*oGW^F)Iqmp(N:~Rw}F=S}/aM&bv8LG'<M2R26wq.5Oz13A"bn=Rw
,xPL8/C%$>@4O#Oar@/o+'sB/Os&cBEFtUdxk[\\9"G7'Y224koPP!XsvHd|7),9+S!)_F92PR;-
Cancel-Lock: sha1:2Mw1VIeJfx+8UoYCStgUecaVatk=
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL; rv:1.8.1.3)
Gecko/20070326 Thunderbird/2.0.0.0 Mnenhy/0.7.5.666
Xref: news-archive.icm.edu.pl pl.misc.elektronika:553449
[ ukryj nagłówki ]Witam,
Nie wiem dlaczego, ale mam dość dziwną i niejasną dla mnie sytuację. Próbuję
odebrać dane przez USART z wykorzystaniem przerwania. Robiłem już to setki
razy zarówno dla AVR, PIC, Freescale i nigdy nie miałem z tym najmniejszego
kłopotu.
Używam kompilatora gcc 4.3.2 (WinAVR-20081205) z następującymi parametrami
kompilacji:
avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -DF_CPU=4000000 -Os
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
-Wp,-M,-MP,-MT,main.o,-MF,dep/main.o.d -c ../main.c -o main.o
uC pracuje z wykorzystaniem wewnętrznego oscylatora o częstotliwości 4MHz.
Wysyłanie oraz odbieranie znaków w aktywnej pętli działa bez najmniejszego
problemu. Kłopoty się zaczynają, gdy próbuję to zrobić w obsłudze przerwania.
Wygląda na to, iż ani razu przerwanie nie jest wywoływane. Dodam, iż jeżeli
korzystam z aktywnego czekania podczas gdy włączone są przerwania, dane
również nie są odbierane. Oto mój kod:
//--------------------------------------------------
---
#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\signal.h>
volatile unsigned char data_rx = 1;
////////////////////////////////////////////////////
///
// Inicjalizacja interfejsu
////////////////////////////////////////////////////
///
void usart_init(int baud_rate)
{
// Ustawienie bauda
UBRRH = (baud_rate >> 8);
UBRRL = baud_rate;
// Ustawienia USART
UCSRB = (1 << RXEN) // Wlaczenie odczytywania
| (1 << TXEN) // Wlaczenie wysylania
| (1 << RXCIE); // Wlacz przerwanie odczytywania
// Ustawienia transmisji
UCSRC = (1<<URSEL) // Odycztywanie rejestru UCSRC
| (1<<USBS) // 2 bity stopu
| (3<<UCSZ0); // 8 bitowy znak
}
////////////////////////////////////////////////////
///
// Wysłanie danych
////////////////////////////////////////////////////
///
void usart_send_char(unsigned char data)
{
// Poczekaj az zwolni sie bufor transmisji
while ( !( UCSRA & (1<<UDRE)) )
;
// Umiesc dane w buforze
UDR = data;
}
////////////////////////////////////////////////////
///
// Odebranie danych
////////////////////////////////////////////////////
///
char usart_receive_char()
{
// Czekaj az dane beda gotowe
while ( !(UCSRA & (1<<RXC)) )
;
// Pobierz dane
return UDR;
}
////////////////////////////////////////////////////
///
// Obsługa przerwania odbioru
////////////////////////////////////////////////////
///
ISR(USART_RXC_vect)
{
PORTB &= ~(1 << PB0); // Zgas diode
data_rx = UDR; // Pobierz dane
}
////////////////////////////////////////////////////
///
// main()
////////////////////////////////////////////////////
///
int main()
{
unsigned char tmp;
// Led uC
DDRB |= (1 << PB0);
PORTB |= (1 << PB0);
// Inicjalizacja interfejsu USART
usart_init(25); // Baud rate dla 4Mhz i 9600 bps
// Wlacz wszystkie przerwania
sei();
while(1)
;
return 0;
}
//--------------------------------------------------
---
Będę bardzo wdzięczny za wszelkie sugestie.
--
Piotr Piwko
http://www.embedded-engineering.pl/
Najnowsze wątki z tej grupy
- Jak sie smazy elektronike z odleglosci kilkuset metrów?
- William Shockley, co-inventor of the transistor
- Gazowy kocioł CO regulacja cyklingu i regulacja pogodowa
- Zamek elektroniczny
- szablon do pasty DIY
- Głośnik potrzebny
- Silikonowy przewód ekranowany
- Wtyk bananowy ekranowany
- Co może być gorsze od pożaru elektryka?
- daltonizm
- Mały Linux
- Superkondensator. Czy to się uda?
- Stare filmy o technice
- Zasilanie własnych konstrukcji przez PoE
- Jak działa domofon?
Najnowsze wątki
- 2025-11-07 Wrocław => Programista React ze znajomością C++ <=
- 2025-11-07 Lublin => Programista Delphi <=
- 2025-11-07 OBD2 napięcie akumulatora
- 2025-11-06 citek i GP.
- 2025-11-06 envelo - list polecony
- 2025-11-06 Ostrów Wielkopolski => Specjalista ds. Marketingu Online (PPC) <=
- 2025-11-06 Warszawa => Strategic Account Manager <=
- 2025-11-06 Warszawa => Senior Frontend Developer (React + React Native) <=
- 2025-11-06 Ktoś się wybiera?
- 2025-11-05 Warszawa => C Programmer <=
- 2025-11-05 Rzeszów => International Freight Forwarder <=
- 2025-11-05 Warszawa => OSS System Administrator <=
- 2025-11-05 Gdańsk => Programista Delphi <=
- 2025-11-05 Warszawa => AWS Cloud Engineer <=
- 2025-11-05 Wrocław => Programista React ze znajomością C++ <=




Elektromobilność dojrzewa. Auta elektryczne kupujemy z rozsądku, nie dla idei