- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 7 von 7

Thema: ATmega162 Taktung/Quarz Frage

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    03.02.2004
    Ort
    Köln
    Alter
    42
    Beiträge
    84

    ATmega162 Taktung/Quarz Frage

    Anzeige

    E-Bike
    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

    Code:
    #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

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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    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.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    03.02.2004
    Ort
    Köln
    Alter
    42
    Beiträge
    84
    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?

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    Hi,

    vielleicht hilft dir ja folgendes weiter:
    http://www.kreatives-chaos.com/index...yprog_fusebits

    MfG Kjion

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    03.02.2004
    Ort
    Köln
    Alter
    42
    Beiträge
    84
    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

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    03.02.2004
    Ort
    Köln
    Alter
    42
    Beiträge
    84
    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?

  7. #7
    Administrator Robotik Visionär Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    5.116
    Blog-Einträge
    1
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests