USART atmega88, nybörjare

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Samuel84
Inlägg: 17
Blev medlem: 23 maj 2010, 22:12:15

USART atmega88, nybörjare

Inlägg av Samuel84 »

Sitter och försöker upprätta en seriell koppling mellan pcn och min atmega88. Jag använder AVR-studio4 och skriver i C (gcc). Mjukvaran för att kommunicera med microprocessorn som finns på datorn är docklight. Jag har försökt med ett gäng exempelkoder, men ingen vill fungera. Någon som har förslag på enklast möjliga kod för att skriva ut ett tecken, eller en loop med ett tecken, typ

Kod: Markera allt

while(1){printf("hej");}
från atmegan till pcn? Hur ska jag tänka?

Mvh
Samuel
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: USART atmega88, nybörjare

Inlägg av PHermansson »

Gjorde ett litet projekt med ATTiny2313, AVR-GCC, UART och och V-USB häromdan, ganska enkel kod som kanske kan vara till nytta?

Kod: Markera allt

/* Name: main.c
A USB-connected 2313 that spits out messages on it's USART (pin 2 & 3). This can be connected to a PC via 
a MAX232 (or similar) and read by Hyperterminal (or similar).

AVR USART Tutorial:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=45341

AVR Calculator:
http://www.b9.com/elect/avr/kavrcalc/

Example, 2313 and USART:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=74615&start=0

The hardware has two leds, red and green, connected to PB3 and PB4

Patrik Hermansson 2010
*/

#include "usbdrv.h"
#include "oddebug.h"

#include <avr/eeprom.h>	//Eeprom read
#include <avr/io.h> 
#include <avr/wdt.h>
#include <avr/interrupt.h>	//sei()
#include <avr/pgmspace.h>
#include <util/delay.h>		//_delay_ms
#include <stdlib.h>
#include <string.h> 

#define UTIL_BIN4(x)        (uchar)((0##x & 01000)/64 + (0##x & 0100)/16 + (0##x & 010)/4 + (0##x & 1))
#define UTIL_BIN8(hi, lo)   (uchar)(UTIL_BIN4(hi) * 16 + UTIL_BIN4(lo))

#define END 0x0d 
#define REQUEST_MESS_1 0
#define REQUEST_MESS_2 1

#define redled PB3
#define greenled PB4

/* Prototypes */ 
void SendString(char str[], int endline); 
void TransmitByte (unsigned char data); 

/* ------------------------------------------------------------------------- */

/* Function that runs when data is requested from host */

uchar	usbFunctionSetup(uchar data[8])
{
	usbRequest_t *request= (usbRequest_t*) data;
	switch (request->bRequest) {
		
	case REQUEST_MESS_1:
		PORTB &= ~_BV(redled);	//Led off
		SendString("USB message recevied (0)", 1); 
		return 1; // we want to send the requested data
		
	case REQUEST_MESS_2 :
		PORTB &= ~_BV(greenled); //Led off
		SendString("USB message recevied (1)", 1); 			
		return 0;
	}
	
	return 0;
}

void SendString(char str[], int endline)
{
	int i;
	for(i = 0; i < strlen(str); i++)
	{
		TransmitByte(str[i]);
	}
	if(endline)
		TransmitByte(END);
} 

void TransmitByte (unsigned char data)
{
  /* Wait for empty transmit buffer */
  while (!(UCSRA & (1 << UDRE)));

  /* Start transmittion */
  UDR = data;
} 


/* Main */
uchar main(void)
{
	// Usart
	// http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=74615&start=0
	/* Set baud rate */
	UBRRL = 78; 
	
	/* Enable receiver and transmitter */
	UCSRB = (1<<RXEN)|(1<<TXEN);
	
	/* set to 8 data bits, 1 stop bit */
	UCSRC = (1 << UCSZ1) | (1 << UCSZ0); 
	
	SendString("Hello!", 1); 
	
	/* Usart setup end */
	
	sei();			// enable interrupts
	
	for(;;){   			/* main event loop */
		usbPoll();		//USB communication
	}
	return 0;
}
Klippte bort delar usb-koden för tydligehetens skull, hela projektet finns på http://patrikhermansson.se/?q=node/420
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: USART atmega88, nybörjare

Inlägg av sodjan »

Det där är väl en loop med tre tecken !?

Sen så, som du säger, så finns det antagligen massor av exempelkoder för
just USART kommunikation. Istället för att fråga efter ytterligare en så kanske
det är effektivare om du visar en som du har testat och beskriver varför
det inte fungerar (d.v.s vad som händer istället för att det "fungerar").

En annan väldigt viktig sak för att förstå det hela är hurvida detta
är det absolut första du gör med en AVR eller om du är en van
AVR programmerare som bara har problem med just detta ?

Slutligen, om detta är din första kontakt med USART modulen så kan det
ibland vara bättre för förståelsen av modulen att börja med en kort
assembler testkod. Då får man/du mer närkontakt med hårdvaran så att säga.
När det fungerar så blir det sannaolikt enklare att sedan göra samma sak i C.
Av samma orsak så kan det vara bra att undvika sådan som printf till att
börja med (och kanske inte bara till att börja med...).
Samuel84
Inlägg: 17
Blev medlem: 23 maj 2010, 22:12:15

Re: USART atmega88, nybörjare

Inlägg av Samuel84 »

Tack ska ni ha! Ska kolla på koden imorgon. Det är min första kontakt med USART, men har hållit på lite med avr-programering tidigare, så det är inte det första jag gör(men nästan :p). Fick just kontakt mellan microkontrollen och docklight, men resultatet var inte det jag väntade mig. Vidare har jag bara lyckats skicka dator=> microkontrollen och inte tvärt om. Mistänker att baudraten måste optimeras och att det är detta som gör att jag får konstigt resultat.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: USART atmega88, nybörjare

Inlägg av sodjan »

> ...Mistänker att baudraten måste optimeras...

Hm, det finns väl instruktioner i USART kapitlet dels hur du räknar ut den
och dels vilket fel som du får med aktuell klockfrekvens o.s.v.
Kör de med intern osc eller med extern kristall ?

> Fick just kontakt mellan microkontrollen och docklight...

Vad betyder att du "fick kontakt" mer exakt ?

> ... men resultatet var inte det jag väntade mig.

Vilket resultat fick du och vad hade du förväntat dig ?

> ...som gör att jag får konstigt resultat.

Och exakt *VAD* betyder "konstigt resultat" ??

Är det någon speciell anledning till att du beskriver det
hela på ett sätt som inte går att förstå ?
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: USART atmega88, nybörjare

Inlägg av PHermansson »

Samuel84 skrev: Mistänker att baudraten måste optimeras och att det är detta som gör att jag får konstigt resultat.
Kolla AVR Calculator (http://www.b9.com/elect/avr/kavrcalc/), den hjälper till med det där. Min kod är för 12MHz kristall & 9600bps för övrigt.
Samuel84
Inlägg: 17
Blev medlem: 23 maj 2010, 22:12:15

Re: USART atmega88, nybörjare

Inlägg av Samuel84 »

Tack för hjälpen!
Sodjan: Vad jag än skriver i programmet, så är det enda jag får in på docklight 0x80.

Kod: Markera allt

void InitUART( unsigned int baud )
	{
	UBRR0H = (unsigned char)(baud>>8);
	UBRR0L = (unsigned char)baud;				//set the baud rate 
	UCSR0B = _BV(RXEN0) | _BV(TXEN0);	//enable UART receiver and transmitter 
	}
void TransmitByte( unsigned char data )
	{
	loop_until_bit_is_set(UCSR0A,UDRE0);	// wait for empty transmit buffer 
	UDR0 = data; 				
        }

while(1) 
 { 
  TransmitByte(0x50);
  } 
Jag har testat allt som inargument på TransmitByte(). Har även testat med ex.

Kod: Markera allt

char teck= A; 
TransmitByte(teck);
osv
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: USART atmega88, nybörjare

Inlägg av sodjan »

> char teck= A;

Vad ger det där för värde i teck ? "0A" i hex ?
Vad vill du ha ? Ska det inte vara char teck= "A"; om du
vill ha tecknet "A" (eller char teck= 0x41 eller char teck= 65;).


Baudrate fel ? Kan du skicka OK i andra riktningen ?
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: USART atmega88, nybörjare

Inlägg av PHermansson »

Hur och var anropar du InitUART? Vilken klockfrekvens använder du?
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Re: USART atmega88, nybörjare

Inlägg av thepirateboy »

Det finns UART-exempel i databladet som är enkla att förstå och funkar bra.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: USART atmega88, nybörjare

Inlägg av jesse »

jag ställer samma fråga som PHermanson och vilket värde får "baud"?
Du gör en beräkning här, enligt databladet:

Kod: Markera allt

#define F_OSC 8000000 // CPU frekvens
#define BAUDRATE 9600 // önskad baudrate
#define BAUD F_OSC/(16*BAUDRATE)-1 // beräkna värde

InitUART(BAUD); // initiera UART
Samuel84
Inlägg: 17
Blev medlem: 23 maj 2010, 22:12:15

Re: USART atmega88, nybörjare

Inlägg av Samuel84 »

Tack för alla svar. Lika bra att posta min tråd i sin helhet:

Kod: Markera allt

#include <util/delay.h>
#include <stdio.h>
#include <avr/io.h> 
#define	SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define	CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))


/* initialize UART */
void InitUART( unsigned int baud )
	{
	UBRR0H = (unsigned char)(baud>>8);
	UBRR0L = (unsigned char)baud;				//set the baud rate 
	UCSR0B = _BV(RXEN0) | _BV(TXEN0);	//enable UART receiver and transmitter 
	}

/* Read and write functions */
unsigned char ReceiveByte( void )
	{
	loop_until_bit_is_set(UCSR0A,RXC0);		// wait for incomming data 
	return UDR0;							// return the data 
	}

void TransmitByte( unsigned char data )
	{
	loop_until_bit_is_set(UCSR0A,UDRE0);	// wait for empty transmit buffer 
	UDR0 = data; 						// start transmittion 
	}


int main()  { 
 	
	InitUART(51);			// 9600 Baud, 8 Mhz
	unsigned int	ch;

 	while(1) { 
		ch=0b00011111;
			TransmitByte(ch);
		
			
	} 
 } 
Det jag vill är alltså att se det tal som ch har i docklight, som alltså skickas från microcontrollen. Får bara en massa nonsense i form av 0b00000000 och 0b10000000, alltså 0x00 och 0x80 om vartannat. Jag tror baudratesen är rätt inställt osv. Tack för alla svar hittills.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: USART atmega88, nybörjare

Inlägg av sodjan »

I InitUART() ser det ut som att du enbart bryr dig
om baudrate. Alla andra inställningar då ??
Samuel84
Inlägg: 17
Blev medlem: 23 maj 2010, 22:12:15

Re: USART atmega88, nybörjare

Inlägg av Samuel84 »

Har du ngt förslag på vilka fler inställningar man behöver och som är lämpliga? Var kan man läsa om dessa inställningar?
När jag t.ex. lägger till detta i initfunktionen:

Kod: Markera allt

UCSRC = (1 << UCSZ1) | (1 << UCSZ0);
får jag felmeddelandet:
../LAB6.c:23: error: 'UCSRC' undeclared (first use in this function)
../LAB6.c:23: error: (Each undeclared identifier is reported only once
../LAB6.c:23: error: for each function it appears in.)
../LAB6.c:23: error: 'UCSZ1' undeclared (first use in this function)
../LAB6.c:23: error: 'UCSZ0' undeclared (first use in this function)
Någon som vet varför?
Även U2Xn=0; fattar den inte.
haslish
Inlägg: 132
Blev medlem: 15 februari 2006, 18:47:34
Ort: Huskvarna

Re: USART atmega88, nybörjare

Inlägg av haslish »

abcminiuser har skrivit två bra tutorials om USART på AVRfreaks hemsida:
Using the USART with AVR-GCC
Interrupt driven USARTs
Skriv svar