MezData-Logo

Blinklicht und Lauflicht mit Assembler

Blinklicht

Die LED an PB1 des ATtiny2313 soll im Sekundentakt blinken (500ms an, 500ms aus). Die Zeit soll mit Warteschleifen realisiert werden.

Unterprogrammaufruf und Stack

Damit bei Unterprogrammaufrufen die Rücksprungadresse gemerkt werden kann ist ein Stapelspeicher (Stack) erforderlich. Der Stackpointer wird direkt nach dem Reset initialisiert:

reset: 
  ldi tmp, low(RAMEND) ;Stackpointer initialisieren 
  out SPL,tmp 

Programm in Assembler und C

[Blinklicht.asm] [Blinklicht.c]
; *** Blinklicht 1.1 (c) Oliver Mezger 21.2.2011

.include "tn2313def.inc"

.def tmp = R16      ;Temporaeres Register
.def innen = R20    ;Hilfsregister fuer Warteschleife
.def aussen = R21   ;Hilfsregister fuer Warteschleife
.def wtmp = R22     ;Hilfsregister fuer Warteschleife

.equ clk = 4    ;CPU-Takt in MHz

reset:
  ldi tmp, low(RAMEND) ;Stackpointer initialisieren
  out SPL,tmp
  ldi tmp, 0xff
  out PORTB,tmp     ;alle LED aus
  out DDRB,tmp      ;alles auf Ausgang
loop:
  cbi PORTB,1       ;LED1 an 
  rcall warte500ms  ;Unterprogrammaufruf
  sbi PORTB,1       ;LED1 aus
  rcall warte500ms
  rjmp loop

warte500ms:         ;Unterprogramm 500ms Warten
  ldi wtmp, 50
w50loop:
  rcall warte10ms
  dec wtmp
  brne w50loop
  ret

warte10ms:          ;Unterprogramm 10ms Warten
  ldi aussen,clk*10 ;anpassen an CPU-Takt
loop_aussen:
  ldi innen,250
loop_innen:
  nop
  dec innen
  brne loop_innen
  dec aussen
  brne loop_aussen
  ret
// *** Blinklicht 1.1 (c) Oliver Mezger 21.2.2011

#include <avr/io.h>     // Definitionen laden
#include <util/delay.h> // Delay-Bibliothek laden

// Blinklicht mit STK 200 (LED neg. Logik) und ATtiny2313
int main(){         // Hauptprogramm
  PORTB=0xff;       // alle LED aus
  DDRB=0xff;        // PB als Ausgang
  while(1){         // Endlosschleife
    PORTB &= 0b11111101; // LED1 an
    _delay_ms(500); // warte 500ms
     PORTB |= 0b00000010; // LED1 aus
    _delay_ms(500); // warte 500ms
  }
  return 0;
}

Lauflicht [Demo]

Lösung anzeigen..

Knight Rider [Knight Rider] [Demo]

Lösung anzeigen..

Balkenanzeige [Demo1] [Demo2]