Society of Robots - Robot Forum
Software => Software => Topic started by: Admin on May 16, 2007, 01:18:43 PM
-
While trying to get rprintf() to work on my ATmega644, I get this error when compiling my file and cant figure it out . . .
Compiling: timer.c
avr-gcc -c -mmcu=atmega644 -I. -gstabs -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=timer.lst -std=gnu99 -Wp,-M,-MP,-MT,timer.o,-MF,.dep/timer.o.d timer.c -o timer.o
timer.c: In function 'timer0Init':
timer.c:98: error: 'TIMSK' undeclared (first use in this function)
timer.c:98: error: (Each undeclared identifier is reported only once
timer.c:98: error: for each function it appears in.)
timer.c: In function 'timer1Init':
timer.c:109: error: 'TIMSK' undeclared (first use in this function)
timer.c: In function 'timer2Init':
timer.c:118: error: 'TIMSK' undeclared (first use in this function)
timer.c: In function 'timer0SetPrescaler':
timer.c:127: error: 'TCCR0' undeclared (first use in this function)
timer.c: In function 'timer2SetPrescaler':
timer.c:140: error: 'TCCR2' undeclared (first use in this function)
timer.c: In function 'timer0GetPrescaler':
timer.c:147: error: 'TCCR0' undeclared (first use in this function)
timer.c: In function 'timer2GetPrescaler':
timer.c:163: error: 'TCCR2' undeclared (first use in this function)
timer.c: At top level:
timer.c:464: warning: 'SIG_OUTPUT_COMPARE2' appears to be a misspelled signal handler
make: *** [timer.o] Error 1
upon google searching the error I found this:
http://www.mail-archive.com/[email protected]/msg02053.html
he got this response, but i dont really understand what I need to do to resolve the problem:
http://www.mail-archive.com/[email protected]/msg02054.html
searching through the various AVR library files (http://hubbard.engr.scu.edu/avr/avrlib/) i cant seem to find where TIMSK is declared, leading me to believe this has something to do with the problem . . .
(I didnt post my code because there is tons of it related to this problem)
ideas? ???
-
On page 104 of the ATmega644, they describe:
TIMSK0 – Timer/Counter Interrupt Mask Register
Sounds like a bug in the timer0Init function...
- Jon
-
Hi!
I havent worked much with avr's so far, but i think that register TIMSK doesnt exist at all. You have TIMSK0, TIMSK1... Each register for each timer.
And TCCR0 are dividend into two registers: TCCR0A and TCCR0B.
And i believe they are defined in header (.h) files that come with compiler (e.g. gcc = winavr) and should be the same as they are in datasheet: http://www.atmel.com/dyn/resources/prod_documents/doc8011.pdf (http://www.atmel.com/dyn/resources/prod_documents/doc8011.pdf).
-
ok I fixed the problem.
Apparently with the ATmega644 you cant use timer.c and timer.h.
Instead, I changed it to timerx8.c and timerx8.h.
-
ok one other problem, potentially related to the above . . .
so I am getting these two warnings (not errors):
uart.c:70: warning: pointer targets in passing argument 2 of 'bufferInit' differ in signedness
uart.c:72: warning: pointer targets in passing argument 2 of 'bufferInit' differ in signedness
both of these are also from AVRlib . . . google search reveals nothing useful . . . there are no other buffer header files to use . . .
looking at part of uart.c:
// create and initialize the uart transmit and receive buffers
void uartInitBuffers(void)
{
#ifndef UART_BUFFERS_EXTERNAL_RAM
// initialize the UART receive buffer
bufferInit(&uartRxBuffer, uartRxData, UART_RX_BUFFER_SIZE); //line 70
// initialize the UART transmit buffer
bufferInit(&uartTxBuffer, uartTxData, UART_TX_BUFFER_SIZE); //line 72
#else
// initialize the UART receive buffer
bufferInit(&uartRxBuffer, (u08*) UART_RX_BUFFER_ADDR, UART_RX_BUFFER_SIZE);
// initialize the UART transmit buffer
bufferInit(&uartTxBuffer, (u08*) UART_TX_BUFFER_ADDR, UART_TX_BUFFER_SIZE);
#endif
}
It will probably take me a few weeks before I have all my wireless communication hardware working to test this, or otherwise I'd just upload the program and see what happens . . .
-
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=280592
This guy seems to have run into a similar problem...
- Jon
-
Yea that was the only link I was able to find, but after I looked into it further it turned out he was trying to solve a different unrelated error. :-\
-
I've been using procyon's AVRlib for a few weeks now, and I've also stumbled on the errors/warnings you are encountering.
The "signedness" warning stems from the fact that in uart.c, uartRxData and uartTxData are defined as "char" only. The signedness of a "char" is machine dependent according to the gcc manual. On the other hand, uartInitBuffer() expects a u08, an "unsigned char". There lies the warning of different signedness.
One could probably:
1) apply a cast to the lines giving out a warning
2) change the data types of uartRxData and uartTxData so that it is unsigned
3) add -funsigned-char to your makefile, which makes "char" work like "unsigned char"
- Rommel
-
in uart.c i changed:
#ifndef UART_BUFFERS_EXTERNAL_RAM
// initialize the UART receive buffer
bufferInit(&uartRxBuffer, uartRxData, UART_RX_BUFFER_SIZE);
// initialize the UART transmit buffer
bufferInit(&uartTxBuffer, uartTxData, UART_TX_BUFFER_SIZE);
to:
#ifndef UART_BUFFERS_EXTERNAL_RAM
// initialize the UART receive buffer
bufferInit(&uartRxBuffer, (u08*) uartRxData, UART_RX_BUFFER_SIZE);
// initialize the UART transmit buffer
bufferInit(&uartTxBuffer, (u08*) uartTxData, UART_TX_BUFFER_SIZE);
and the warnings went away. Thanks!
-
I made the change you suggested and still get the warning. >:(
void uartInitBuffers(void)
{
#ifndef UART_BUFFERS_EXTERNAL_RAM
// initialize the UART receive buffer
bufferInit(&uartRxBuffer, (u08*) uartRxData, UART_RX_BUFFER_SIZE);
// initialize the UART transmit buffer
bufferInit(&uartTxBuffer, (u08*) uartTxData, UART_TX_BUFFER_SIZE);
#else
// initialize the UART receive buffer
bufferInit(&uartRxBuffer, (u08*) UART_RX_BUFFER_ADDR, UART_RX_BUFFER_SIZE);
// initialize the UART transmit buffer
bufferInit(&uartTxBuffer, (u08*) UART_TX_BUFFER_ADDR, UART_TX_BUFFER_SIZE);
#endif
}
Edit: doh! it's complaining about line 187 here
if (uartReceiveByte(&myReceivedByte)) // line 187
{
// if there are bytes waiting on the serial port
char inByte = uartGetByte(); // read a byte
what do I need to change?
-
Hmmmm the error probably occurs before line 187.
Whats the error it gives?
-
sorry forgot to include the exact error.
50_robot_sharp_ir.c:187: warning: pointer targets in passing argument 1 of 'uartReceiveByte' differ in signedness
-
so . . . the code that i have online should already work . . . was it broken before you made these changes?
looking at my $50 sharp IR upgrade code in uart.c, this is what it's supposed to be:
// create and initialize the uart transmit and receive buffers
void uartInitBuffers(void)
{
#ifndef UART_BUFFERS_EXTERNAL_RAM
// initialize the UART receive buffer
bufferInit(&uartRxBuffer, uartRxData, UART_RX_BUFFER_SIZE);
// initialize the UART transmit buffer
bufferInit(&uartTxBuffer, uartTxData, UART_TX_BUFFER_SIZE);
#else
// initialize the UART receive buffer
bufferInit(&uartRxBuffer, (u08*) UART_RX_BUFFER_ADDR, UART_RX_BUFFER_SIZE);
// initialize the UART transmit buffer
bufferInit(&uartTxBuffer, (u08*) UART_TX_BUFFER_ADDR, UART_TX_BUFFER_SIZE);
#endif
}
-
Yeah I got that error before i made the change in uart.c. I'll look at it more again when I have time to play with it.