Zorbing

[TGI] Geocaching-Lichtsensor

Jun 20th, 2013
331
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .include "m16def.inc"
  2.  
  3. .cseg                           ; Codesegment
  4. .org    0x000                   ; Code beginnt bei Adresse 0x000
  5. init:
  6.     ldi     R16,low(RAMEND)
  7.     out     SPL,R16
  8.     ldi     R17,high(RAMEND)
  9.     out     SPH,R17
  10.     jmp     main
  11.  
  12.  
  13. ; Main (b)+(h):
  14. ; =====
  15. main:
  16.     ldi     R17,(1<<CS00)       ; 1Mhz ist die Processor Clock
  17.     out     TCCR0,R17           ; Modus setzen (hier: Takt = Clock)
  18.     call    read
  19.     call    analyse
  20.     rjmp    main                ; noob... aehh, loop!
  21.  
  22.  
  23. ; (c):
  24. ; ====
  25. wait_x_ms:
  26.     push    R17
  27.     mov     R17,R16             ; Den Parameter von R16 zwischenspeichern
  28.     dec     R17                 ; R17-1
  29.     out     OCR0,R17            ; Parameter-1 in das OCR-Register schreiben
  30.     ldi     R17,(1<<OCF0)       ; Output compare flag...
  31.     out     TIFR,R17            ; ... resetten
  32.     clr     R17                 ; R17 = 0
  33.     out     TCNT0,R17           ; Timer zuruecksetzen
  34. poll:
  35.     in      R17,TIFR            ; TIFR-Register in R17
  36.     sbrs    R17,OCF0            ; falls OCF-Bit von TIFR nicht gesetzt ist...
  37.     rjmp    poll                ; ... loop
  38.     pop     R17
  39.     ret
  40.  
  41.  
  42. ; (d):
  43. ; ====
  44. wait_10us:
  45.     nop                         ; nichts tun...
  46.     nop                         ; ... und noch mehr davon!
  47.     ret
  48.  
  49.  
  50. ; (e):
  51. ; ====
  52. read:
  53.     ldi     R16,(1<<DDA0)       ; PINA
  54.     out     DDRA,R16            ; konfigurieren
  55.     call    wait_10us           ; 10us warten
  56.     in      R16,PINA            ; Wert von PINA laden
  57.     lsr     R16                 ; und PINA0 rausschiften
  58.     ret
  59.  
  60.  
  61. ; (f):
  62. ; ====
  63. analyse:
  64.     push    R16
  65.     sbrs    R16,0               ; falls der 1.Bit von R16...
  66.     rjmp    analyse_wait        ; ... 0 ist, dann warte
  67.     call    blink               ; ansonsten, blinke
  68.     rjmp    analyse_end         ; analyse beendet
  69. analyse_wait:
  70.     ldi     ZL,low(tab*2)       ; lade, wie
  71.     ldi     ZH,high(tab*2)      ; lange
  72.     lpm     R16,Z               ; gewartet
  73.     call    wait_x_ms           ; werden soll
  74. analyse_end:
  75.     pop     R16
  76.     ret
  77.  
  78.  
  79. ; (g):
  80. ; ====
  81. blink:
  82.     push    R16
  83.     push    R17
  84.     ldi     ZL,low(tab*2+1)             ; Zweiten Wert
  85.     ldi     ZH,high(tab*2+1)            ; aus der Tabelle
  86.     lpm     R17,Z                       ; laden
  87.     ldi     R16,(1<<DDA0)|(1<<DDA1)     ; DDRA-Register
  88.     out     DDRA,R16                    ; konfigurieren
  89.     ldi     R16,26                      ; wait_x_ms benoetigt selber 24 Takte, deshalb nur 26 Takte warten
  90.     ldi     R18,(1<<PORTA0)|(1<<PORTA1) ; LED an
  91.     ldi     R19,(1<<PORTA0)             ; LED aus
  92. blink_loop:
  93.     out     PORTA,R18                   ; setze den PORTA auf LED-an
  94.     call    wait_x_ms                   ; warte
  95.     out     PORTA,R19                   ; setze den PORTA auf LED-aus
  96.     call    wait_x_ms                   ; warte
  97.     dec     R17                         ; Zaehler dekrementieren...
  98.     brne    blink_loop                  ; ... falls dieser noch nicht bei 0 angekommen ist: loop
  99. blink_end:
  100.     ldi     R16,(1<<DDA0)               ; DDRA-Register
  101.     out     DDRA,R16                    ; rekonfigurieren
  102.     pop     R17
  103.     pop     R16
  104.     ret
  105.  
  106.  
  107. ; Tabelle:
  108. ; ========
  109. tab:
  110.     .db     6,10                ; Wartezeit in ms, Anzahl des Blinkens
Advertisement
Add Comment
Please, Sign In to add comment