kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Kurzreferenz angepaßt für Low-Power-Variante des ATmega32 zum Test und Betrieb des Seriell-ISP

(EN google-translate)

(PL google-translate)


Als Stützkondensatoren für den Quarz von 2,4576MHz wurden 10pF verwendet. Bei Verwendung von Kondensatoren größerer Kapazität war der Baustein nicht mehr erreichbar.


Grundbeschaltung eines ATmega32 auf einem Steckbrett.

Bild 0-1: Grundbeschaltung eines ATmega32 auf einem Steckbrett.

Grundbeschaltung eines ATmega32 auf einem Steckbrett mit angeschlossenem Programmiergerät.

Bild 0-2: Grundbeschaltung eines ATmega32 auf einem Steckbrett mit angeschlossenem Programmiergerät.

Stromlaufplan der Grundbeschaltung (im realen Aufbau wurden drei Entstörkondensatoren von 100nF eingesetzt).

Bild 0-3: Stromlaufplan der Grundbeschaltung (im realen Aufbau wurden drei Entstörkondensatoren von 100nF eingesetzt).


Verwendeter Quarz: 2,4576MHz


  • Sinnvolle Baudrate: 38400
  • TAKTFREQUENZ/8/BAUDRATE-1 == 7
Beschreibung Befehl
Kompilieren zu .elf-Datei avr-gcc -O2 -mmcu=atmega32 rs232_senden.c -o rs232_senden.elf
Umwandeln nach .hex-Datei avr-objcopy -O ihex -j .text -j .data rs232_senden.elf rs232_senden.hex
Flashen avrdude -c ponyser -p m32 -P /dev/ttyS0 -U flash:w:./rs232_senden.hex:a
Auslesen avrdude -c ponyser -p m32 -P /dev/ttyS0 -v
Empfangene Daten sehen gtkterm --bits 8 --speed 38400 --port /dev/ttyS0 --echo
Fuses auslesen und in Datei speichern avrdude -c ponyser -p m32 -P /dev/ttyS0 -U lfuse:r:./lfuse.txt:r -U hfuse:r:./hfuse.txt:r
Verwendung des USB-Programmierers avrdude -c avrispmkII -p m32 -P usb -v

Tabelle 0-1: Kurzreferenz zum Test und Betrieb des Seriell-ISP.

Fuses Calculator: http://www.engbedded.com/fusecalc

Fuses Beispiele für ATmega32 8PU (JTag deaktiviert)

Beschreibung Befehl
Hfuse: avrdude -c ponyser -p m32 -P /dev/ttyS0 -U hfuse:w:0x99:m -u
Lfuse: avrdude -c ponyser -p m32 -P /dev/ttyS0 -U lfuse:w:0xE1:m -u

Tabelle 0-2: Fuse-Register bei ATmega32 8PU, intern 1MHz, fabrikneu.

Beschreibung Befehl
Hfuse: avrdude -c ponyser -p m32 -P /dev/ttyS0 -U hfuse:w:0x99:m -u
Lfuse: avrdude -c ponyser -p m32 -P /dev/ttyS0 -U lfuse:w:0xE2:m -u

Tabelle 0-3: Fuse-Register bei ATmega32 8PU, intern 2MHz, sonst fabrikneu.

Beschreibung Befehl
Hfuse: avrdude -c ponyser -p m32 -P /dev/ttyS0 -U hfuse:w:0xD9:m -u
Lfuse: avrdude -c ponyser -p m32 -P /dev/ttyS0 -U lfuse:w:0xE1:m -u

Tabelle 0-4: Fuse-Register bei ATmega32 8PU, intern 1MHz, ohne JTAG.

Beschreibung Befehl
Hfuse: avrdude -c ponyser -p m32 -P /dev/ttyS0 -U hfuse:w:0xD9:m -u
Lfuse: avrdude -c ponyser -p m32 -P /dev/ttyS0 -U lfuse:w:0xFD:m -u

Tabelle 0-5: Fuse-Register bei ATmega32 8PU, extern mittl. Quarzfreq., ohne JTAG.

#include<stdio.h>

int main()
{
    int ch;
    int ch2;

    FILE* data = fopen("./hfuse.txt","rb");
    FILE* data2 = fopen("./lfuse.txt","rb");

    ch = fgetc( data );   
    ch2 = fgetc( data2 );   

    printf("\nHFUSE=%i (dezimal)\n",ch);
    printf("HFUSE=%x (haxadezimal)\n",ch);

    printf("\nLFUSE=%i (dezimal)\n",ch2);
    printf("LFUSE=%x (haxadezimal)\n",ch2);

    fclose(data);
    fclose(data2);
}

Code 0-1: C-Programm, um in hfuse.txt und lfuse.txt gespeicherten Werte der Fuse-Register in der Konsole anzuzeigen (Kompilieren mit g++ -o liesfuses liesfuses.c).

#include<avr/io.h>

int main()
{
    long pause;

    DDRA = 0b00000000;
    DDRB = 0b00000000;
    DDRD = 0b10000000;
    DDRC = 0b00000000;
//Blinkprogramm:
    while(1)
    {
        PORTD = 0b10000000;

        for(pause=0;pause<50000;pause++)
            DDRA = 0b00000000;
            
        PORTD = 0b00000000;

        for(pause=0;pause<50000;pause++)
            DDRA = 0b00000000;

    }
}

Code 0-2: testled.c - Testprogramm, das eine LED an Pin40 (PD7) blinken läßt.

#include<avr/io.h>

//Definition von Taktfrequenz und Bausrate als Konstanten
#define TAKTFREQUENZ 2457600
#define BAUDRATE 38400


int main()
{
    long pause;
    //Aktivieren der RS232-Schnittstelle des Mikrocontrollers:
    
    //Merken des in UBRR zu speichernden Wertes.
    unsigned int baudregister = TAKTFREQUENZ/8/BAUDRATE-1;

    //setzen der Baudrate
    UBRRH = (unsigned char) (baudregister>>8); //Setzen des HIGH-Bytes des Baudraten-Registers
    UBRRL = (unsigned char)  baudregister;     //Setzen des LOW -Bytes des Baudraten-Registers
	
    //Einschalten des Senders und des Empfängers
    UCSRB = (1<<TXEN) | (1<<RXEN);
		        
    //Setzen des Nachrichtenformats: 8 Datenbits, 1 Stopbits
    UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
    UCSRA = (1<<U2X);

    //Es soll wiederholt von 0 bis 255 durchgezählt werden und
    //der aktuelle Wert im Hyperterminal zu sehen sein.

    while(1)
    {

        while( !(UCSRA & (1<<UDRE)) ); //Warten bis der Uebertragungspuffer leer ist
        UDR = 'A';                    //Daten in den Puffer schreiben und übertragen

        for(pause=0;pause<50000;pause++)
            DDRC=0b00000000;
    }
}

Code 0-3: rs232_senden.c - Testprogramm, um die serielle Datenübertragung vom Mikrocontroller zum PC zu überprüfen.

#include<avr/io.h>

//Definition von Taktfrequenz und Bausrate als Konstanten
#define TAKTFREQUENZ 2457600
#define BAUDRATE 38400


int main()
{
    unsigned char akku=0;

    DDRA = 0b00000000;
    DDRB = 0b00000000;
    DDRD = 0b00000000;

    DDRC = 0b11111111; //über RS232 gesendete Zahlen sollen auch an 
                       //zweiten Mikrocontroller geschickt
                       //und angezeigt werden.

    //Aktivieren der RS232-Schnittstelle des Mikrocontrollers:
    
    //Merken des in UBRR zu speichernden Wertes.
    unsigned int baudregister = TAKTFREQUENZ/8/BAUDRATE-1;

	//setzen der Baudrate
	UBRRH = (unsigned char) (baudregister>>8); //Setzen des HIGH-Bytes des Baudraten-Registers
	UBRRL = (unsigned char)  baudregister;     //Setzen des LOW -Bytes des Baudraten-Registers
	
	//Einschalten des Senders und des Empfängers
	UCSRB = (1<<TXEN) | (1<<RXEN);
		        
	//Setzen des Nachrichtenformats: 8 Datenbits, 1 Stopbits
	UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
    UCSRA = (1<<U2X);

    //Es soll das zuletzt vom Hyperterminal empfangene ASCII-Zeichen 
    //dezimal angezeigt werden

    while(1)
    {
        while( !(UCSRA & (1<<RXC)) );  //Warten bis der Uebertragungspuffer ein Zeichen empfangen hat
        akku = UDR;                    //Zeichen aus dem Puffer holen

        //...und anzeigen
        PORTC = akku;
    }
}

Code 0-4: rs232_empfangen.c - Testprogramm, um die serielle Datenübertragung vom PC zum Mikrocontroller zu überprüfen. An PortC sollten z.B. LEDs angeschlossen sein.

Werkseitige Belegung der Fuse-Bits beim ATmega32

----------------------------
Fuse HIGH Byte:
Bit     Beschreibung          Default
Bit 7   Enable OCD            1
Bit 6   Enable JTAG           0 enabled!
Bit 5   Enable SPI            0
Bit 4   Oscillator options    1
Bit 3   EEPROM is preserved   1
Bit 2   Select Boot Size      0
Bit 1   Select Boot Size      0
Bit 0   Select Reset Vector   1

Fuse LOW Byte:
Fuse HIGH Byte:
Bit     Beschreibung          Default
Bit 7   Brown Out lev         1
Bit 6   Brown out en          1 
Bit 5   Select start-up       1
Bit 4   Select start-up       0
Bit 3   Clock Source          0
Bit 2   Clock Source          0
Bit 1   Clock Source          0
Bit 0   Clock Source          1

Code 0-5: Werkseitige Belegung der Fuse-Bits beim ATmega32.