Difference between revisions of "Atmel Mikrocontroller Kickstart"
(→Hallo Welt, ich blinke) |
(→Hallo Welt, ich blinke) |
||
Line 92: | Line 92: | ||
.ORG 0x0 ; reset vector | .ORG 0x0 ; reset vector | ||
rjmp reset | rjmp reset | ||
− | + | ||
− | + | ||
.ORG 0x13 | .ORG 0x13 | ||
reset: ; reset subprocedure | reset: ; reset subprocedure | ||
Line 100: | Line 100: | ||
ldi r16, high(RAMEND) | ldi r16, high(RAMEND) | ||
out SPH, r16 | out SPH, r16 | ||
− | + | ||
ldi r16, 0xff ; configure PORTB as output | ldi r16, 0xff ; configure PORTB as output | ||
out DDRB, r16 | out DDRB, r16 | ||
− | + | ||
rjmp loop ; start main loop | rjmp loop ; start main loop | ||
− | + | ||
wait: ; wait subprocedure | wait: ; wait subprocedure | ||
ldi r16, 0xff ; init outer loop counter | ldi r16, 0xff ; init outer loop counter | ||
Line 113: | Line 113: | ||
dec r17 ; increment inner loop counter | dec r17 ; increment inner loop counter | ||
brne delay_loop | brne delay_loop | ||
− | + | ||
dec r16 ; decrement outer loop counter | dec r16 ; decrement outer loop counter | ||
brne outer_loop | brne outer_loop | ||
ret | ret | ||
− | + | ||
loop: ; main loop | loop: ; main loop | ||
ldi r16, 0x0 ; all bits on PORTB low (leds on) | ldi r16, 0x0 ; all bits on PORTB low (leds on) | ||
out PORTB, r16 | out PORTB, r16 | ||
− | + | ||
call wait ; sleep | call wait ; sleep | ||
− | + | ||
ldi r16, 0xff ; all bits on PORTB high (leds off) | ldi r16, 0xff ; all bits on PORTB high (leds off) | ||
out PORTB, r16 | out PORTB, r16 | ||
− | + | ||
call wait ; sleep | call wait ; sleep | ||
− | + | ||
rjmp loop | rjmp loop |
Revision as of 15:30, 17 March 2005
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
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. "avra" und 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:
Linkliste
- http://del.icio.us/fd0/atmel
- http://del.icio.us/cebewee/electronics
- http://www.avrbeginners.net
- http://www.mikrocontroller.net
- http://www.avrfreaks.net
- http://www.atmel.com
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.
Hallo Welt, ich blinke
.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 ; increment 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 call wait ; sleep ldi r16, 0xff ; all bits on PORTB high (leds off) out PORTB, r16 call wait ; sleep rjmp loop