Atmel Mikrocontroller Kickstart
Contents
Hardware und Software
Hardware
- In System Programmer (einfache Schaltung von [1] ):
Pin am ISP | Pin am AVR | Schutzwiderstand | Pin am Parallelport |
---|---|---|---|
5 | Reset (1) | -- | Init (16) |
4 | MOSI (17) | 470 Ohm | D0 (2) |
3 | MISO (18) | 220 Ohm | Busy (11) |
2 | SCK (19) | 470 Ohm | Strobe (1) |
1 | GND | -- | GND (18) |
- fuer die Schaltung um den Atmel drumrum brauchen wir:
- einen Widerstand (zb. 10k oder auch 1k8) fuer den Reset Pull-Up
- einen Kondensator (zb. 10uF) zum entprellen der Reset-Schaltung
- pro anzuschliessende LED jeweils noch einen Widerstand (zb. 1k8)
Dann kanns eigentlich auch schon losgehen
Hier ist ein Schaltplan für den Mikrocontroller:
Hierbei muss man beachten, dass der Atmega8 der Nachfolger vom AT90S4433 ist und etwas mehr kann. Der Atmega8 braucht nicht zwingend einen externen Quarzoszillator, denn der hat einen internen Oszillator der ungefaehr mit 1Mhz laeuft und fuer alles ausser serieller Kommunikation ausreichen sollte.
Software
Notwending ist ein Assembler, der aus dem Ascii-Prosa-Text binaerimages zum direkten Hochladen auf den Controller macht, und ein Programm, welches diese Images dann hochschiebt.
Als Assembler eignet sich zb. avraund zum Hochladen verwendet man am einfachsten uisp.
Schritte, um das in der Datei "test.asm" befindliche Programm zu kompilieren und hochzuladen:
$ avra test.asm Pass 1... Pass 2... Segment usage: Code: 88 words (176 bytes) Data: 0 bytes EEPROM: 0 bytes Assembly complete with no errors $ uisp -dprog=dapa --erase Atmel AVR ATmega8 is found. Erasing device ... Reinitializing device Atmel AVR ATmega8 is found. $ uisp -dprog=dapa --upload if=test.hex Atmel AVR ATmega8 is found. Uploading: flash
Dokumentation
Essentiell:
Assembler
Um mit dem Assembler einigermassen angenehm arbeiten zu koennen, braucht man die Registerdefinitionen des Atmega8, meistens in der Datei m8def.inc [4] zu finden.
Beispielprogramme
Einige einfache Beispielprogramme finden sich unter /EinfacheBeispiele
Hallo Welt, ich blinke (einfache Loesung)
.include "m8def.inc" .ORG 0x0 ; reset vector rjmp reset .ORG 0x13 reset: ; reset subprocedure ldi r16, low(RAMEND) ; init stack to point to RAMEND out SPL, r16 ldi r16, high(RAMEND) out SPH, r16 ldi r16, 0xff ; configure PORTB as output out DDRB, r16 rjmp loop ; start main loop wait: ; wait subprocedure ldi r16, 0xff ; init outer loop counter outer_loop: ldi r17, 0xff ; init inner loop counter delay_loop: dec r17 ; decrement inner loop counter brne delay_loop dec r16 ; decrement outer loop counter brne outer_loop ret loop: ; main loop ldi r16, 0x0 ; all bits on PORTB low (leds on) out PORTB, r16 rcall wait ; sleep ldi r16, 0xff ; all bits on PORTB high (leds off) out PORTB, r16 rcall wait ; sleep rjmp loop
Hallo Welt, ich blinke (elegante Loesung)
.include "m8def.inc" ; working register definitions .def w1 = r16 ; working registers .def w2 = r17 .ORG 0x0 ; reset vector rjmp reset .ORG OC1Aaddr ; Timer1 CompareA interrupt handler rjmp OC1AHandler .ORG 0x13 ; program start reset: ; reset subprocedure ldi w1, low(RAMEND) ; init stack to point to RAMEND out SPL, w1 ldi w1, high(RAMEND) out SPH, w1 ori w1, (1<<PB0) | (1<<PB1) | (1<<PB2) ; configure PB1-PB3 as output out DDRB, w1 ldi w1, 0b101 ; initial led state out PORTB, w1 ldi w1, 0 ; reset Timer1 out TCNT1H, w1 out TCNT1L, w1 ldi w1, high(15625) ; set timer compare match interrupt to occur after 1s out OCR1AH, w1 ldi w1, low(15625) out OCR1AL, w1 ldi w1, (1<<CS10) | (1<<CS11) ; divide system clock by 64 out TCCR1B, w1 clr w1 ; nothing else out TCCR1A, w1 ldi w1, (1<<OCIE1A) ; enable compare interrupt in global interrupt mask out TIMSK, w1 sei ; enable global interrupts rjmp main OC1AHandler: push w1 ; save w1 in w1, SREG ; save the status register push w1 ldi w2, 0xff ; toggle all leds in w1, PORTB eor w1, w2 out PORTB, w1 ldi w1, 0 ; reset timer1 out TCNT1H, w1 out TCNT1L, w1 pop w1 ; restore the status register out SREG, w1 pop w1 ; restore w1 reti main: rjmp main
raffiX' Notizen zu serieller Kommunikation
Nachdem ich nach einer Weile mit Versuchen, uisp ans Laufen zu bekommen, im IRC-Channel nachgefragt habe, wie ich denn über einen MAX232-Chip seriell mit meinem fnordlicht kommuniziere, darauf gestoßen worden bin, dass ich dafür ein anderes Tool brauche (nämlich avrdude), habe ich mich nach meiner Erarbeitung dazu entschlossen, hier ins wiki auch noch einmal einzutragen, was ich gemacht habe - damit alle etwas davon haben. Für alle Angaben übernehme ich keine Gewähr und sollten Fehler in meinen Handlungen sein, bitte einmal korrigieren. Bei mir hat's aber funktioniert. Um Missverständnissen vorzubeugen: Benutze SuSE Linux 9.1.
Zunächst einmal laden wir avrdude herunter. Das geht hier: [avrdude [5]]. Ich habe Version 5.0 genommen, das ging ganz gut. Dann einfach kompilieren und loslegen, Debian-Nutzer können auch einfach "apt-get install avrdude" als root machen. Ich habe zunächst ein Backup von meinem fnordlicht gezogen, um das schöne Programm nicht einfach zu löschen.
Vergiss nicht, dafür das fnordlicht mit Strom zu versorgen und den Jumper auf "en" zu stellen.
$ avrdude -p m8 -c butterfly -U flash:r:backup.bin:r Connecting to programmer: . Found programmer: Id = "AVRBOOT"; type = S Software Version = 0.7; No Hardware Version given. Programmer supports auto addr increment. Programmer supports buffered memory access with buffersize=64 bytes. Programmer supports the following devices: Device code: 0x76 avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e9307 avrdude: reading flash memory: Reading | ################################################## | 100% 4.61s avrdude: writing output file "backup.bin" avrdude: safemode: Fuses OK avrdude done. Thank you.
Dann habe ich das oben genannte Programm, das die roten LEDs anschaltet, kompiliert.
$ avra helloworld.asm AVRA: advanced AVR macro assembler Version 1.0.1 Build 113 (12. February 2004) Copyright (C) 1998-2004 Jon Anders Haugum, Tobias Weber [...] Pass 1... Pass 2... done Segment usage: Code : 8 words (16 bytes) Data : 0 bytes EEPROM : 0 bytes Assembly complete with no errors.
Nachdem das getan war, musste ich nur noch den Flash-Speicher freiräumen und das Binär-Programm draufspielen.
$ avrdude -p m8 -c butterfly -U flash:w:helloworld.hex
Ein seperates Erase kann man sich sparen, denn im Gegensatz zu uisp führt avrdude automatisch einen Chip-Erase durch.___________________________________________________________________________________________________________________ Um dann später das Backup wieder auf den Chip zu spielen, genügt ein einfaches
$ avrdude -p m8 -c butterfly -U flash:w:backup.bin
So, Kommentare sind erwünscht, wenn es geholfen hat, sage ich Gern geschehen.
Max' Liste von Befehlen für's fnordlicht am Terminal
Die folgende Tabelle beinhhaltet eine Liste von Befehlen mit denen man das fnordlicht am Terminal steuern kann. Ich glaube eine Voraussetzung ist das aktuelle Release der fnordlicht Firmware, download hier:
Einfach fnordlicht mit dem MAX232 Converter an die serielle Schnittstelle anschließen, Spannungsversorgung herstellen und im Terminal die verschiedenen Befehle ausprobieren. Müsste auch ohne Terminal gehen mit
echo TASTE > /dev/PORT
Einfache Programme die mit dem fnordlicht kommunizieren sollen müssten sich darüber schon realisieren lassen, ohne dass man den Assemblercode umschreibt.
Taste | Wirkung |
---|---|
x | reset ATMEL -> springt in den Bootloader falls Jumper auf "programmieren" gesetzt (Pos. 2-3) |
X | springt aus dem Bootloader wieder raus |
s | stoppe/starte alle Skripte (!Skriptstatus) |
1 | mache ROT dunkler |
2 | mache GRUEN dunkler |
3 | mache BLAU dunkler |
4 | mache ROT heller |
5 | mache GRUEN heller |
6 | mache BLAU heller |
0 | fade alle Farben runter |
Ich hoffe es hat dem Einen oder Anderen geholfen,
Max