Ahoj
Z PC posilam hodnoty trech scrollbaru (visual studio c#),na strane MCU (ATmega16) je prijmu a ovladam tim PWM pro RGB LED.To funguje.Pak se ale snazim na strane MCU v obsluze pro prijem dat data hned poslat.Ale na strane pc to nereaguje.
[code]
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
// Konstanty
#define REG_TCNT0 190 // frekvence PWM
#define CLOCK_SPEED 8000000 // systemovy hodiny 8Mhz
#define BAUD 9600 // rychlost ser. linky
#define MY_UBRR (CLOCK_SPEED/16/BAUD)-1 // vypocet registru UBRR
// Pozice
#define BITPOS_0 0
#define BITPOS_1 1
#define BITPOS_2 2
#define PORT_1 PORTB
// Makra
#define SET_BIT(BYTE,BIT)(BYTE|=(1<<BIT))
#define CLEAR_BIT(BYTE,BIT)(BYTE&=~(1<<BIT))
#define CHECK_BIT(BYTE,BIT)(BYTE&=(1<<BIT))
// Deklarace globalnich promennych
volatile unsigned char Red = 0,Green = 0,Blue = 0;
// Obsluha preruseni TIMER0 pri preteceni
ISR(TIMER0_OVF_vect)
{
static unsigned char Pwm;
TCNT0 = REG_TCNT0;
Pwm++;
if ((Pwm == 0) && (Red != 0)) SET_BIT(PORT_1,BITPOS_0);
if ((Pwm == Red) && (Pwm != 255)) CLEAR_BIT(PORT_1,BITPOS_0);
if ((Pwm == 0) && (Green != 0)) SET_BIT(PORT_1,BITPOS_1);
if ((Pwm == Green) && (Pwm != 255)) CLEAR_BIT(PORT_1,BITPOS_1);
if ((Pwm == 0) && (Blue != 0)) SET_BIT(PORT_1,BITPOS_2);
if ((Pwm == Blue) && (Pwm != 255)) CLEAR_BIT(PORT_1,BITPOS_2);
}
// Obsluha pri prijmu dat ze ser. linky
ISR(USART_RXC_vect)
{
static unsigned char Pole[3];
static unsigned char Index;
Pole[Index++] = UDR;
if(Index == 3)
{
Index = 0;
Red = Pole[0];
Green = Pole[1];
Blue = Pole[2];
/*////////////////////////////////////////
TADY POSILAM ZPET OBSAH JEDNOHO Z PWM REGISTRU
////////////////////////////////////////*/
while ( !( UCSRA & (1<<UDRE)) )
UDR = Red;
}
if (CHECK_BIT(PORTC,BITPOS_1)) CLEAR_BIT(PORTC,BITPOS_1);
else SET_BIT(PORTC,BITPOS_1);
}
void main (void)
{
// Inicializace mcu
DDRA = 0xFF; // port A jako vystup
DDRB = 0xFF; // port B jako vystup
DDRC = 0xFF; // port C jako vystup
DDRD = 0xFF; // port D jako vystup
// Zhasne vsechny LED
PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
// Globalni povoleni preruseni
sei();
// Nastaveni TIMER0 a Preruseni (Timer0 zajistuje softwarove PWM)
TCNT0 = REG_TCNT0;
TIMSK |= (1<<TOIE0) ; // Preruseni pri preteceni
TCCR0 |= (1<<CS01); // Normalni rezim,delicka 8.,
// Nastaveni Serive linky
UBRRH = (unsigned char)(MY_UBRR>>8); // Nastavi rychlost
UBRRL = (unsigned char)MY_UBRR;
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<TXCIE); // Zapne vysilac a prijimac,povoli preruseni pri prijmu a dokonceni vysilani
UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1); // 8 datovych bitu,2 stop bit
// MAIN LOOP
for(;
{
}
}[/code]
Na strane PC mam toto:
private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
if (SerialPort1.BytesToRead > 0)
{
byte] tmp = new byte[this.SerialPort1.BytesToRead];
this.SerialPort1.Read(tmp, 0, tmp.Length);
if (Label1.InvokeRequired)
{
Invoke(new EventHandler(delegate { Label1.Text = "jo"; }));
}
else
{
Label1.Text = "jo";//Label1.Text = tmp[tmp.Length].ToString();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
administrator: přejmenováno z "Seriova llinka na strane PC neprijima"