PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATmega162 Taktung/Quarz Frage



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]);
}

uwegw
09.10.2005, 15:40
ein quarz ist ungepolt, da hast ihn also richtig angeschlossen.

du müsstest noch die konstante BAUD definieren, in der die gewünschte baudrate für die serielle schnittstelle steht, zb 9600. deine formel berechnet dann darus und aus der quarzfrequenz (F_CPU, fehlt auch noch) die passenden einstellungen für ein konfigurationsregister der schnittstelle.

mpetz
09.10.2005, 16:11
wenn ich das richtig verstanden hab, steht die konstante F_CPU im makefile (bzw. dort habe ich sie) und wird durch den compiler zur verfügung gestellt, oder?

BAUD ist im headerfile definiert, seh ich grade, steht auf 57600UL

wie sieht es mit den Fusebits aus?

Kjion
09.10.2005, 16:53
Hi,

vielleicht hilft dir ja folgendes weiter:
http://www.kreatives-chaos.com/index.php?seite=ponyprog_fusebits

MfG Kjion

mpetz
09.10.2005, 18:15
die fusebits sind beim 162 etwas anders, habe jetzt nach dem datenblatt programmiert (bzw. dort die optionen nachgeschaut) und jetzt geht nix mehr :-(.

hab auch das CKDIV8 Bite weggenommen, ob es daran lag...

naja dann google und such ich mal was nun zum retten des chips zu tun ist

mpetz
09.10.2005, 18:28
also ich habe
JTAGEN
alle SUT
alle CKSEL
und CKDIV8
weggenommen, also bei PonyProg häckchen nicht gesetzt.

War das richtig? Kann es sein, das mein externer Quarz es nicht tut und deswegen nicht geht. Waren die 22p Kondensatoren richtig?

Frank
09.10.2005, 23:44
Versuchs doch mal in Bascom, dort sind die Fusebiteinstellungen im Klartext beschrieben so das man kaum was falsch machen kann. Geht auch mit dem Demo!

Gewöhnlich ist es dort immer die Einstellung:
Fusebit A987 auf "1111:1111 external Xtal"

Bei manchen neueren Controller muss zusätzlich noch
Fusebit C (Teiler durch 8 ) deaktiviert werden.

Gruß Frank