Sériová linka přijímá na straně MCU a nepřijímá na straně PC

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(;:wink:
{

}

}[/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);
            }
        }

:arrow_right: administrator: přejmenováno z "Seriova llinka na strane PC neprijima"

Na straně PC chyba není, to mi funguje (když to spojím s nějakým terminálem přes virtuální port). Takže chybka bude u HW.
Nejdřív zkus úplně vyřadit MCU. Tx maxe nebo co tam máš spoj s Rx. Co odešleš z PC se ti musí hned vrátit.

Máš povolený přerušení TXC, ale nevidím nikde jeho obsluhu.

Jo to povoleni sem uz smaznul, ale v liv to nemelo,kontroloval sem i MAXE pac sem dneska prepajoval stary kabilky.A v zdal se bejt dobre.Propojil sem vystupy MAXE jak si psal a nefungovalo to takze bude asi chyba nekde v zapojeni prevodniku.Este jednou to projedu.A taky skusim MCUcku taky propojit RxD s TxD a neco pislat.Uvidim…

Tak.Loopback mi na PC funguje,kdyz ji zkusim za maxem tak uz nefunguje.Tagze chyba bude v prevodniku(asi vadnej MAX).
Kdyz udelam loopback na MCU nefunguje pokud pouziju cekani na dokonceni vysilani()while ( !( UCSRA & (1<<UDRE)) ).Coz je divny!!!

Jaký to je to MAX? Kde máš a jaké kondenzátory?

Mirek

MAXIM MAX232CPE +2603
Podle tohdle navodu:
http://www.dhservis.cz/dalsi/prevodnik.htm[

Driv mi fungoval pokud vim dobre.Dneska sem prepajoval dratky.Ty sou tak jak maj bejt.Leda zeby teplem odesel,ja vul ho nevyndal z patice… se divim ze funguje odesilani.]()

Nebo odešel statikou. RAdeji používám …202E… stačí jim keramika 100nF a mají antistatickou ochranu.

No je dvojtej tak skusim pouzit este druhej prevodnik,nemam na plosnaku vyvedeny pinjy nagze to bude trcet zespoda z patice :smiley: to bude pohled.hl kdyz zafunguje.Jak je celej nazv toho tvyho?? MAXIM MAX232CPE +202E???

MAX202E… pdfserv.maxim-ic.com/en/ds/1047.pdf
ST202E… st.com/stonline/products/lit … t202eb.pdf
AD202E… analog.com/static/imported-f … _1181A.pdf

maličkosti jako teplotní rozsah a pouzdro nevypisuji. AD jsem používal ke své spokojenosti.

Tak sem vymenil MAXE a porad nic.Kdyz udelam loopback na portu tak to funguje paradne.Kdyz,ale spojim RxD TxD za maxem tak to prestane behat uplne.

Jsem natvrdlej, takže z MCU můžeš posílat do PC a z PC do MCU ne?
Můžeš se podívat zda na výstupu RxD máš signál - LEDka s odporem.

Tak tohle je ten vynik:

while ( !( UCSRA & (1<<UDRE)) ) 

Kdyz tam mam tenhle radek tak mi to nefunguje.A toho mam z data sheetu.Vysvetli mi ti nekdo???

Když uděláš loopback za maxem, tak to MUSÍ chodit, jinak tam máš nějakej bordel.
Co se týká tý čekací podmínky, ta se používá při vysílání aby sis nepřepsal data ještě než odejdou, ta podmínka je vpořádku.

Ja vim k cemu ta podminka je,ale nechodimi s ni.Ja uz nevim v cem muze byt chyba jestli v prevodniku nebo kde…

Rozjeď loopback za maxem, to prostě musí chodit, bez toho nemůžeš čekávat nějakou rozumnou funkční komunikaci.
Stáhni pdfko přesně od toho švába, kterýho máš a zapoj to podle něj. Na nějaký weby nebo “univerzální návody” se vybodni.

Jesli máš ještě jeden mcu, tak si můžeš komunikaci vyzkoušet mezi nima. Jeden bude dělat loopback a druhej bude posílat a kontrolovat data.
Na začátku máš v programu 8MHz. Jesli je to interní, zkus dolepit krystal, interní docela lítá. Jsem koukal, když jsem si postavil čítač :slight_smile: S krystalem jsou změny až za pátou/šestou číslicí, interní RC občas přeskočí už na druhý.

Myslim si ze to mam zapojeny dobre,pac uz mi to driv chodilo.Navic mi to sedi podle datasheetu.A kdyby odesel nejakej kondik tak si myslim ze by to nefungovalo vubec.

Chyba lávky :slight_smile: Většina toho švába má nastarost právě vysílání (do PC) na RS-232. Na příjem a převod do TTL ti stačí tranzistor a odpor + nějaká ochrana. Ovšem celá nábojová pumpa a kondiky jsou tam právě pro vytvoření dostatečnýho napětí pro RS-232.
Podívej se na napětí na těch kondenzátorech. Jeden je zdvojovací (napětí >5V), další je pro inverzi a 2 pomocný pro transport náboje.
Pin2: > +5V, Pin7: < -5V

Na pinu 2 sem nameril jen 4,2V a na pinu 6 -3,8V (psal si pin 7 ale asi si myslel pin 6).Napjeti ze stabilizatoru je jen 2,8V !!A na vsupu stabilizatoru sem nameril 0,09V.A na vsutupu este pred diodama leze z comu -9,5V.Co se z toho da vycist??

S pinem 7 máš pravdu, překlep.
Teď jsi mě docela zmátl :slight_smile:
Napětí ze stabilizátoru 2.8V? Napájení tvého maxe má být 5V.
Na vstupu stabilizátoru 0.09V? Teď jsem vážně mim mísu.
Na str. 17: datasheets.maxim-ic.com/en/ds/MAX220-MAX249.pdf je doporučené zapojení i orientační hodnoty napětí pinu 2 a 6 (můžou být i o 3V menší). Kdyby se ti podařilo vytvořit nějaký obrázek (klidně ručně a scan), kde co měříš, možná by to pomohlo.
Nemáš někde otočenej kondik?

dhservis.cz/dalsi/prevodnik.htmal sem to podle tohoto schematu:
dhservis.cz/dalsi/prevodnik.htm
Sedi to s datasheetem,to uz sem kontroloval.Kondiky otoceny nemam.Navic jak si vzpominam kdysi sem posilal data prave z MCU do PC bezproblemu.

Prikladam svoje veledilo,neleknise!