;
;    Mecrisp - A native code Forth implementation for MSP430 microcontrollers
;    Copyright (C) 2011  Matthias Koch
;
;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;    (at your option) any later version.
;
;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.
;
;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
;

; Die hardwareabhängigen Teile des Taktlauschers...
; Wird die LED anders angeschlossen, müssen hier die entsprechenden Pins/Ports geändert werden.
; Entstanden am 23. Juni 2007 aus der Feder von Matthias Koch

;------------------------------------------------------------------------------
; LED: Anode an P1.1
;    Kathode an P1.0 über Poti-Vorwiderstand ca 60 Ohm
;------------------------------------------------------------------------------

led_anode   equ 00000010b
led_kathode equ 00000001b

;------------------------------------------------------------------------------
 Wortbirne Flag_sichtbar, "led-prepare"

Lauschen_Vorbereitung: ; Bereitet das Lauschen nach Licht vor 
;------------------------------------------------------------------------------
  ; LED aufladen -- Kathode an Vcc, Anode an GND
  bic.b #led_anode,   &P1OUT            ; P1.1 (A) low
  bis.b #led_kathode, &P1OUT            ; P1.0 (K) high
  bis.b #led_anode+led_kathode, &P1DIR ; P1.0 und P1.1 auf Ausgabe schalten   

  ; Warte, bis P1.0 high, also LED geladen...  
- bit.b #led_kathode, &P1IN  ; Prüfe Pin P1.0
  jz -                       ; Pin noch Low ? Prüfe nochmal !

  ; LEDC (Ledkondensator) ist jetzt voll geladen.
  ; Entladungsmessung beginnen -- Kathode als Eingang, Anode an GND
  bic.b #led_kathode, &P1DIR ; P1.0 (K) Eingang  
  ; Kathode ist positiv geladen, warte also, bis P1.0 auf low geht  
  ret
  
;------------------------------------------------------------------------------
 Wortbirne Flag_sichtbar, "led-look"
  flagdolmetscher
Lauschen_Nachbearbeitung: ; Lauscht nach Licht und gibt Licht - Carry gesetzt oder 
                         ;                             Dunkelheit - Carry nicht gesetzt zurück.
;------------------------------------------------------------------------------    
  bit.b #led_kathode, &P1IN   ; Prüfe die Kathode an P1.0  
                              ; Carry = Led noch geladen = Dunkelheit.
  xor #1, sr                  ; Carry := not Carry, möchte es gerne umgekehrt haben. (Invertiere Carry)      
  ret

;------------------------------------------------------------------------------
 Wortbirne Flag_sichtbar, "led-on"
Strahle: ; Strahlt einen Basiszeitimpuls ab...
;------------------------------------------------------------------------------  
  ; Kathode an GND, Anode an Vcc
  bis.b #led_anode, &P1OUT ; P1.1 (A) high
  bic.b #led_kathode, &P1OUT ; P1.0 (K) low
  bis.b #led_anode+led_kathode, &P1DIR ; P1.0 und P1.1 auf Ausgabe schalten      
  ret
  
;------------------------------------------------------------------------------
 Wortbirne Flag_sichtbar, "led-off"
Schweige: ; Wenn einmal Dunkelheit das Mittel der Wahl sein sollte...
;------------------------------------------------------------------------------
  ; Kathode an GND, Anode an GND
  bic.b #led_anode+led_kathode, &P1OUT ; Pins P1.0 (K) und P1.1 (A) low
  bis.b #led_anode+led_kathode, &P1DIR ; P1.0 und P1.1 auf Ausgabe schalten     
  ret  