USART u ATtiny2313 – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

USART u ATtiny2313 – C / C++ – Fórum – Programujte.comUSART u ATtiny2313 – C / C++ – Fórum – Programujte.com

 

Vlákno bylo úspěšně vloženo.
Pokud sám přijdeš na řešení, nezapomeň ho sem přidat!
rudla
~ Anonymní uživatel
11 příspěvků
8. 5. 2014   #1
-
0
-

Zdravím,

mám dotaz ohledně psaní programu pro ATtiny 2313, kde bych měl posílat data z PC do 2313. Problém je v tom, že jsem ve škole zrovna na USART nebyl, tudíž nevím, o co se jedná. Když jsem se ptal učitele, nic mi ko tomu neřekl. Normálka. Od spolužáků tomu nějak výrazně nerozumím. V podstatě jen vím, že bránu B mám nastavit jako výsupní a D jako vstup.
Podle  zadání je přenosová rychlost 19200 Bd, datový rámec: 8 bitů pro data, 1 STOP bit a sundá parita.

Popravdě vůbec nechápu, o co se jedná. Mám k dispozici kód od spolužačky, ze kterého poznám asi jen podle názvu, že jde o USART.

#include <avr/io.h>
#define F_CPU 20000000UL
#define BAUD 9600
#include<util/setbaud.h>
#include<avr/interrupt.h>
static void USART_init(void)
{
	UBRRH = UBRRH_VALUE;
	UBRRL = UBRRL_VALUE;
	UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
	UCSRC = (1<<USBS)|(3<<UCSZ0);
}

/*void USART_init() // 9600 Bd => jedna možnost
{
	UBRRH = 0;
	UBRRL = 0x81;
	UCSRB = (1<<RXEN) | (1<<TXEN);
	UCSRC = (1<<USBS); //2 stop bity
}
*/
int main(void)
{
	USART_init();  // 9600 Bd 
	//sei();  
	UDR = 'A'; //0x41
    while(1)
    {

    }
}

Prosím, je tu někdo, kdo by byl s tím schopen trochnu hnout? Díky moc.

Nahlásit jako SPAM
IP: 90.181.44.–
KIIV
~ Moderátor
+43
God of flame
8. 5. 2014   #2
-
0
-

stahni si datasheet pro attiny2313 a tam si najdi sekci o usartu.. ve zkratce je to seriovej port pro komunikaci mezi zarizenima (musi mit stejnej baudrate - rychlost komunikace, protoze asynchronni verze neprenasi po kabelech hodinovy signal - proto je taky asynchronni)

nejdulezitejsi je pak podsekce registry pro usart, kde pak najdes co se kde ma nastavit tak, aby to odpovidalo zadani...

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
9. 5. 2014   #3
-
0
-

K nastavení portů: podívej se na zapojení vývodů na který pin je vyveden RxD (příjem dat) - ten se nastaví jako vstup a TxD (vysílaní dat) jako výstup. Nastavení je popsáno v kapitole o portech. Vaše školní úloha má jedno drobné specifikum - používá paritu, proto pozor při opisování kódu z internetu, často je pro přenos bez parity.

Kód který jsi sem dal nebude schopen z PC příjmout ani byte. Nejspíš odešle jeden byte (znak A) do PC. Pro příjem bys musel každý přijatý znak přečíst z UDR a ... co se má s přijatými daty udělat?. Např zapsat na výstupní port s ledkama. To přináší otázku, jak zjistit, že mám přijatá data? Jsou dva způsoby: 1. pravidelné testování příznaků (možná najdeš ukázku v datasheetu) 2. obsluha přerušení. Druhý způsob je o hodně méně náročný na strojový čas, proto se používá častěji. Stačí povolit příslušné přerušení a napsat jeho obsluhu. 

Když pohledáš v Application Notes, možná budeš moci opisovat od Atmelu. Je tam plno hotových řešení s vysvětlením, jak fungují. 

hu

Nahlásit jako SPAM
IP: 195.178.67.–
rudla
~ Anonymní uživatel
11 příspěvků
14. 5. 2014   #4
-
0
-

#3 hlucheucho
co se má s přijatými daty udělat?

O tom v zadání nebylo ani slovo. Jen to, že máme program otestovat v aplikaci Terminal (SDK).

Nahlásit jako SPAM
IP: 90.181.44.–
15. 5. 2014   #5
-
0
-

Jde to na více způsobů, ale nejjednodušší bude buď zapsat na port nebo poslat echo.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
rudla
~ Anonymní uživatel
11 příspěvků
15. 5. 2014   #6
-
0
-

#5 hlucheucho
Po dotazu mi učitel oznámil, že to má jít na LCD, což bych dal, teď jenom prostudovat ten příjem dat.

Nahlásit jako SPAM
IP: 91.219.241.–
15. 5. 2014   #7
-
0
-

V kostce: nastavíš GPIO aby RxD fungoval jako vstup a USART podle zadaných parametrů. Nastavíš a povolíš přerušení od příjmu. Při každém přijatém znaku bude vyvoláno přerušení a ty při jeho obsluze přečteš přijatý znak a uložíš do bufferu. Na LCD pak v hlavním programu vypisuješ z bufferu po znacích nebo lze vypsat celou zprávu. V době, kdy procesor nemá co na práci, bych ho uvedl do Idle Mode.

Možná by šlo na LCD psát přijaté znaky přímo při obsluze přerušení, ale musel by sis "odpustit" časově náročné operace s LCD - např jeho smazání.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
rudla
~ Anonymní uživatel
11 příspěvků
15. 5. 2014   #8
-
0
-

#7 hlucheucho
V datasheetu jsem našel příklad a když jsem ho zakomponoval do úvodníku, tak mám tohle, jenomže nevím, jak nadefinovat sudou paritu, 8 bitů pro data a 1 STOP bit. Nebo to už se nastavuje jen v programu Terminal? 

#include <avr/io.h>
#define F_CPU 20000000UL
#define BAUD 19200
#include<util/setbaud.h>
#include<avr/interrupt.h>

unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}

Díky.

Nahlásit jako SPAM
IP: 90.181.44.–
15. 5. 2014   #9
-
0
-

Ukázka je bez použití přerušení. Používá utility z ASF. Délka dat a STOP bity se nastavují zápisem do příslušných registrů USART (controll registers), stejně tak i baudrate. Použití util/setbaud.h jen schovalo zápis do registrů pro nastavení baudrate. osobně tyto utility nepoužívám a nastavuji přímo registry.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
rudla
~ Anonymní uživatel
11 příspěvků
15. 5. 2014   #10
-
0
-

#9 hlucheucho
Našel jsem někde na internetu jakýsi USART_config(), pomůže mi to v něčem? :D

bool USART_Config(void)
{
  USART_InitTypeDef USART_InitStructure;
 
  /* set the Stop bit*/
  switch (linecoding.format) {
  case 0:
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    break;
  case 1:
    USART_InitStructure.USART_StopBits = USART_StopBits_1_5;
    break;
  case 2:
    USART_InitStructure.USART_StopBits = USART_StopBits_2;
    break;
  default :
    //      USART_Config_Default();
    return (FALSE);
  }
 
  /* set the parity bit*/
  switch (linecoding.paritytype) {
  case 0:
    USART_InitStructure.USART_Parity = USART_Parity_No;
    break;
  case 1:
    USART_InitStructure.USART_Parity = USART_Parity_Even;
    break;
  case 2:
    USART_InitStructure.USART_Parity = USART_Parity_Odd;
    break;
  default :
    return (FALSE);
  }
 
  /*set the data type : only 8bits and 9bits is supported */
  switch (linecoding.datatype) {
  case 0x07:
    /* With this configuration a parity (Even or Odd) should be set */
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    break;
  case 0x08:
    if (USART_InitStructure.USART_Parity == USART_Parity_No) {
      USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    } else {
      USART_InitStructure.USART_WordLength = USART_WordLength_9b;
    }
    break;
  default :
    return (FALSE);
  }


Díky.

Nahlásit jako SPAM
IP: 90.181.44.–
15. 5. 2014   #11
-
0
-

máš to skoro nachystaný v datasheetu na stránce 116. Akorát stačí upravit pro požadovaný počet STOP bitů a zadat správně baud - spočítáš podle vzorce na straně 113.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
rudla
~ Anonymní uživatel
11 příspěvků
15. 5. 2014   #12
-
0
-

#11 hlucheucho
A void USART_Init má být před unsigned char USART_Receive, že?

A ještě dotaz: u UCSRC = (1<<USBS)|(3<<UCSZ0); je napsané, že jsou nastaveny 2 STOP bity. Jak nastavit jen jeden?

Díky.

Nahlásit jako SPAM
IP: 90.181.44.–
rudla
~ Anonymní uživatel
11 příspěvků
15. 5. 2014   #13
-
0
-

Dobře, je toho víc, čemu nerozumím.
 

void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8); // TADY MÁ BÝT 19200?
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(0<<TXEN); // ZDE POKUD NECHCI VYSÍLÁNÍ, TAK 0?
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<USBS)|(3<<UCSZ0); // A TADY TEDA JEN (1<<USBS)??
}

Trochu mě to zmátlo. Díky.

Nahlásit jako SPAM
IP: 90.181.44.–
15. 5. 2014   #14
-
0
-

ono by to chtělo přečíst si a pochopit datasheet, který bit v registru má na co vliv.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
rudla
~ Anonymní uživatel
11 příspěvků
15. 5. 2014   #15
-
0
-

#14 hlucheucho
Kdybych aspoň došel k tomu "pochopit". Problém je v tom, že to musím mít dnes hotové. Jakš takš jsem zakomponoval výstup na LCD s obsahem UDR, ale dál prostě nevím. :(

Nahlásit jako SPAM
IP: 90.181.44.–
15. 5. 2014   #16
-
0
-

spočítám nastavení UBRR podle vzorce z tabulky na str 113: frekvence fosc je (nevím, co máte zadáno) 20MHz, BAUD je 19200. Pro normal mode vyjde 64,1. Zaokrouhlím na celé číslo, t.j. 64. Toto zapíšu do UBRR:

UBRRH = 0;
UBRRL = 64;

dále potřebuji mít nastavený paritu, délku slova a počet STOP. Povolím přijímač (bit RXEN v UCSRB), dále nastavím sudou (even) paritu (bit UPM1 nastavím, UPM0 ponechám 0), stop bity 2 (nastavím USBS) a délka slova 8 bitů (nastavit UCSZ1 a UCSZ0:

UCSRB |= 1<<RXEN;
UCSRC |= 1<<UPM1 | 1<<USBS | 1<<UCSZ1 | 1<<UCSZ0;

Příjem dat by takto byl řízen kontrolou příznaku. Pro řízení přerušením je ještě třeba povolit přerušení od příjmu - nastavit RXCIE bit v UCSRB a pak povolit přerušení globálně (asemblerovská instrukce sei, bylo na to nějaký makro).

Celkem tedy zápis do 4 registrů. Nedokázat nastudovat jednu kapitolu datasheetu za týden to je tragédie. Co že to "studuješ" za školu?

hu

Nahlásit jako SPAM
IP: 188.95.60.–
rudla
~ Anonymní uživatel
11 příspěvků
15. 5. 2014   #17
-
0
-

#16 hlucheucho
Za podrobné vysvětlení děkuju. Motám se stále v kruhu. Problém je v tom, že jsem neměl příležitost si kapitolu o USART přečíst podrobně, což samozřejmě nevysvětluje mou neschopnost. :D To přerušení jsem teda nastavil a na sei se hned jdu podívat - už jsme ho před časem řešili.

Tak snad velké díky, teoreticky by to aspoň trošku mohlo fungovat, ale skutečnost si ověřím až zítra, jelikož čip 2313 po ruce nemám. :)

Nahlásit jako SPAM
IP: 90.181.44.–
rudla
~ Anonymní uživatel
11 příspěvků
15. 5. 2014   #18
-
0
-

#16 hlucheucho

Pro normal mode vyjde 64,1. Zaokrouhlím na celé číslo, t.j. 64.


Pardon za rejp, ale ještě jsem si to celé prošel a všiml jsem si u výpočtu, že podle vzorce pro normal mode UBRR=[fosc÷(16BAUD)]-1 výjde UBRR 65,1 a ne 64,1. Teda aspoň mně, pokud počítám správně. :D

Nahlásit jako SPAM
IP: 90.181.44.–
15. 5. 2014   #19
-
0
-

ta -1 patří do výpočtu   . Při řízením přerušením je potřeba číst přijatý znak v obsluze přerušení. Je to funkce se specifickou "havičkou" viz vzorové projekty od Atmelu. 

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 72 hostů

Podobná vlákna

SYNASER COM USART — založil Tadeáš

USART-pomoc — založil simon

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý