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:$^