Atmel Mikrocontroller Kickstart

From C4 Wiki
Revision as of 16:30, 17 March 2005 by Fd0 (talk | contribs) (Hallo Welt, ich blinke)
Jump to: navigation, search

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:

  • Atmega8 Datenblatt [2]
  • Atmel AVR Instruction Set [3]

Linkliste

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