Anonymní profil Anonymní uživatel – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Anonymní uživatel – Programujte.comAnonymní profil Anonymní uživatel – Programujte.com

 

Příspěvky odeslané z IP adresy 147.229.192.–

Anonymní uživatel
Mikrokontroléry › ATmega16 - přijímá špatný zn…
17. 3. 2009   #97514

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

Anonymní uživatel
Mikrokontroléry › ATmega16 - přijímá špatný zn…
17. 3. 2009   #97506

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

Beat
Mikrokontroléry › ATmega16 - přijímá špatný zn…
17. 3. 2009   #97468

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í

Beat
Mikrokontroléry › ATmega16 - přijímá špatný zn…
16. 3. 2009   #97457

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ší

Beat
Mikrokontroléry › ATmega16 - přijímá špatný zn…
16. 3. 2009   #97456

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).

Beat
Mikrokontroléry › ATmega16 - přijímá špatný zn…
16. 3. 2009   #97441

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

Delphi › Výstup z media přehrávačů
16. 1. 2008   #62763

Potřeboval bych do svého programu nějak dostat informace o aktuální skladbě, která hraje ve WindowsMediaPlaxeru, nebo jiného přehrávače - Winamp, Sonique, ... Nemusely by to být přímo konkrétní infor. (autor, album,. ..) jen název souboru, který se přehrává.

Prosím má s něčím podobnýmn někdo zkušenosti ? díky Lodhart

C / C++ › Návratové hodnoty f-ce
6. 11. 2007   #53962

hura - mám, sice jsem musel přidat par parametrů do funkce ale jde to - jednodušší by byly globální proměnné, ale ty jsou mi zakázané...

díky ;-)

C / C++ › Návratové hodnoty f-ce
6. 11. 2007   #53948

jo takže pokud to chápu dobře, předám f-ci jen ukazatel na proměnnou kterou mám třeba definovanou v main a pak pouze zapisuju přes "odkaz" toho ukazatele !

C / C++ › Návratové hodnoty f-ce
6. 11. 2007   #53943

ahoj, potřeboval bych vědět jetli je možné aby f-ce vrátila třeba dvě hodnoty jako:

return(a,b);

protože to překládač bez problému vezme- pokud to vůbec je možné chtěl bych vědět jak napsat volání zakové f-ce aby mi vrátila hodnoty do dvou proměnných.

Diky

 

 

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