For the examples on this page, a vusbtiny programmer is used.
Useful background knowledge: Hexadecimal Numbers
#define F_CPU 1000000 #include <avr/io.h> #include <util/delay.h> #define LED_DDR DDRB #define LED_PORT PORTB #define LED_PIN_NR PB3 void main(void) { LED_DDR = (1 << LED_PIN_NR); // Configure PB3 as output while(1) { // Endless loop _delay_ms(999); // One second pause LED_PORT |= (1 << LED_PIN_NR); // Switch on LED _delay_ms(999); // Pause LED_PORT &= ~(1 << LED_PIN_NR); // Switch off LED } }
avr-gcc -mmcu=attiny45 -Os blink.c avr-objcopy -j .text -j .data -O ihex a.out a.hex avrdude -c usbtiny -p attiny45 -P usb -U flash:w:a.hex
avrdude -c usbtiny -p attiny45 -P usb -U flash:w:vusbtiny.hex avrdude -c usbtiny -p t45 -V -U lfuse:w:0xe1:m -U hfuse:w:0x5d:m -U efuse:w:0xff:m
/* Siehe http://www.rn-wissen.de/index.php/GNU_Assembler, http://www.nongnu.org/avr-libc/user-manual/assembler.html Erzeugen des Listings, und elf files für den ATTiny2313 avr-gcc -x assembler-with-cpp -Wa,-adhlns=erster_test_13042011.lst,-gstabs,-D -o Pollin_Board_ATTiny2313_Blinker.elf -mmcu=attiny2313 Pollin_Board_ATTiny2313_Blinker.S Hex File erzeugen avr-objcopy -j .text -j .data -O ihex Pollin_Board_ATTiny2313_Blinker.elf Pollin_Board_ATTiny2313_Blinker.hex Größe anzeigen avr-size -x Pollin_Board_ATTiny2313_Blinker.elf Memory usage anzeigen avr-size -C Pollin_Board_ATTiny2313_Blinker.elf Ausführliche Stastistik der Speicherbelegung <ausprobieren> avr-size -x -A Pollin_Board_ATTiny2313_Blinker.elf ATTiny2313 mit AVRDude beschreiben avrdude -p t2313 -c ponyser -P /dev/ttyUSB0 -U flash:w:Pollin_Board_ATTiny2313_Blinker.hex /usr/lib/avr/include/avr/io.h -> /usr/lib/avr/include/avr/iotn2313.h */ #include <avr/io.h> Datenrichtung = 16 ; der Variable Datenrichtung wird Register 16 zugewiesen Zaehler1 = 17 ; der Variable Zaehler1 wird Register 17 zugewiesen Zaehler2 = 18 ; der Variable Zaehler2 wird Register 18 zugewiesen Zaehler3 = 19 ; der Variable Zaehler3 wird Register 19 zugewiesen temp = 20 ; der Variable temp wird Register 20 zugewiesen .section .text ; was nun folgt, gehört in den FLASH-Speicher .global main ; main ist auch in anderen Modulen bekannt main: ; zu 'main' wird nach Reset hingesprungen ldi Datenrichtung, 0b00001000 out _SFR_IO_ADDR(DDRB), Datenrichtung ; Datenrichtung PORTD an der Stelle LED1 auf Ausgang out _SFR_IO_ADDR(PORTB), Datenrichtung ; Ausgang zur LED1 auf High setzen -> LED leuchtet Hauptschleife: clr Zaehler3 ; Zaehler3 wird auf Null gesetzt loop3: ; Warteschleife loop2: loop1: inc Zaehler1 ; Zaehler = Zaehler + 1 brvc loop1 ; solange Zaehler1 nicht überläuft, also von 255 auf 0 springt wird zu loop1 gesprungen inc Zaehler2 ; Zaehler = Zaehler + 1 brvc loop2 ; solange Zaehler2 nicht überläuft, also von 255 auf 0 springt wird zu loop2 gesprungen inc Zaehler3 ; Zaehler = Zaehler + 1 cpi Zaehler3, 5 ; Vergleiche Zaehler3 mit 50 brne loop3 ; solange die 50 nicht erreicht ist, wird in loop3 gesprungen in temp, _SFR_IO_ADDR(PORTB) ; Zustand der LED1 drehen eor temp, Datenrichtung ; drehe in temp das Bit, was in Datenrichtung gesetzt ist out _SFR_IO_ADDR(PORTB), temp ; gebe den Inhalt von temp auf PORTD aus rjmp Hauptschleife
avr-gcc -mmcu=attiny45 blink.S avr-objcopy -j .text -j .data -O ihex a.out a.hex avrdude -c usbtiny -p t45 -P usb -U flash:w:a.hex
ARDUINO_TTY=/dev/ttyACM0 %.elf: %.c avr-gcc -Wall -O3 -std=gnu99 -mmcu=atmega328p -DF_CPU=16000000L -o $@ $^ %.hex: %.elf avr-objcopy -j .text -j .data -O ihex $^ $@ %.prog: %.hex avrdude -p m328p -b 115200 -c arduino -P $(ARDUINO_TTY) -v -U flash:w:$^