mpetz
09.10.2005, 14:58
Ich versuche mit meinem Atmega162 UART hinzubekommen, bisher erfolglos. Nun habe ich folgende Schritte gemacht bzw. vor:
1. Ich habe einen externen Quarz (14,7456Mhz) angeschlossen, den einen Pin an XTAL1, den anderen an XTAL2 (habe dabei nicht auf eine Polung geachtet, muss ich das?). Zudem noch jeweils einen 22p Kondensator zu GND.
2. Ich habe in meinem Makefile F_CPU = 14745600 gesetzt
3. Ich habe die Baudrate für UART folgendermaßen definiert:
#define UBRR_BAUD ((F_CPU/(16L*BAUD))-1)
...wobei ich grad irgendwie nicht weiss woher BAUD kommt und auf welchen Baud Wert ich dann komme?
4. Muss ich nun Fusebits setzen um auf den externen Quarz umzuschalten? Wie mach ich das? Habe für PonyProg keine einfache Anleitung gefunden...
So, das sind die Schritte, habe nun noch eine allgemeine Programmtechnische Frage. Ich würde gerne meine an PB0 angesclossene LED im Betrieb immer blinken lassen. ein Delay kann ich hier ja nicht verwenden, dann würde er ja den sonstigen Krams nicht machen. würde man hiefür in der while-Schleife einfach einen Zähler einbauen und bei gewissen Teilern (z.B. jede Sekunde) eine Aktion durchführen?
thx für jede Hilfe!
Code von main.c
#include <stdint.h>
#include <avr/io.h>
#include "uart.h"
//#define SYSCLK 7372800
void delay_ms(unsigned int ms);
void io_init(void);
int main(void) {
uart_init();
while (1) {
uart_putc('s');
delay_ms(1000);
}
return 0;
}
// Delay Routine
void delay_ms(unsigned int ms)
{
unsigned int zaehler;
while (ms)
{
zaehler = F_CPU / 5000;
while (zaehler)
{
asm volatile ("nop");
zaehler--;
}
ms--;
}
}
Code von uart.c
#include "uart.h"
#include <avr/io.h>
#define UBRR_BAUD ((F_CPU/(16L*BAUD))-1)
void uart_init(void);
void uart_putc( uint8_t data);
void uart_puts_p(const char *progmem_s );
void uart_init(void) {
/* UART, Baudrate : 115200 Bps */
UBRR1H = (uint8_t) (UBRR_BAUD>>8);
UBRR1L = (uint8_t) (UBRR_BAUD & 0xFF);
UCSR1A = 0;
/* Enable transmitter */
UCSR1B = (1<<TXEN1)|(1<<RXEN1);
/* Set frame format: 8data, 1stop bit */
UCSR1C = (1<<URSEL1)|(1<<UCSZ10)|(1<<UCSZ11);
}
void uart_putc( uint8_t data) {
while ( !( UCSR1A & (1<<UDRE1)) )
;
UDR1 = data;
}
void uart_puts_p(const char *progmem_s ) {
register char c;
while ( (c = pgm_read_byte(progmem_s++)) )
uart_putc(c);
}
/* Display 0..65535
printdec(12345,5) -> 12345
printdec(12345,6) -> 12345 */
void uart_put_int(unsigned int x, unsigned char n ) {
unsigned char i, s[10];
for (i = 0; i < n; i++)
{
s[n - i - 1] = '0' + (x % 10);
x /= 10;
}
for (i=0; i<(n - 1); i++)
{
if (s[i] == '0')
s[i] = ' ';
else
break;
}
for (i=0; i<n; i++)
uart_putc(s[i]);
}
1. Ich habe einen externen Quarz (14,7456Mhz) angeschlossen, den einen Pin an XTAL1, den anderen an XTAL2 (habe dabei nicht auf eine Polung geachtet, muss ich das?). Zudem noch jeweils einen 22p Kondensator zu GND.
2. Ich habe in meinem Makefile F_CPU = 14745600 gesetzt
3. Ich habe die Baudrate für UART folgendermaßen definiert:
#define UBRR_BAUD ((F_CPU/(16L*BAUD))-1)
...wobei ich grad irgendwie nicht weiss woher BAUD kommt und auf welchen Baud Wert ich dann komme?
4. Muss ich nun Fusebits setzen um auf den externen Quarz umzuschalten? Wie mach ich das? Habe für PonyProg keine einfache Anleitung gefunden...
So, das sind die Schritte, habe nun noch eine allgemeine Programmtechnische Frage. Ich würde gerne meine an PB0 angesclossene LED im Betrieb immer blinken lassen. ein Delay kann ich hier ja nicht verwenden, dann würde er ja den sonstigen Krams nicht machen. würde man hiefür in der while-Schleife einfach einen Zähler einbauen und bei gewissen Teilern (z.B. jede Sekunde) eine Aktion durchführen?
thx für jede Hilfe!
Code von main.c
#include <stdint.h>
#include <avr/io.h>
#include "uart.h"
//#define SYSCLK 7372800
void delay_ms(unsigned int ms);
void io_init(void);
int main(void) {
uart_init();
while (1) {
uart_putc('s');
delay_ms(1000);
}
return 0;
}
// Delay Routine
void delay_ms(unsigned int ms)
{
unsigned int zaehler;
while (ms)
{
zaehler = F_CPU / 5000;
while (zaehler)
{
asm volatile ("nop");
zaehler--;
}
ms--;
}
}
Code von uart.c
#include "uart.h"
#include <avr/io.h>
#define UBRR_BAUD ((F_CPU/(16L*BAUD))-1)
void uart_init(void);
void uart_putc( uint8_t data);
void uart_puts_p(const char *progmem_s );
void uart_init(void) {
/* UART, Baudrate : 115200 Bps */
UBRR1H = (uint8_t) (UBRR_BAUD>>8);
UBRR1L = (uint8_t) (UBRR_BAUD & 0xFF);
UCSR1A = 0;
/* Enable transmitter */
UCSR1B = (1<<TXEN1)|(1<<RXEN1);
/* Set frame format: 8data, 1stop bit */
UCSR1C = (1<<URSEL1)|(1<<UCSZ10)|(1<<UCSZ11);
}
void uart_putc( uint8_t data) {
while ( !( UCSR1A & (1<<UDRE1)) )
;
UDR1 = data;
}
void uart_puts_p(const char *progmem_s ) {
register char c;
while ( (c = pgm_read_byte(progmem_s++)) )
uart_putc(c);
}
/* Display 0..65535
printdec(12345,5) -> 12345
printdec(12345,6) -> 12345 */
void uart_put_int(unsigned int x, unsigned char n ) {
unsigned char i, s[10];
for (i = 0; i < n; i++)
{
s[n - i - 1] = '0' + (x % 10);
x /= 10;
}
for (i=0; i<(n - 1); i++)
{
if (s[i] == '0')
s[i] = ' ';
else
break;
}
for (i=0; i<n; i++)
uart_putc(s[i]);
}