Komunikace pres UART ATmega8 – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Komunikace pres UART ATmega8 – Mikrokontroléry – Fórum – Programujte.comKomunikace pres UART ATmega8 – Mikrokontroléry – Fórum – Programujte.com

 

b3ch
~ Anonymní uživatel
5 příspěvků
29. 5. 2009   #1
-
0
-

Zdravim, poradil by mi někdo jestli je v následujícím kódu chyba, nebo je někde po ceste do PC, či v nastavení hyperterminálu? Nedaří se mi přijmout znak...
Hyperterminál nastavuji rychlost 9600, 8 bitů dat, 1 stop bit, bez parity, řízení toku žádné, díky.



#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#include <stdio.h>

int main(void) {

char znak;
/***** inicializace uart *****/
UCSRA|=0x00;
UBRRH|=0x00; // nastaveni rychlosti pro krystal 8MHz
UBRRL|=0x33;
UCSRB|=0x18; // povolit vysilani a prijem
UCSRC|=0x86; // ramec dat: 8 datovych, 1 stop bit, bez parity

while(1) {
znak=getchar();
putchar(znak);
};
}

Nahlásit jako SPAM
IP: 90.176.230.–
KIIV
~ Moderátor
+43
God of flame
29. 5. 2009   #2
-
0
-

pokud to ma stejny registry jako mega8 tak sis nastavil synchronni usart... a predpokladam ze budes chtit spise asynchronni

pokud je to mega16 tak to vypada spravne

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
b3ch
~ Anonymní uživatel
5 příspěvků
30. 5. 2009   #3
-
0
-

Dík za odpověď, ale mohl by jsi to upřesnit?
Podle datasheetu se asynch/synch nastavuje bitem UMSEL registru UCSRC a ten mam v nule, takže by to mělo být ok..
Navíc když si prohlížim datasheety megy8 a megy16 tak rozdíly v registrech USARTu nevidim

Nahlásit jako SPAM
IP: 90.176.230.–
KIIV
~ Moderátor
+43
God of flame
30. 5. 2009   #4
-
0
-

moment jeste mrknu jestli sem se nepreklik a nemel sem megu88
jo tak sem mel 88 ta ma trochu odlisny registry ... takze to mas zda se spravne...

jeste mrkni jestli neni potreba nastavit Tx jako vystup a Rx jako vstup ..
zkontroluj jestli to bezi opravdu z krystalu (interni RC nema dostatecnou presnost)
a nevim co jeste by se mohlo ...
urcite tam mas nejakej prevodnik jako sou treba max232...

zkus cvicne posilat jeden bajt dejme tomu po sekunde jestli to komp prijme spravne nebo nejak spatne

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
b3ch
~ Anonymní uživatel
5 příspěvků
30. 5. 2009   #5
-
0
-

Tx a Rx by mělo být ok, po inicializaci Tx nahodí log 1
ve fuses mam jako zdroj hodin nastavenej krystal a jsem si jistej že to z něj běží
mam tam MAX3232, protože mam napájení 3,3V, když mu přivedu log 1 na Tin tak na Tout je -12V, takže to je snad taky ok
dam periodicky třeba putchar('c'); tak na hyperterminálu ani ťuk. Nemůže bejt chyba někde v hyperterminálu?

Nahlásit jako SPAM
IP: 90.176.230.–
b3ch
~ Anonymní uživatel
5 příspěvků
30. 5. 2009   #6
-
0
-

Další poznatek: když odpojím svoje zařízení a na MAXovi propojim Tin s Rout, tak se znak vrací v pohodě, takže chyba je někde v softwaru či zařízení...

Nahlásit jako SPAM
IP: 90.176.230.–
AB
~ Anonymní uživatel
41 příspěvků
1. 6. 2009   #7
-
0
-

Funkce getchar() a putchar() nejdou použít bez předchozího přesměrování.
Jednodušší je tady použít vlastní funkce pro UART.

#include <avr/io.h>


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


// send char

void uart_putc(unsigned char data )
{
while ( !( UCSRA & (1<<UDRE)) )
;
UDR = data;
}


int main(void)
{
char znak;

/***** inicializace uart *****/
UCSRA = 0x00;
UBRRH = 0x00; // nastaveni rychlosti pro krystal 8MHz
UBRRL = 0x33;
UCSRB = 0x18; // povolit vysilani a prijem
UCSRC = 0x86; // ramec dat: 8 datovych, 1 stop bit, bez parity

while(1)
{
znak=uart_getc();
uart_putc(znak);
}
}

Nahlásit jako SPAM
IP: 217.115.249.–
b3ch
~ Anonymní uživatel
5 příspěvků
1. 6. 2009   #8
-
0
-

Díky, už to funguje, ale nevědil bys jak na funci puts?

Nahlásit jako SPAM
IP: 147.228.181.–
KIIV
~ Moderátor
+43
God of flame
1. 6. 2009   #9
-
0
-

To b3ch : projedes retezec budes postupne posilat dokud nenarazis na znak '\0'

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
AB
~ Anonymní uživatel
41 příspěvků
1. 6. 2009   #10
-
0
-

void uart_puts (char *s) 

{
while (*s)
uart_putc(*(s++));
}

Nahlásit jako SPAM
IP: 217.115.249.–
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, 6 hostů

 

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