Atmega8A UART Rx problém
Petr T
p.tr na atlas.cz
Úterý Květen 1 09:53:12 CEST 2012
Zdravím,
prosím o radu...
Pokouším se rozchodit komunikaci mezi Atmega8A a Bluetooth modulem.
Vytvořil jsem si jednoduchý program v AVR Studiu a mám problém přijmout
data do procesoru...
Odchozí data fungují normálně, ale jakmile pošlu byte do procesoru tak
se to někde sekne a procesor přestane reagovat (přestane blikat LED,
která je v timeru).
Má být nějak speciálně ošetřen vstup RX u procesoru?
Už jakmile na něj přivedu L úroveň, tak se to sekne...
Přikládám i testovaci SW...
Díky za případnou ochotu pomoci
PeTr
/*
* UART_TEST1.cpp
*/
#include "avr\io.h" // definiční soubor pro mikrokontrolér
#include "avr\interrupt.h" // přerušení mikrokontroléru
#include "avr\sfr_defs.h"
//*******************************************************************************************
// MOJE UPRAVY
//-------------------------------------------------------------------------------------------
//
#define setb(port,pin) port |= 1<<pin //nastav bit
#define clrb(port,pin) port &= ~(1<<pin) //nuluj bit
#define negb(port,pin) port ^= 1<<pin //neguj bit
//***********************************************************************************
volatile unsigned char prijem = 0;
volatile unsigned char rxData = 0;
volatile unsigned char ixTmr0 = 0;
volatile unsigned char fTmr0 = 0;
volatile unsigned char fMerSpeed = 0;
volatile unsigned char prom1;
//---------------------------------------------------
//Preruseni pri prijmu dat seriovou linkou
ISR(USART_RXC_vect)
{
rxData = UDR;
prijem = 1;
negb(PORTD,6);
}
//---------------------------------------------------
// Přerušení při přetečení T/T0
ISR(TIMER0_OVF_vect)
{
TCNT0 = 112;
ixTmr0++;
// ixTmr0 >> 1 = 20ms, 4 = 100ms, 24 = 500ms
if (ixTmr0 > 49)
{
ixTmr0 = 0;
fTmr0 = 1;
negb(PORTB,0);
}
}
// *** Zašle data na UART
void sendUart(unsigned char value)
{
while(!(UCSRA & (1<<UDRE)));
UDR = value;
}
//---------------------------------------------------
int main( void )
{
// ******Nastaveni portu******
// DDR: 0 - vstup, 1 - výstup
// PORT: 0 - "L"/Hi-Z , 1 - "H"/Pull-up
DDRB = 0b00000001;
PORTB = 0b00000000;
DDRC = 0b00000000;
PORTC = 0b00111110;
DDRD = 0b11000010;
PORTD = 0b00011100;
// ********Nastaveni seriove linky********
// USART: Příjem On, Vysílání On
// 8 bitů, Parita Žádná, StopBity Jeden
// Přenosová rychlost 9,6kBaut
// Přerušení při odeslání bajtu: Off
// Přerušení při příjmu bajtu: On
// Přerušení při Data Register Empty: Off
UCSRC = (1<<URSEL)|(3<UCSZ0);
UCSRB = 0b10011000; // TX a RX
UBRRH = 0b10000110;
UBRRL = 47; //Bautrate 9,6kBaut
// ********Nastaveni čítačů a časovačů********
// *******Čítač časovač0*******
// Vstupní signál: CK/1024 (f=7,2kHz, T=138,889us)
// Přerušení při přetečení T/T0
// *******Čítač časovač1*******
// Vstupní signál: Extertní vstup T1, sestupná hrana
// Mód časovače: Normální čítání
// Výstup OC1A odpojen
// Výstup OC1B odpojen
TCCR0 = 0b00000101;
TIMSK = 0b00000001;
TCCR1B = 0b00000110;
TCCR1A = 0b00000000;
TCNT0 = 112;
TCNT1 = 0;
ICR1 = 0;
OCR1A = 0;
OCR1B = 0;
sei(); // Zapnutí všech přerušení
while(1)
{
if (prijem == 1)
{
prijem = 0;
sendUart(51);
sendUart(rxData); // vrátí přijatý byte
}
if (fTmr0 == 1)
{
fTmr0 = 0;
sendUart(TCNT1H); // odešle stav čítače 1
sendUart(TCNT1L);
}
}
return (1);
}
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20120501/00563531/attachment.htm>
Další informace o konferenci Hw-list