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