Difference between revisions of "Atmel Mikrocontroller Kickstart"

From C4 Wiki
Jump to: navigation, search
(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 16:30, 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