Hoi,
Ik heb een STK500 bordje van Atmel.
Wanneer ik onderstaande code uitvoer met een Atmega8515 dan krijg ik netjes de text te zien vian mijn RS232 poort.
Wanneer ik dit met een Atmega16 probeer dan krijg ik helemaal niets. De Atmega16 zit in de goede socket van de STK500 en er word gebruik gemaakt van een crystal voor de klok.
Het werkt ook niet met een Atmega8.
Heeft iemand een idee?
/*************************************************************************
Title: example program for the Interrupt controlled UART library
Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
File: $Id: test_uart.c,v 1.4 2005/07/10 11:46:30 Peter Exp $
Software: AVR-GCC 3.3
Hardware: any AVR with built-in UART, tested on AT90S8515 at 4 Mhz
DESCRIPTION:
This example shows how to use the UART library uart.c
*************************************************************************/
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>
#include "uart.h"
/* define CPU frequency in Mhz here if not defined in Makefile */
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
/* 9600 baud */
#define UART_BAUD_RATE 9600
int tel=0;
int main(void)
{
unsigned int c;
char buffer[7];
int num=134;
/*
* with the macro
* UART_BAUD_SELECT() (normal speed mode )
* or
* UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
*/
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
/*
* now enable interrupt, since UART library is interrupt controlled
*/
sei();
/*
* Transmit string to UART
* The string is buffered by the uart library in a circular buffer
* and one character at a time is transmitted to the UART using interrupts.
* uart_puts() blocks if it can not write the whole string to the circular
* buffer
*/
uart_puts("String stored in SRAM\n");
/*
* Transmit string from program memory to UART
*/
uart_puts_P("String stored in FLASH\n");
/*
* Use standard avr-libc functions to convert numbers into string
* before transmitting via UART
*/
itoa( num, buffer, 10); // convert interger into string (decimal format)
uart_puts(buffer); // and transmit string to UART
/*
* Transmit single character to UART
*/
uart_putc('\r');
for(;;)
{
/*
* Get received character from ringbuffer
* uart_getc() returns in the lower byte the received character and
* in the higher byte (bitmask) the last receive error
* UART_NO_DATA is returned when no data is available.
*
*/
c = uart_getc();
if ( c & UART_NO_DATA )
{
/*
* no data available from UART
*/
}
else
{
itoa( tel, buffer, 10);
uart_puts_P("Test \n");
uart_puts(buffer);
tel++;
/*
* new data available from UART
* check for Frame or Overrun error
*/
if ( c & UART_FRAME_ERROR )
{
/* Framing Error detected, i.e no stop bit detected */
uart_puts_P("UART Frame Error: ");
}
if ( c & UART_OVERRUN_ERROR )
{
/*
* Overrun, a character already present in the UART UDR register was
* not read by the interrupt handler before the next character arrived,
* one or more received characters have been dropped
*/
uart_puts_P("UART Overrun Error: ");
}
if ( c & UART_BUFFER_OVERFLOW )
{
/*
* We are not reading the receive buffer fast enough,
* one or more received character have been dropped
*/
uart_puts_P("Buffer overflow error: ");
}
/*
* send received character back
*/
uart_putc( (unsigned char)c );
}
}
}
misschien zitten de tx en rx op een andere plaats bij die µc's. (?)
je weet dat ifv welke µc je gebruikt deze op een andere plaats komt te zitten in de STK500 om de µc te laden?
zit er uberhaupt wel een programma ingeladen ?
[Bericht gewijzigd door shortcircuit op ]
Zowel bij de ATmega8515 en de ATmega16 zit de RXD op PD0 en de TDC op PD1. De pin bezetting van deze twee is wel anders, maar daarvoor zitten er twee verschillende sockets op de STK500.
Ik heb de pinnentjes doorgemeten vanaf de µc en die komen uit op de RXD/TXD van de STK500.
En ja, er zit een programma in 
misschien ondersteunt de uart.h headerfile die µc's niet, open die header file eens en bekijk het commentaar erin.
moet je #include <mega16.h> includen oid ?
ik zie nl nergens je chipdefinitie, wat ik in Bascom wel moet opgeven.
[Bericht gewijzigd door shortcircuit op ]
http://www.geisterstunde.org/avr/usart1.html
kun je hier niet iets mee ?
/*****************************************************
demonstration of the USART usage with printf
28.04.2004
*****************************************************/
#include <mega16.h>
#include <stdio.h>
void main(void)
{
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x17;
printf("Hello World!\r");
}
[Bericht gewijzigd door shortcircuit op ]
Was vergeten om de fuse bit voor de Atmega16 te zetten dat ie de externe OSC gebruikte... *schaam*.
De code die ik voor de 8515 gebruikte werkt nu dus ook voor de Atmega16. Bij de 8515 staat het standaard dus wel aan.
Bedankt voor de hulp.
En ik ben weer wat wijzer geworden in de wereld van de Atmels 