ATmega162, nestíhá usart

Zdravím, mám problém s usartem na atmega162. kod viz nize.



#include<avr/io.h>
#include<avr/iom162.h>

#define F_CPU 16000000UL
#include<util/delay.h>


#define buffer_size 8
#define BAUDratePC 19200

volatile unsigned char tx_buffer[buffer_size] = {1,2,3,4,5,6,7,8};


void usartPC_transmmit(unsigned char data)
{
while (!(UCSR0A & (1<<UDRE0)));
UDR0 = data;
}


int main(void)
{

CLKPR = 0x80;
CLKPR = 0x00;

UCSR0B |= (1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0);
UCSR0C |= (1<<URSEL0) | (1<<UCSZ00) | (1<<UCSZ01);
UBRR0L = F_CPU/16/BAUDratePC - 1;


	while(1)
	{


		for(int i = 0; i < 8; i++)
		{
			//_delay_us(800);
			usartPC_transmmit(tx_buffer*);
		}

		_delay_ms(200);

	}


}

jde o to, že když tam mam to zpozdeni 800us, tak me dojde do PC spravne 1,2,3,4,5,6,7,8.
Ovsem v pripade ze to zpozdeni odstranim, chodi me 1,130,32,80,200,232,132,252.

700 us uz chodi zase to co nema.

Jako prevodnik pouzivam FT232RL zapojene presne podle datasheetu a navic s odpory 10k na Tx a Rx.

Pokud jsem si udelal funkci (nize) na poslani celeho retecce tak me chodilo taky neco jineho.

void usart_comm(char *data)
{
	while(*data)
	{
		usartPC_transmmit(*data);
		data++;
	}
}

A jeste jedna vec, nez jsem zapojil externi krystal tak jsem zkousel usart na vnitrnim rc. Jel jsem na 8MHz, to me neposilal usart ani po jednom znaku dobre, zkousel ruzne moznosti. Zajimave je, ze pokud jsem jel na 8Mhz a rychlosti 4200 baudu tak me to posilalo nesmysly, ale kdyz jsem kmitocet vydelil osmi (CLKPR=0x80;CLKPR=0x03;) na 1 Mhz, samozrekme po te upravil nastaveni usartu na 4200 tak me to pak chodilo dobre, tak nevim jestli treba nebude vadny procak.

Dik za nazory.*

Proč to nejde bez zpoždění mě nenapadá. FTDI má buffer několik desítek bytů. Ještě můžeš zkusit v nastavení ftdi snížit latenci na minimum (byla tam snad 1ms).
Co se týká chybovosti: na uart při RC oscilátoru se nespoléhej. Třeba tiny co leží vedle mne na stole místo 8MHz kmitá od 8.2 do 8.3 a rozhodně to není stabilní frekvence. To už je mimo 2% chyby, která se bere za hranici, kdy ještě uart tak nějak chodí.
Další chybu si můžeš zanést výpočtem “F_CPU/16/BAUDratePC - 1”. Tam se totiž pravděpodobně nedosadí zaokrouhlená, ale oříznutá hodnota, což není ku prospěchu věci.

Mimo téma:
import “iom16.h” je zbytečný, zařídí ho “io.h” pokud je správně nastaven projekt
definice F_CPU je zbytečná pokud si správně nastavíš projekt
pojmenované konstanty se obvykle píší velkými písmeny s podtržítky aby byly snadno rozeznatelné od proměnných

UCSR0B |= (1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0);

A kde je obsluha přerušení ?

obsluha preruseni zde neni, zapomel jsem upravit registr pro tento kod, tento kod je pouze vytazeny z meho vetsiho programu, pro prehlednost jsem ho zde neuvedl cely, ale vytahl z nej pouze tu komunikaci a zkousel to na nem. U tohoto ani u druheho programu kde obsluha je to neni ok. Ale zkusim u tohoto jednodussiho to preruseni zrusit nebo dat obsluhu a treba zjistim ze problem je nekde jinde ve druhem programu. Odpoledne to zkusim.

Přerušení tady není povolené pomocí sei, takže se nic nestane. Kdyby ovšem bylo, tak je pravda, že by to pak moc nechodilo (asi reset).

ATmega162 od vyroby maju nastavene poistky tak, ze frekvenciu oscilatora deli 8x.
Kukni do manualuna poistku CKDIV8.

Ale vobec sa nedivim, ze Ti nejde komunikacia na 4200Bd. Nestretol som sa s PC, ktore by takuto rychlost bezne podporovalo. :slight_smile:

Pouzit RC oscilator na komunikaciu by som sa tiez nebal. V datasheete je navod ako tu frekvenciu donastavit do rozumnych medzi. Ale za urcitych okolnosti to problem moze byt.

Možná nebudu mít pravdu, ale napadá mě, jestli bys neměl testovat nějakej bit, kterej signalizuje že daný data co jsi odeslal v cyklu předtím už odešly a že je možno zapsat nová data do odchozího bufferu kterej jak předpokládam je jenom jedno bajtovej. Vycházím sopíš zeskušeností z procesorama PIC, z atmegama dělam taky, ale k nějakýmu rychlímu odesílání dat po uartu jsem se ještě nedostal, vždickyjsem posílal jenom jeden bajt a pak dlouho nic

EDIT:

C Code Example(1)
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer /
while ( !( UCSRA & (1<<UDRE)) )
;
/
Put data into buffer, sends the data */
UDR = data;
}

On to tam tak aj ma, akurat musel pridat nulu aby rozlisil o aky UART sa jedna. V example datasheetu nie je cislo portu vobec zohladnene. Tiez som na to kukal ako puk. Takze cakacka by mala byt samo sebou, ale tvrdi, ze nie je :frowning:

Som zvedavy, kde bude pes zakopany :slight_smile:

Na vysílací část uartu by to nemělo mít vliv, ale nemáš aktivní kompatibilitu s m161?
Máš někde možnost vyzkoušet komunikaci na HW com portu?

S tím dělením osmi by to melo řešit CLKPR = 0x80; CLKPR = 0x00; i podle blikajicí ledky čas odpovídá. Ale mrknu na to, zkusím to zrušit pokud to tam bude a nepoužiju CLKPR. S tím modem m161 nevim, na to se taky podivam.

Včera jsem zkoušel různé možnosti rychlostí a nastavení a výsledky jsou takové -

UBRR0L = F_CPU/16/BAUDratePC - 1;

nastavení rychlosti dle tohoto vzorce pro 19200 je v hexu 0x33, at počitam na kalkulačce, ořezávám nebo zaokrouhluji tak vycházi pořád 33. Někde na netu jsem nasel dokonce i vzorec

UBRR0L = (F_CPU+BAUDratePC*8)/(16/BAUDratePC - 1); s tím to taky nejelo.

Tak jsem zkoušel měnit UBRR0L ručně, na 0x36 se mě to povedlo i bez toho zpoždění, data chodí jak po másle, ani jedna chyba z tisíce bajtů.

To by můj problém vyřešilo, ale budu potřebovat i příjem od PC a ten zase nechodí, ten nechodí ani při těch 0x33.

Jediné nastavení kdy mě chodí úplně všechno bez problémů je pokud frekvenci nastavím na 1 MHz pomocí CLKPR = 0x80; CLKPR = 0x04; a nastavím rychlost na 1200 Baudů. Odesílání i příjem je úplně bez chyby.

Už jsem z toho docela jelen.

Co se týče toho přímého COMu na PC tak zkusím pohledat nějakého maxíka a zkusím to na starém PC.

Ještě jsem se chtěl zeptat na to nastavení TF232RL, jak psal piityy to s tou latencí, tak nevím jak to nastavit.

Tak víkend se blíží, když se podívám z okna počasí nic moc tak budu mít více času, tak zkusím úplně všechno, snad to nebude ztracený víkend. Určitě dám vědět jak pokračuji.

Zatím dík moc všem za rady.

Problém vyřešen. Ale nevím co se stalo. Tak jsem dnes došel z prace, zkoušel jsem všechno možné, nic nepomohlo. Pak mě napadlo že to zkusím na stolním PC. Tak jsem to zkusil, 19200 bit/s. Příjem, vysílání při výpočtu dle datasheetu a všechno v pohodě. Rikam si ze to bude notasem ze to nejede, ale zapojim to zpet na notas a ono to uz jede i na notasu.

Napadá někoho co se mohlo stát? Stolni PC win XP profi sp3, notebook W7 ultimate.

Jediné co mě napadá je, že ovladače na FT232RL pro W7 něco posrali v cipu a ovladače pro XP to zase daly dohromady a uz to tak zustalo.

Ale kazdopadne jsem moc rad za to ze to jede tak jak ma, snad jsem to nezakrikl a uz to pojede naporad.

Vsem co se zapojili moc díky.

Tak opět změna. Pod W7 ted běhá jenom vysílání. Zkoušel jsem to na notasu s XP a opet vse v pohode, takze tady delaji problem zrejme W7 coz me pekne sere. Zkousel jsem preinstalovat ovladace a nic. No nic, aspon ze na 1200 bitech to beha.