I have a atmega2560 with the stk500 w/ 503 adapter.
I'm trying to get something to work.
I've produced a simple program - one that reads the
switches and lights the opposite LED (i.e pressing
switch 7 lights LED 0, pressing switch 7 lights LED 1,
etc) . It also prints out the switch number that was
pressed.
I developed the original program on an atmega128. It
appears to work fine on that target. I realize that
just because a program runs - doesn't mean it is
correct - I could have errors in my code.
For the atmega2560, I compiled the program for the
atmega128, but replaced the iom128.h file with one for
the atmega1280. I avoided passing parameters on the
stack - in fact I only call a single procedure - the
one to transmit a byte to the uart. My transmit
routine polls - I use no interrupts - so I should not
have to worry about having an incorrect interrupt
vector table.
My code appears to run. The LEDs light when the
switches are pressed. I get output from the UART -
but it is garbage characters (periods as viewed from a
minicom window). I don't think I have a problem with
the baudrate calculation verses the fuse bits
settings. I have fusebits set up use an external
clock and use the clock on the stk500 (same as I do
with the atmega128).
Can anyone point out what I am doing wrong?
Any suggestions and wisdom will be appreciated. My
goal is to eventually get a working setup with an
atmega2560 using gcc and avrlibc. I am taking baby
steps.
dave
#ifndef UCSZ0
#define UCSZ0 UCSZ00
#define RXC RXC0
#define UDRE UDRE0
#endif
#include <avr/io.h> // I/O definitions (port
names, pin names, etc)
#ifndef BV
#define BV(bit) (1<<(bit))
#endif
#ifndef cbi
#define cbi(reg,bit) reg &= ~(BV(bit))
#endif
#ifndef sbi
#define sbi(reg,bit) reg |= (BV(bit))
#endif
typedef unsigned long u32;
typedef unsigned char u08;
// CPU clock speed
//#define F_CPU 16000000 //
16MHz processor
//#define F_CPU 14745000 //
14.745MHz processor
//#define F_CPU 8000000 // 8MHz
processor
//#define F_CPU 7372800 //
7.37MHz processor
//#define F_CPU 4000000 // 4MHz
processor
#define F_CPU 3686400 //
3.69MHz processor
#define CYCLES_PER_US ((F_CPU+500000)/1000000) // cpu
cycles per microsecond
#define SW0() ((PINA >> 0) & 1)
#define SW1() ((PINA >> 1) & 1)
#define SW2() ((PINA >> 2) & 1)
#define SW3() ((PINA >> 3) & 1)
#define SW4() ((PINA >> 4) & 1)
#define SW5() ((PINA >> 5) & 1)
#define SW6() ((PINA >> 6) & 1)
#define SW7() ((PINA >> 7) & 1)
#define SET_LED0() cbi(PORTB,0)
#define SET_LED1() cbi(PORTB,1)
#define SET_LED2() cbi(PORTB,2)
#define SET_LED3() cbi(PORTB,3)
#define SET_LED4() cbi(PORTB,4)
#define SET_LED5() cbi(PORTB,5)
#define SET_LED6() cbi(PORTB,6)
#define SET_LED7() cbi(PORTB,7)
#define CLR_LED0() sbi(PORTB,0)
#define CLR_LED1() sbi(PORTB,1)
#define CLR_LED2() sbi(PORTB,2)
#define CLR_LED3() sbi(PORTB,3)
#define CLR_LED4() sbi(PORTB,4)
#define CLR_LED5() sbi(PORTB,5)
#define CLR_LED6() sbi(PORTB,6)
#define CLR_LED7() sbi(PORTB,7)
#define SWITCH_ON 0
#define SWITCH_OFF 1
/* Initialize UART */
u32 baudrate;
u08 baudrateDiv;
void InitUART( )
{
baudrate = 9600;
baudrateDiv =
(u08)((F_CPU+(baudrate*8L))/(baudrate*16L)-1);
UBRR0H = baudrateDiv >> 8;
UBRR0L = baudrateDiv;
UCSR0B = (1 << RXEN0) | (1<<TXEN0);
UCSR0C = (3<<UCSZ0);
}
unsigned char data;
void transmitByte( )
{
while (!(UCSR0A & (1<<UDRE)))
;
UDR0 = data;
data = 'A';
while (!(UCSR0A & (1<<UDRE)))
;
UDR0 = 0xa;
data = 'A';
while (!(UCSR0A & (1<<UDRE)))
;
UDR0 = 0xd;
}
int main(void)
{
/* Setup Digital IO */
DDRA = 0x00; /* Port a (all pins) is input */
DDRB = 0xFF; /* Port c (all pins) is output */
PORTB = 0xFF;
InitUART();
data = 'A';
transmitByte();
while(1)
{
if (SW0() == SWITCH_ON)
{
data = '0';
transmitByte();
SET_LED7();
}
else
CLR_LED7();
if (SW1() == SWITCH_ON)
{
data = '1';
transmitByte();
SET_LED6();
}
else
CLR_LED6();
if (SW2() == SWITCH_ON)
{
data = '2';
transmitByte();
SET_LED5();
}
else
CLR_LED5();
if (SW3() == SWITCH_ON)
{
data = '3';
transmitByte();
SET_LED4();
}
else
CLR_LED4();
if (SW4() == SWITCH_ON)
{
data = '4';
transmitByte();
SET_LED3();
}
else
CLR_LED3();
if (SW5() == SWITCH_ON)
{
data = '5';
transmitByte();
SET_LED2();
}
else
CLR_LED2();
if (SW6() == SWITCH_ON)
{
data = '6';
transmitByte();
SET_LED1();
}
else
CLR_LED1();
if (SW7() == SWITCH_ON)
{
data = '7';
transmitByte();
SET_LED0();
}
else
CLR_LED0();
}
}
__________________________________
Yahoo! FareChase: Search multiple travel sites in one click.
http://farechase.yahoo.com
_______________________________________________
AVR-libc-dev mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/avr-libc-dev