C-kod behöver er hjälp.... (WinAVR)
C-kod behöver er hjälp.... (WinAVR)
Skall initiera usarten på en atmega16, men får inte exempelkoden från atmel att funka, säkert något litet fel bara...
Min kod ser ut så här :
#include <avr/io.h>
#define FOSC 1000000 //clock
#define BAUD 4800 //baudrate
#define MYUBRR FOSC/16/BAUD-1
int main (void){
USART_init ( MYUBRR );
for (;;){
/*här kommer kod senare */
}
}
void USART_init (unsigned int ubrr){
/*set budrate*/
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/*Enable receiver and transmitter*/
UCSRB = ((1<<RXEN) | (1<<TXEN));
/*set frameformat : 8 databits 2 stop bits*/
UCSRC = (1<<USBS | 3<<UCSZ0);
}
När jag kompilerar så får jag att USART_init ät fel deklarerad, men jag tycker det ser rätt ut, någon som ser felet??
Min kod ser ut så här :
#include <avr/io.h>
#define FOSC 1000000 //clock
#define BAUD 4800 //baudrate
#define MYUBRR FOSC/16/BAUD-1
int main (void){
USART_init ( MYUBRR );
for (;;){
/*här kommer kod senare */
}
}
void USART_init (unsigned int ubrr){
/*set budrate*/
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/*Enable receiver and transmitter*/
UCSRB = ((1<<RXEN) | (1<<TXEN));
/*set frameformat : 8 databits 2 stop bits*/
UCSRC = (1<<USBS | 3<<UCSZ0);
}
När jag kompilerar så får jag att USART_init ät fel deklarerad, men jag tycker det ser rätt ut, någon som ser felet??
rent spontant skulle jag vilja ha det så här:
kolla om det funkar bättre....
är det något annat som strular kan du säkert hitta något matnyttigt här under uart.c, eller bara låna hela libben
http://hubbard.engr.scu.edu/embedded/av ... ource.html
http://hubbard.engr.scu.edu/embedded/av ... index.html
Kod: Markera allt
#include <avr/io.h>
#define FOSC 1000000 //clock
#define BAUD 4800 //baudrate
#define MYUBRR FOSC/16/BAUD-1
void USART_init (unsigned int)
int main (void){
for (;;){
/*här kommer kod senare */
}
}
void USART_init (unsigned int ubrr){
/*set budrate*/
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/*Enable receiver and transmitter*/
UCSRB = ((1<<RXEN) | (1<<TXEN));
/*set frameformat : 8 databits 2 stop bits*/
UCSRC = (1<<USBS | 3<<UCSZ0);
}
är det något annat som strular kan du säkert hitta något matnyttigt här under uart.c, eller bara låna hela libben

http://hubbard.engr.scu.edu/embedded/av ... ource.html
http://hubbard.engr.scu.edu/embedded/av ... index.html
OK, tack för tipsen. Men nu har jag ett nytt problem.... jag vill att min avr skall eka tillbaka det jag skickar till den från realterm, men det funkar inte.
Jag har testat fram till avren och det funkar ända fram dit, men min kod verkar inte funka :( .
Ser ni något fel?
#include <avr/io.h>
#define FOSC 1000000 //clock
#define BAUD 4800 //baudrate
#define MYUBRR FOSC/16/BAUD-1
void USART_init (unsigned int);
unsigned char ReceiveByte( void );
void TransmitByte( unsigned char data );
int main (void){
USART_init (MYUBRR);
for (;;){
TransmitByte( ReceiveByte() ); /* Echo the received character */
}
}
void USART_init (unsigned int ubrr){
/*set budrate*/
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/*Enable receiver and transmitter*/
UCSRB = ((1<<RXEN) | (1<<TXEN));
/*set frameformat : 8 databits 2 stop bits*/
UCSRC = (1<<USBS | 3<<UCSZ0);
}
/* Read and write functions */
unsigned char ReceiveByte( void )
{
while ( !(UCSRA & (1<<RXC)) ) /* Wait for incomming data */
; /* Return the data */
return UDR;
}
void TransmitByte( unsigned char data )
{
while ( !(UCSRA & (1<<UDRE)) )
; /* Wait for empty transmit buffer */
UDR = data; /* Start transmittion */
}
EDIT: la in rätt kod
Jag har testat fram till avren och det funkar ända fram dit, men min kod verkar inte funka :( .
Ser ni något fel?
#include <avr/io.h>
#define FOSC 1000000 //clock
#define BAUD 4800 //baudrate
#define MYUBRR FOSC/16/BAUD-1
void USART_init (unsigned int);
unsigned char ReceiveByte( void );
void TransmitByte( unsigned char data );
int main (void){
USART_init (MYUBRR);
for (;;){
TransmitByte( ReceiveByte() ); /* Echo the received character */
}
}
void USART_init (unsigned int ubrr){
/*set budrate*/
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/*Enable receiver and transmitter*/
UCSRB = ((1<<RXEN) | (1<<TXEN));
/*set frameformat : 8 databits 2 stop bits*/
UCSRC = (1<<USBS | 3<<UCSZ0);
}
/* Read and write functions */
unsigned char ReceiveByte( void )
{
while ( !(UCSRA & (1<<RXC)) ) /* Wait for incomming data */
; /* Return the data */
return UDR;
}
void TransmitByte( unsigned char data )
{
while ( !(UCSRA & (1<<UDRE)) )
; /* Wait for empty transmit buffer */
UDR = data; /* Start transmittion */
}
EDIT: la in rätt kod
Senast redigerad av björn 21 juli 2005, 12:46:54, redigerad totalt 1 gång.
Smaken är ju som baken, som tur är. 
Men jag tror anledningen till att deklarationer uppkommit är för att förenkla för kompilatorn, inte underlätta för programmeraren. Men som sagt, jag har heller ingen referens.
Sedan beror det nog en hel del på vilket IDE/vilken editor man använder. Jag kör mest emacs, och använder man då etags-funktionerna så underlättar det väldigt när den först anropade funktionen är längst ner. Då får man också en form av hierarki på koden.
Ibland kommer man dock inte undan att bara "anropa uppåt", men då slänger jag in en deklaration raden ovanför funktionen som anropar.
Nästan alla stora OpenSource-projekt jag fördjupat mig i använder även den här kodstilen (Linux, Asterisk, ...). Men övervägande utvecklare kör ju emacs, så därav säkert anledningen.
Mvh
speakman

Men jag tror anledningen till att deklarationer uppkommit är för att förenkla för kompilatorn, inte underlätta för programmeraren. Men som sagt, jag har heller ingen referens.
Sedan beror det nog en hel del på vilket IDE/vilken editor man använder. Jag kör mest emacs, och använder man då etags-funktionerna så underlättar det väldigt när den först anropade funktionen är längst ner. Då får man också en form av hierarki på koden.

Ibland kommer man dock inte undan att bara "anropa uppåt", men då slänger jag in en deklaration raden ovanför funktionen som anropar.
Nästan alla stora OpenSource-projekt jag fördjupat mig i använder även den här kodstilen (Linux, Asterisk, ...). Men övervägande utvecklare kör ju emacs, så därav säkert anledningen.

Mvh
speakman
jag har kollat lite på den men den är uppbyggd med så mycket mer än det jag behöver, vill helst lära mig det från grunden.
Jag har nu testat att skicka tecken från avr till dator, kretsen skickar något men det enda som visas är nollor.
Vet inte om det är RealTerm som jag inte förstår eller om det är i koden
Jag har ställt in realterm på 8 bitar och 2 stoppbitar, precis som avren och baudrate på 4800, vad kan mer vara fel?
Jag har nu testat att skicka tecken från avr till dator, kretsen skickar något men det enda som visas är nollor.
Vet inte om det är RealTerm som jag inte förstår eller om det är i koden

Jag har ställt in realterm på 8 bitar och 2 stoppbitar, precis som avren och baudrate på 4800, vad kan mer vara fel?
Jag har använt mig av detta terminalprogram när jag kört med avr:
www.filofaxen.se/term20041226.rar
Går ju att visa binärt också, kanske enklare att se om det överförs korrekt då?
Hur har du kopplat förresten?
www.filofaxen.se/term20041226.rar
Går ju att visa binärt också, kanske enklare att se om det överförs korrekt då?
Hur har du kopplat förresten?
För att testa att allting förutom AVR'n fungerar lyftar du såklart pinnerna från MAX232'an till AVR'n och lägger ihop dom på MAX'en. Därmed får du en hel kedja där RS232 signalen skiftas ner till 5V nivå och sedan skiftas upp igen och retuneras, då ska du få ditt eko. Om du inte får det har du ett fel med MAX'en.