Problém USART a ATmega644PA

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
Smolák Martin
Stály člen
Stály člen
Príspevky: 272
Dátum registrácie: 11 Sep 2007, 00:00
Bydlisko: Jaroměř
Vek: 29

Problém USART a ATmega644PA

Príspevok od používateľa Smolák Martin » 17 Okt 2012, 08:52

uart.c

Kód: Vybrať všetko

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <string.h>
#include "uart.h"

void USART_Init( unsigned int baud )
{
//nastavení rychlosti baud
UBRR1H = (unsigned char)(baud>>8);
UBRR1L = (unsigned char)baud;
//povolení TxD a RxD
UCSR1B = (1<<RXEN1)|(1<<TXEN1);
//nastavení formátu 8bit, 2 stop bit
UCSR1C = (1<<USBS1)|(3<<UCSZ10);
}

void USART_TxD_char( unsigned char data )
{
//čekání na vyprázdnění buferu
while ( !( UCSR1A & (1<<UDRE1)) )
;
//Vloží data do vyrovnávací paměti, a odešle je
UDR1 = data;
}

void USART_TxD_int( unsigned int data )
{
//čekání na vyprázdnění buferu
while ( !( UCSR1A & (1<<UDRE1)));
//Zkopíruje 9. bit do TXB81
UCSR1B &= ~(1<<TXB81);
if ( data & 0x0100 )
UCSR1B |= (1<<TXB81);
//Vloží data do vyrovnávací paměti, a odešle je
UDR1 = data;
}

unsigned char USART_RxD_char( void )
{
//Čeká na data, které mají být přijaty
while ( !(UCSR1A & (1<<RXC1)) )
;
//Získá a vrátí přijatá data z vyrovnávací paměti
return UDR1;
}

unsigned int USART_RxD_int( void )
{
unsigned char status, r1, r2;
//Čeká na data, které mají být přijaty
while ( !(UCSR1A & (1<<RXC1)) )
;

status = UCSR1A;
r1 = UCSR1B;
r2 = UDR1;
//pokud je chyba, vrátí -1
if ( status & (1<<FE1)|(1<<DOR1)|(1<<UPE1) )
return -1;

r1 = (r1 >> 1) & 0x01;
return ((r1 << 8) | r2);
}

void USART_Flush( void )
{
unsigned char r3;
while ( UCSR1A & (1<<RXC1) ) r3 = UDR1;
}

uart.h

Kód: Vybrať všetko

#include <avr/io.h>
#ifndef UART_H
#define UART_H


void USART_Init( unsigned int baud );
void USART_TxD_char( unsigned char data );
void USART_TxD_int( unsigned int data );
unsigned char USART_RxD_char( void );
unsigned int USART_RxD_int( void );
void USART_Flush( void );


#endif // UART_H 

main.c

Kód: Vybrať všetko

/*
 #include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include "uart.h"


#ifndef F_CPU
#define F_CPU 16000000UL
#endif

SIGNAL(TIMER1_CAPT_vect)
{
	
}

int main(void)
{	
	USART_Init(9600);	
	//vstupní pin - input capture
	DDRD &= ~(1 << PORTD6);						//pin PD6 is input
    PORTD |= (1 << PORTD6);					    //pull-up resistor (off) on
	
	//timer/counter1
	TCCR1B |= (1 << ICNC1) | (1 << ICES1);		//ICNC1 - IC noise cancer, ICES1 - input edge select HIGH
	/*TIFR1 |= (1 << ICF1);*/
	TIMSK1 |= (1 << ICIE1);						//povolení přerušení od ICP1
	sei();
	
    while(1)
    {
		USART_TxD_char("ICR1");
        USART_TxD_int(ICR1);
		_delay_ms(50);
    }
}






nevíte kde mám problém?
Děkuji
0
Martin Smolák

Ivan_Ryger
Pokročilý člen
Pokročilý člen
Príspevky: 574
Dátum registrácie: 01 Apr 2008, 00:00
Bydlisko: Bratislava, Petržalka

Re: Problém USART a ATmega644PA

Príspevok od používateľa Ivan_Ryger » 17 Okt 2012, 09:15

a ako sa prejavuje tá chyba?
Toto sa nerobí, že sa hodí kus kódu a hľadaj...
Čo to má robiť a čo to nerobí?
0

Používateľov profilový obrázok
Smolák Martin
Stály člen
Stály člen
Príspevky: 272
Dátum registrácie: 11 Sep 2007, 00:00
Bydlisko: Jaroměř
Vek: 29

Re: Problém USART a ATmega644PA

Príspevok od používateľa Smolák Martin » 17 Okt 2012, 09:25

Ivan_Ryger napísal:a ako sa prejavuje tá chyba?
Toto sa nerobí, že sa hodí kus kódu a hľadaj...
Čo to má robiť a čo to nerobí?

Má to posílat a přijímat data přes usart. V kompilátoru mi to chybu nehodí, ale po nahrátí do megy644 program nefunguje. Zkoušel jsem např. odeslat číslo nebo znaky, ale program nefunguje. Jinak potřebuju odeslat do počitače obsah registru ICR1.
0
Martin Smolák

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: Problém USART a ATmega644PA

Príspevok od používateľa jaromir » 17 Okt 2012, 10:10

Do UBBR davas priamo cislo, zodpovedajuce baudovej rychlosti. To je zle, pozri si v datasheete vypocet cisla, ktore tam patri.

Okrem toho, nezaskodilo by trochu proaktivity z tvojej strany. Nauc sa strukturovat svoju pracu a debuggovat, aspon tak jednoducho s LEDkou. Napis si najprv program, ktory vypise jeden znak, potom tam pridavaj dajsei veci. Pripoj si na MCU par LEDiek a zapinaj/vypinaj ich ked sa stane neico dolezite, tak aspon trochu vies kde sa v programe nachadzas. Bez toho proste nahras velky program a bum - nic nejde. Takyto styl programovania si mozu dovolit iba ozajstni profici, ktori presne vedia co robia, lebo to tak robia uz roky.
0

Používateľov profilový obrázok
Smolák Martin
Stály člen
Stály člen
Príspevky: 272
Dátum registrácie: 11 Sep 2007, 00:00
Bydlisko: Jaroměř
Vek: 29

Re: Problém USART a ATmega644PA

Príspevok od používateľa Smolák Martin » 17 Okt 2012, 11:28

V Atmel Studiu (dále AS) mi nešlo použít USART, tak jsem dal USART1, což v datascheetu není, ale AS to jde. Nebo mám použít USART0? Nevím jaký je mezi tím rozdíl.


Z datascheetu:
The ATmega644 has one USART, USART0.
The functionality is described below, most register and bit references in this section are written in
general form. A lower case “n” replaces the USART number.
The Universal Synchronous and Asynchronous serial Receiver and Transmitter (USART) is a
highly flexible serial communication device.
A simplified block diagram of the USART Transmitter is shown in Figure 17-1 on page 165. CPU
accessible I/O Registers and I/O pins are shown in bold.
The Power Reducion USART0 bit, PRUSART0, in ”PRR – Power Reduction Register” on page
44 must be disabled by writing a logical zero to it.
0
Martin Smolák

dan21
Ultimate člen
Ultimate člen
Príspevky: 3016
Dátum registrácie: 11 Apr 2007, 00:00
Bydlisko: ZA

Re: Problém USART a ATmega644PA

Príspevok od používateľa dan21 » 17 Okt 2012, 11:44

ako povedal jaromir, pozri tabulku pre UBRR. V datasheete na strane 187 tabulka 17-9. Podla frekvencie oscilatora a Baud rate vyber konstantu
0

Používateľov profilový obrázok
Smolák Martin
Stály člen
Stály člen
Príspevky: 272
Dátum registrácie: 11 Sep 2007, 00:00
Bydlisko: Jaroměř
Vek: 29

Re: Problém USART a ATmega644PA

Príspevok od používateľa Smolák Martin » 17 Okt 2012, 15:44

Myslíš něco takového?

Kód: Vybrať všetko

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

//normal mod = 1, duble = 2;
void USART_Init( unsigned int baud, unsigned int normalordublemode )
{
	//nastavení rychlosti baud
	if(normalordublemode == 2)
		{
			//nastavení dvojnásobné rychlosti	
			UCSR1A |= (1 << U2X1);			
			UBRR1 = F_CPU/(8*baud)-1;
		}else if(normalordublemode == 1)
		{
			UCSR1A &= ~(1 << U2X1);
			UBRR1 = F_CPU/(16*baud)-1;
		}
// UBRR1H = (unsigned char)(baud>>8);
// UBRR1L = (unsigned char)baud;
//povolení TxD a RxD
UCSR1B = (1<<RXEN1)|(1<<TXEN1);
//nastavení formátu 8bit, 2 stop bit
UCSR1C = (1<<USBS1)|(3<<UCSZ10);
}
0
Martin Smolák

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok