Difference between revisions of "Atmel Mikrocontroller Kickstart"

From C4 Wiki
Jump to: navigation, search
(Assembler)
(Hallo Welt, ich blinke)
Line 88: Line 88:
  
 
==Hallo Welt, ich blinke==
 
==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

Revision as of 15:28, 17 March 2005

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