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.
Bild 0-1: Grundbeschaltung eines ATmega32 auf einem Steckbrett.
Bild 0-2: Grundbeschaltung eines ATmega32 auf einem Steckbrett mit angeschlossenem Programmiergerät.
Bild 0-3: Stromlaufplan der Grundbeschaltung (im realen Aufbau wurden drei Entstörkondensatoren von 100nF eingesetzt).
Verwendeter Quarz: 2,4576MHz
|
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 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.