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
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...).
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 ). 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.
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å ?
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 ?
#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.
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:
../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.