UART komunikace s PC, propojení PC s AVR-převodník RS232/USB

Zdravím :slight_smile:
Chtěl jsem se zeptat - jak na propojení PC s AVRkem ? Potřebuji posílat pár dat ze zařízení. Díval jsem se že by to šlo přes UART a vypadá, že to je docela jednoduché ?
Bude fungovat tohle zapojení homepage.hispeed.ch/peterfleury/avr-uart.html a tato knihovna homepage.hispeed.ch/peterfleury/avr-software.html#libs ?
Půjde k tomu použít nějaký obyčejný převodník RS232/USB třeba tento alfacomp.cz/php/product.php?eid=1051400060000008FG&Search=rs232&SearchType=1
a na straně windowsů předpokládám že bude stačit hyperterminál a z něj si již data překopíruji jinam ?

:arrow_right: administrator: přejmenováno z "UART a komunikace s PC"

Zapojení by mělo být vpořádku, fleuryho programové moduly jsou funkční a vyšperkované, často však zbytečně moc :slight_smile:. Místo relativně velkého všestranného kódu by ti na poslání pár bytů stačilo 5 řádků inicializace a posílací funkce, která by byla řekněme taky na 5 řádků.
Převodník bude dostačující pouze pro komunikaci. Kdybys ho chtěl použít na programování, tak máš velkou šanci, že neuspěješ.
Kombinace MAX + převodník USB-RS232 se dá nahradit jediným obvodem, např. FT232.

tak mě jde jenom o poslání pár dat do počítače, takže to asi vemu takhle s rs232. ta ft232 je sice hezká, ale zapojení se mi zdá nějaké složité a jak se znám, tak by mi to taky nemuselo fungovat, zvlášť když vidím to smdéčko a moje pájení :slight_smile:

Jen tak pro zajímavost: cz.farnell.com/ftdi/um232r/evalu … dp/1146036

tak jsem to zapojil a udělal dle té knihovny,
do projektu napsal:
#include “uart.h”
#define UART_BAUD_RATE 9600
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
uart_puts(“String stored in SRAM\n”);

a ono to nic nepíše - mám to dobře ? Předpokládám že by to mělo vypisovat do hyperteminálu String stored in SRAM
Jak nastavit hyperteminál ? Jednak se mi ptá na port COM1/COM2, poté na bity za sekundu, datové bity, paritu, počet stop-bitů a řízení toků.
Díky za odpověď

V tom modulu jsem se nevrtal, tvůj kód mi taky nejel.
Nevidím ale žádnej problém si obsluhu napsat sám.

[code]#include <avr\io.h>

void main(void)
{
// ======= UART INIT ======================
// default nastaveni usartu tiny2313 je 8N1
UCSRB |= 1<<TXEN; // transmitter enable
UBRRL = 25; // 9600Bd pro 4MHz, 0.2%
// ========================================

UDR = 'A';	// odešle znak A

for(;;)
{ 
	//
} 

}[/code]

Jsou názvy těch registrů dobře ? Já používám ATMegu88 a koukám že jsou asi trochu jinak.

Samozřejmě že nejsou, v komentáři je “tiny2313” :slight_smile:. O svym mcu jsi nic nepsal, tak jsem nemohl čuchat, co máš. Taky nevim, jakou máš frekvenci (asi 1 nebo 8MHz), správnou hodnotu pro UBRR registr si najdi v tabulce “Examples of UBRRn Settings for Commonly Used Oscillator Frequencies”.
Pokud máš datasheet z 08/2010, tak je to od strany 196.

Pro usart0:
UDR = UDR0
UCSRB = UCSR0B
UBRRL = UBRR0L

Tak jsem to zkusil, a stejně nechodí.:frowning: V čem může být chyba ? To stačí opravdu jenom tyto tři řádky? Nechce ještě nějak nastavit DDR ,hyperterminál ? funguje to na všech COM portech ? (mam docela nový počítač, ten COM tam je možná dělaný přes nějaký přídavný čip.)
Napětí na T2out -10,5V (stále)

Ten kód jsem vyzkoušel než jsem ho postnul. Takže stačí (po modifikacích pro tvůj mcu).
Co se týká COM portu v PC, musíš vybrat ten správný, který je vytvořen převodníkem USB-COM. Buď můžeš zkoušet, nebo si otevři správce, rozbal si COM porty a zapoj převodník. Nějaký by měl přibýt a to je ten hledaný. Nastavení přenosu je 8 bitů, žádná parita a 1 stop bit (8N1). Rychlost záleží na tvém zdroji hodin a nastavení UBRR registru. Přihoď sem tvůj upravený kód a frekvenci mcu (a zdroj z jakého běží, pokud to není interní RC, tak i nastavení fuses).

8MHz (krystal, LFUSE 0xFF HFUSE 0xDF)
UCSR0B |= 1<<TXEN0; // transmitter enable
UBRR0L = 51; // 9600Bd pro 8MHz, 0.2%
UDR0 = ‘A’;

Díky za pomoc

Zkus následující kód abysme viděli, jesli mcu běží. Fuses by měly být správně. Každou vteřinu by se měl změnit stav diody na PB0 a být odeslán znak ‘A’.

[code]#include <avr\io.h>
#define F_CPU 8000000UL
#include <util/delay.h>

void main(void)
{
DDRB |= 1<<PB0;

// default nastaveni usartu megy88 je 8N1
UCSR0B |= 1<<TXEN0;
UBRR0L = 51;		// 9600Bd pro 8MHz, 0.2%

for(;;)
{ 
	//
	_delay_ms(1000);
	PORTB ^= 1<<PB0;	// negace PB0
	UDR0 = 'A';			// odešle znak A
} 

}[/code]

tak konečně jsem se k tomu dostal, abych to otestoval. Port PB0 bliká, ale hyperterminál nic nepřijímá. :frowning:
V čem může být chyba ? Ještě zkusím jiný procesor a počítač.

Možností je několik.

Nejprve vyzkoušej loopbacky. Když propojíš TX a RX na převodníku, tak znak vyslaný terminálem se musí vrátit.

Funguje-li toto, připoj k převodníku maxe a proveď s jeho (TTL) TX a RX to samé. Zas se musí znak vrátit do terminálu.

Spustim ve win XP terminál, bliká tam kurzor a nic nedělá. Jak mu mám odeslat znaky ? Když něco napíšu a dám enter, tak program se na chvilku zasekne, žádné napsané znaky nevypíše a ani nic přijatého nevypíše.

Neexistuje nějaký jiný program ?

EDIT 2: teď jsem zkusil tento terminál sosej.cz/Download/Bray-Terminal-Download.html?err a taky nic nevrací. Ale to co odesílám to už zobrazí.

EDIT3: a už to odpovídá - měl jsem jeden kabel napájený vedle. Tak já to jdu přepájet :slight_smile:

:arrow_right: administrator: přiloženy externí soubory
Terminal-1-9-b.zip (321 KB)

Výborně, už onen problém začíná nabírat směr :slight_smile:.

Tak nakonec jsem zjistil, že mám na počítači přehozené piny na COMu. Na jinym počítači jsem nic přepájet nemusel. Takže na samotném RS232 odeslanou hodnotu vrací.

Poté jsem vyzkoušel propojit TX a RX na TTL. Nevracelo se nic. Přepojil jsem proto obvod MAX232 z výstupů označených 2 na výstupy označené 1 a vrací. Je možné že musí být nejdříve zapojovány 1 a pak až 2 ? Nebo mám kousek MAX232 odpálenou ?

U maxe by mělo bejt jedno, kterou dvojici tr/tx použiješ.

Takže zatím děkuji, znak A mi to odesílá.
Teď tady řeším funkci, aby mi to odesílalo celý string

void PosliString(volatile char retezec])
{
int konec = strlen(retezec);
int i;
for(i=0;i<konec;i++)
{
UDR0 = retezec*;
_delay_ms(1); 
}
}

pokud tam nedam delay, tak to odesle pouze prvni dva znaky. Divné, ale takhle mi to zatim postacuje. Jak udělat, aby v hyperterminálu přešel na nový řádek ? Co mám odeslat za znak ?*

Nic divného na tom není.
Ty prostě nečekáš než se vyprázdní buffer.

void PosliString(volatile char retezec]) { int konec = strlen(retezec); int i; for(i=0;i<konec;i++) { while ( !(UCSR0A & (1<<UDRE0)) ); /* Wait for empty transmit buffer */ UDR0 = retezec*; } } *