Zorbing icon

[TGI] Geocaching-Lichtsensor

Zorbing | PRO | 06/20/13 10:12:40 PM UTC | 0 ⭐ | 304 👁️ | Never ⏰ | []
ASM (NASM) |

0 B

|

None

|

0 👍

/

0 👎

.include "m16def.inc"
 
.cseg                           ; Codesegment
.org    0x000                   ; Code beginnt bei Adresse 0x000
init:
    ldi     R16,low(RAMEND)
    out     SPL,R16
    ldi     R17,high(RAMEND)
    out     SPH,R17
    jmp     main
 
 
; Main (b)+(h):
; =====
main:
    ldi     R17,(1<<CS00)       ; 1Mhz ist die Processor Clock
    out     TCCR0,R17           ; Modus setzen (hier: Takt = Clock)
    call    read
    call    analyse
    rjmp    main                ; noob... aehh, loop!
 
 
; (c):
; ====
wait_x_ms:
    push    R17
    mov     R17,R16             ; Den Parameter von R16 zwischenspeichern
    dec     R17                 ; R17-1
    out     OCR0,R17            ; Parameter-1 in das OCR-Register schreiben
    ldi     R17,(1<<OCF0)       ; Output compare flag...
    out     TIFR,R17            ; ... resetten
    clr     R17                 ; R17 = 0
    out     TCNT0,R17           ; Timer zuruecksetzen
poll:
    in      R17,TIFR            ; TIFR-Register in R17
    sbrs    R17,OCF0            ; falls OCF-Bit von TIFR nicht gesetzt ist...
    rjmp    poll                ; ... loop
    pop     R17
    ret
 
 
; (d):
; ====
wait_10us:
    nop                         ; nichts tun...
    nop                         ; ... und noch mehr davon!
    ret
 
 
; (e):
; ====
read:
    ldi     R16,(1<<DDA0)       ; PINA
    out     DDRA,R16            ; konfigurieren
    call    wait_10us           ; 10us warten
    in      R16,PINA            ; Wert von PINA laden
    lsr     R16                 ; und PINA0 rausschiften
    ret
 
 
; (f):
; ====
analyse:
    push    R16
    sbrs    R16,0               ; falls der 1.Bit von R16...
    rjmp    analyse_wait        ; ... 0 ist, dann warte
    call    blink               ; ansonsten, blinke
    rjmp    analyse_end         ; analyse beendet
analyse_wait:
    ldi     ZL,low(tab*2)       ; lade, wie
    ldi     ZH,high(tab*2)      ; lange
    lpm     R16,Z               ; gewartet
    call    wait_x_ms           ; werden soll
analyse_end:
    pop     R16
    ret
 
 
; (g):
; ====
blink:
    push    R16
    push    R17
    ldi     ZL,low(tab*2+1)             ; Zweiten Wert
    ldi     ZH,high(tab*2+1)            ; aus der Tabelle
    lpm     R17,Z                       ; laden
    ldi     R16,(1<<DDA0)|(1<<DDA1)     ; DDRA-Register
    out     DDRA,R16                    ; konfigurieren
    ldi     R16,26                      ; wait_x_ms benoetigt selber 24 Takte, deshalb nur 26 Takte warten
    ldi     R18,(1<<PORTA0)|(1<<PORTA1) ; LED an
    ldi     R19,(1<<PORTA0)             ; LED aus
blink_loop:
    out     PORTA,R18                   ; setze den PORTA auf LED-an
    call    wait_x_ms                   ; warte
    out     PORTA,R19                   ; setze den PORTA auf LED-aus
    call    wait_x_ms                   ; warte
    dec     R17                         ; Zaehler dekrementieren...
    brne    blink_loop                  ; ... falls dieser noch nicht bei 0 angekommen ist: loop
blink_end:
    ldi     R16,(1<<DDA0)               ; DDRA-Register
    out     DDRA,R16                    ; rekonfigurieren
    pop     R17
    pop     R16
    ret
 
 
; Tabelle:
; ========
tab:
    .db     6,10                ; Wartezeit in ms, Anzahl des Blinkens

Comments