ATmega16 - přijímá špatný znak přes sériovou linku, prosím o radu – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

ATmega16 - přijímá špatný znak přes sériovou linku, prosím o radu – Mikrokontroléry – Fórum – Programujte.comATmega16 - přijímá špatný znak přes sériovou linku, prosím o radu – Mikrokontroléry – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Beat
~ Anonymní uživatel
4 příspěvky
16. 3. 2009   #1
-
0
-

Dobrý den,

dle návodu na těchto stránkách http://programujte.com/index.php?akce=clanek&cl=2006112102-avr-%96-usart-ii jsem v C sestavil program pro komunikaci mezi PC a ATmega16 prostřednictvím sériové linky.

POPIS FUNKCE:
- mikrokontrolér očekává znak zaslaný z PC
- přijatý znak mikrokontrolér pošle zpět do PC



#include <mega16.h>
#include <stdio.h>

void main(void)
{
unsigned char k;

PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x07;
PORTD=0x00;
DDRD=0x00;

TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;

TIMSK=0x00;

UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;

ACSR=0x80;
SFIOR=0x00;

/*********************************/

k = 0xFF;


/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
k = getchar(); /* !!!!!!!! AVR VZDY PRIJME 0x00 !!!!!!!! */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */


putchar(k); /* AVR POSLE DO PC 0x00 */

}


Problém je v tom, že mikrokontrolér sice znak přijme, ale do proměnné k vloží vždy hodnotu 0x00, kterou poté pošle do PC.


Můžete mi prosím poradit, kde může být problém? (Hardware je na 100% funkční, tam chyba není - odzkoušeno)

Děkuji

Nahlásit jako SPAM
IP: 147.229.192.–
Reklama
Reklama
Atmegauset
~ Anonymní uživatel
1 příspěvek
16. 3. 2009   #2
-
0
-

daj si to do cyklu .



for(;;)
{
k = getchar();

putchar(k); /* AVR POSLE DO PC 0x00 */

}

Nahlásit jako SPAM
IP: 89.173.66.–
Beat
~ Anonymní uživatel
4 příspěvky
16. 3. 2009   #3
-
0
-

JENOM JEŠTĚ UPŘESNÍM:

k mikrokontroléru je připojen krystal 4MHz, je nastavena přenosová rychlost 19200bd, 8 Data, 1 Stop bit, bez parity.
Za nastavením registrů UCSRA, UCSRB, UCSRC, UBRRH, UBRRL si stojím (stejné nastavení generuje také CodeVision AVR).

Nahlásit jako SPAM
IP: 147.229.192.–
Beat
~ Anonymní uživatel
4 příspěvky
16. 3. 2009   #4
-
0
-

Atmegauset napsal:
daj si to do cyklu .


for(;;)
{
k = getchar();

putchar(k); /* AVR POSLE DO PC 0x00 */

}



Díky za tip, ale problém to neřeší

Nahlásit jako SPAM
IP: 147.229.192.–
KIIV+42
God of flame
16. 3. 2009   #5
-
0
-

co si to co prijme hodit na jeden z portu...
v zasade vzdy je pry problem v casovani musi byt pomerne presnej oscilator aby to sedlo..

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Beat
~ Anonymní uživatel
4 příspěvky
17. 3. 2009   #6
-
0
-

Když si k tomuto programu nechám od CodeVision AVR vygenerovat přerušovací rutinu k RxD (program nechám jinak stejný), tak to funguje bez problému.

S přerušením od RxD (generováno CodeVision AVR) to vypadá takto



#include <mega16.h>

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>


void main(void)
{
unsigned char k;

PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x07;
PORTD=0x00;
DDRD=0x00;

TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;

TIMSK=0x00;

UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;

ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")


k = 0xFF;


/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
k = getchar(); /* !!!!!!!! AVR VZDY PRIJME 0x00 !!!!!!!! */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */


putchar(k); /* AVR POSLE DO PC 0x00 */
}


Problém je, že to přerušení nepotřebuju, chtěl bych to udělat bez přerušení

Nahlásit jako SPAM
IP: 147.229.192.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
17. 3. 2009   #7
-
0
-

KIIV napsal:
co si to co prijme hodit na jeden z portu...
v zasade vzdy je pry problem v casovani musi byt pomerne presnej oscilator aby to sedlo..



Střídám různé krystaly, ale problém je pořád stejný, AVR stále přijímá vždy 0x00. V krystalu asi problém nebude

Nahlásit jako SPAM
IP: 147.229.192.–
KIIV+42
God of flame
17. 3. 2009   #8
-
0
-

a nastavujes taky spravne baudrate?
jak zjistujes co si prijal?

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

KIIV napsal:
a nastavujes taky spravne baudrate?
jak zjistujes co si prijal?



AVR komunikuje s PC, na kterém je spuštěný program COMTEST, na něm je nastaveno:
Baudrate: 19200
Parity: none
DataBits: 8
StopBits: 1
Handshaking: none

tedy vše přesně tak, jak je nastaveno i v AVR

Nahlásit jako SPAM
IP: 147.229.192.–
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ů

Podobná vlákna

Prosim o radu — založil takinoo

Prosím o radu — založil orei

Prosim o radu — založil

Prosím o radu — založil Michal

 

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