kramann.info
© Guido Kramann

Login: Passwort:










Mikrocontroller
1 Einfuehrung
..1.1 Entwicklungsgeschichtliches
..1.2 Maschinensprache
..1.3 Assemblerbeispiel
..1.4 Sprachwahl
..1.5 Praxis
....1.5.1 Digital_IO
....1.5.2 Byteoperationen
....1.5.3 AVR_Studio
....1.5.4 Testboard
....1.5.5 Aufgaben
....1.5.6 Do_it_yourself
......1.5.6.1 Ampel
......1.5.6.2 Programmierer
..1.6 Literatur
..1.7 Programmierer
....1.7.1 Bauverlauf
....1.7.2 KurzreferenzLow
....1.7.2 Kurzreferenz_16PU
..1.8 Uebung1
..1.9 BoardAtHome
....1.9.1 Software
....1.9.2 Hardware
....1.9.3 Knoppix
....1.9.4 Aufbau
....1.9.5 LED
2 Oszillator
..2.1 Assembler
..2.2 Interner_RC
..2.3 Quarz
..2.4 Taktgenerator
3 DigitalIO
..3.1 Elektrische_Eigenschaften
..3.2 Pullup_Widerstaende
..3.3 Bitmasken_Eingang
..3.4 Bitmasken_Ausgang
..3.5 Tic_Tac_Toe
....3.5.1 DuoLEDs
....3.5.2 Schaltplan
....3.5.3 Spielfeld
....3.5.4 Anwahl
....3.5.5 Kontrolle
..3.6 Laboruebung2
..3.7 Laboruebung2_alt
4 PWM
..4.1 Prinzip
..4.2 Nutzen
..4.3 Generierung
..4.4 Programmierung
..4.5 Servos
..4.7 Laboruebung3
..4.8 LoesungUE3
..4.9 Uebung6
5 LichtKlangKugeln
..5.1 LED
..5.2 RGB
..5.3 Sensoren
..5.4 lautsprecher
..5.5 tonerzeugung
6 UART
..6.1 Bussysteme
..6.2 UART
..6.3 RS232
..6.4 Hardware
..6.5 Senden
..6.6 Hyperterminal
..6.7 Empfangen
..6.8 Broadcast
..6.9 Uebung4
7 Infrarot
..7.1 schalten
..7.2 seriell
..7.3 Uebung
8 OOP
..8.1 Probleme
..8.2 Konzept
..8.3 Statisch
..8.4 Datentypen
..8.5 RS232
....8.5.1 Prozedural
....8.5.2 Analyse
....8.5.3 Umsetzung
....8.5.4 Vererbung
....8.5.5 Statisch
....8.5.6 Performance
..8.6 Fahrzeug
9 ADW
..9.1 ADW
..9.2 Zaehler
10 Peripherie
..10.1 RS232Menue
..10.2 ASCIIDisplay
..10.3 Tastenmatrix
..10.4 Schrittmotor
..10.5 Zaehler
..10.6 Uebung7
11 SPI
..11.1 Testanordnung
..11.2 Register
..11.3 Test1
..11.4 Test2_Interrupt
..11.5 Test3_2Slaves
..11.6 Laboruebung
12 EEPROM
13 I2C
..13.1 MasterSendByte
..13.2 MasterSend2Bytes
..13.3 MasterReceiveByte
..13.4 MasterReceive2Bytes
14 Anwendungen
..14.1 Mechatroniklabor
....14.1.1 Biegelinie
....14.1.2 Ausbruchsicherung
....14.1.3 Einachser
....14.1.4 AV
....14.1.5 Vierradlenkung
....14.1.6 Kommunikation
..14.2 Sinuserzeugung
....14.2.1 Variante1
....14.2.2 Variante2
....14.2.3 Variante3
....14.2.4 Variante4
..14.3 Laboruebung8
..14.4 Loesung_Ue8
..14.5 SPI_Nachtrag
20 Xubuntu
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:0xD9:m -u
Lfuse: avrdude -c ponyser -p m32 -P /dev/ttyS0 -U lfuse:w:0xE1:m -u

Tabelle 0-3: 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:0xE2:m -u

Tabelle 0-4: Fuse-Register bei ATmega32 8PU, intern 2MHz, 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:0xE3:m -u

Tabelle 0-5: Fuse-Register bei ATmega32 8PU, intern 4MHz, 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:0xE4:m -u

Tabelle 0-6: Fuse-Register bei ATmega32 8PU, intern 8MHz, 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-7: 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.