\
\    Mecrisp-Across - A Forth cross compiler for small MSP430 microcontrollers
\    Copyright (C) 2016  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/>.
\


\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\  8. Teil: Schließlich jenes, was kompiliert werden soll :-)
\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

new \ Das Dictionary des Crosscompilers zurücksetzen

\ <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
    TARGET
\ <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

: us 0 ?do i i + drop i i + drop loop inline ; \ Für 8 MHz bemessen
: ms 0 ?do 998 us loop ;

: launchpad-init \ Launchpad hardware initialisations
  8 p1out cbis! \ High
  8 p1ren cbis! \ Pullup for button

  1 64 or p1out cbic! \ LEDs off
  1 64 or p1dir cbis! \ LEDs are outputs
;

: pwm-init ( Interval -- ) \ Init PWM on green LED
  64 p1dir cbis! \ Output
  64 p1sel cbis! \ Timer special function

  \ Configure Timer-A

       $172 ! \ PWM Interval in cycles
  $E0  $164 ! \ CCR1 Set/Reset
  0    $174 ! \ CCR1 PWM Duty Cycle
  $210 $160 ! \ SMCLK/1, upmode
;

: pwm ( Duty-Cycle -- ) $174 ! ; \ Sets duty cycle


1 constant Anode     \ Ein kleines Beispiel für den MSP430G2553:
2 constant Kathode    \ Helligkeitsmessung mit einer Leuchtdiode

: Strahle ( -- )
  Anode   P2OUT cbis!
  Kathode P2OUT cbic!
  Anode Kathode or P2DIR cbis!  ;

 : Lichtmessungs-Vorbereitung ( -- )
   Anode   P2OUT cbic!            \ Sperrschichtkapazität
   Kathode P2OUT cbis!            \ durch Verpolung laden
   Anode Kathode or P2DIR cbis!
   begin Kathode P2IN cbit@ until \ Warte bis Kathode geladen ist
   Kathode P2DIR cbic!   ;

: Kathodenochgeladen? ( -- ? ) Kathode P2IN cbit@ ;


: Wiedunkel? ( -- u )
  Lichtmessungs-Vorbereitung
  0
  begin
    50 us
    Kathodenochgeladen?
  while
    1+
  repeat
;

: Schatten ( -- )
  launchpad-init 8MHz uart-init

  Strahle 1000 ms

  500 pwm-init
  begin
    Wiedunkel? dup pwm hex. cr
  again
;

\ <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
    HOST
\ <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

$FFFE vector Schatten  \ Vektortabelle füllen und Einsprungpunkte definieren
crosscompile            \ Zeit für die Crosscompilation !

\ -----------------------------------------------------------------------------

\ Was hat der Compiler daraus gemacht ?

\ t-listing
t-listing-file brightness.list

\ Was ist entstanden ? Einen tiefen Einblick für den Menschen ermöglichen.

disimage
disimage-file brightness.asm

\ Und die fertige Intel-Hex-Datei für den Chip ausgeben.

hexdump
hexdump-file brightness.hex

