Published using Google Docs
( CE1372.fth )
Updated automatically every 5 minutes

TACHYON

[~

FORGET CE1372.fth

pub CE1372.fth                ." CE1372 WIDGET HARDWARE DEFINITIONS 140918.2200 " ;

( CE1372 PCB )

IFDEF &SDCS

--- redefine WIZnet and SD card I/O constants ---

#P12        |< ' &WNDO 1+ !             '' MISO from WIZNET

#P13        |< ' &WNCS 1+ !             '' WIZNET CS

#P14        |< ' &WNCK 1+ !             '' WIZNET SPI CLOCK

#P15        |< ' &WNDI 1+ !             '' MOSI to WIZNET

#P26        |< ' &SDCS 1+ !             '' SDCARD CS

#P27        |< ' &SDDO 1+ !             '' Data out from SDCARD

#P28        |< ' &SDCK 1+ !             '' SDCARD clocks (Shared with SCL)

#P29        |< ' &SDDI 1+ !             '' Data to SDCARD (Shared with SDA)

}

( P8X32A PINOUTS )

#P0         |< == &TR1              '' RS485 CH1 tx + rx

#P1         |< == &TE1              '' RS485 CH1 Transmit enable

#P2         |< == &TR2              '' RS485 CH2 tx + rx

#P3         |< == &TE2              '' RS485 CH2 Transmit enable

#P4            == DTR232            '' RS232 DTR

#P5            == TXD232            '' RS232 TXD == BUSY (pin low -> 232 HI = busy)

#P6            == RTS232            '' RS232 RTS == PAPER GOOD (pin low -> 232 HI)

#P7            == RI232             '' RS232 RI

#P8            == CTS232            '' RS232 CTS

#P9            == RXD232            '' RS232 RXD

#P10           == DSR232            '' RS232 DSR

#P11           == DCD232            '' RS232 DCD

[PRIVATE

#P12        |< == &WNDO             '' MISO from WIZNET

#P13        |< == &WNCS             '' WIZNET CS

#P14        |< == &WNCK             '' WIZNET SPI CLOCK

#P15        |< == &WNDI             '' MOSI to WIZNET

\ #P16        |< == &P16              '' I/O MODULE or VGA

\ #P17        |< == &P17

\ #P18        |< == &P18

\ #P19        |< == &P19

\ #P20        |< == &P20

\ #P21        |< == &P21

\ #P22        |< == &P22

\ #P23        |< == &P23

#P24        |< == &IOCS             '' I/O MODULE CS (PUPPY FORMAT)

#P25        |< == &SFCS             '' Serial flash CS (WINBOND W25Q80 8Mbit Flash)

#P26        |< == &SDCS             '' SDCARD CS

#P27        |< == &SDDO             '' Data out from SDCARD

#P28        |< == &SDCK             '' SDCARD clocks (Shared with SCL)

#P29        |< == &SDDI             '' Data to SDCARD (Shared with SDA)

\ 0           == &WNRST

PRIVATE]

( I2C PORTS )

BYTE leds

\ exectime = 12us

pub LED ( state led -- )

        MASK SWAP NOT leds SWAP IF SET EXIT THEN CLR

        ;

pub LEDS 

        leds C@ 1

pub LEDREG!

         I2CSTART $40 I2C! I2C! I2C! I2CSTOP

         ;

\ exectime = 144us

pub !LEDS                           

         $7C leds C! 1 3 LEDREG! $81 3 LEDREG!

         LEDS

        ;

pub ERRORLED                        1 LED ;

pub RS232LED                        2 LED ;

pub LANLED

pub RS485LED                        3 LED ;

pub SDERRLED                        4 LED LEDS ;

pub SDBSYLED                        5 LED LEDS ;

pub READYLED                        6 LED LEDS ;

pub WRESET ( on/off -- )        7 LED LEDS ;

pub WPWRDN ( on/off )                NOT 0 LED LEDS ;

--- select MCP79410 RTC if driver is already loaded

IFDEF MCP79410 MCP79410 }

IFNDEF MCP79410

( MCP79410 RTC DRIVER )

$DE        == @rtc                \ RTC I2C ADDRESS

8 BYTES rtcbuf PRIVATE

\ Read first 8 timekeeping bytes of RTC into rtcbuf

pri RDRTC ( reg cnt -- )

        I2CSTART @rtc I2C! OVER I2C! I2CSTART @rtc 1+ I2C!        // address RTC and register

        rtcbuf ROT + SWAP ADO 0 I2C@ I C! LOOP 1 I2C@ DROP        // read in cnt bytes into buffer+reg

        I2CSTOP

        ;  

\ Write first 8 timekeeping bytes of RTC from rtcbuf

pri WRRTC

        I2CSTART @rtc I2C! 0 I2C!

        rtcbuf 8 ADO I C@ I2C! LOOP

        I2CSTOP

        ;

pri BCD>DEC ( bcd -- dec )

        DUP >N SWAP 4 SHR #10 * +

        ;

pri DEC>BCD ( dec -- bcd )

        #10 U/MOD 4 SHL +

        ;

        

pub TIME@ ( -- #hhmmss ) \ read time in decimal format

        0 3 RDRTC

        rtcbuf 2+ C@ $3F AND BCD>DEC #10000 *

        rtcbuf 1+ C@ BCD>DEC #100 * +

        rtcbuf C@ $7F AND BCD>DEC +

        ;

pub TIME! ( #hh.mm.ss -- ) \ write time in decimal format

        0

pri TD! ( #nn.nn.nn n -- )

SWAP OVER 3 RDRTC

        #100 U/MOD SWAP DEC>BCD $80 OR 4TH rtcbuf C!

        #100 U/MOD SWAP DEC>BCD rtcbuf 1+ C!

        DEC>BCD rtcbuf 2+ C!

        WRRTC

        ;

pub DATE@ ( -- #yymmdd ) \ read international date in decimal format

        4 3 RDRTC

        rtcbuf 6 + C@ BCD>DEC #10000 *

        rtcbuf 5 + C@ $3F AND BCD>DEC #100 * +

        rtcbuf 4 + C@ $3F AND BCD>DEC +

        ;

\ Usage: #130630 DATE! \ set the date to the 30th June 2013

pub DATE! ( #yy.mm.dd -- )

        4 3 RDRTC

        #100 U/MOD SWAP DEC>BCD rtcbuf 4 + C!

        #100 U/MOD SWAP DEC>BCD rtcbuf 5 + C!

        DEC>BCD rtcbuf 6 + C!

        WRRTC

        ;

pub DAY@ ( -- day ) --- read the day of the week as 0-6

        3 1 RDRTC rtcbuf 3 + C@ 7 AND

        ;

pub DAY! ( day -- )

        rtcbuf 3 + C@ 7 ANDN + rtcbuf 3 + C! WRRTC

        ;

pri .DTFMT ( value sep -- )

         SWAP #10 >RADIX <# # # OVER HOLD # # SWAP HOLD # # #> PRINT$ RADIX>

         ;

pub .TIME                 TIME@ ":" .DTFMT ;

\ Print date in international format YYYY/MM/DD (otherwise 1/12/2013 could be 1st of December or 12th of January)

pub .DATE                DATE@ "/" .DTFMT ;

pub .DAY                DAY@ 1- 3 * " MONTUEWEDTHUFRISATSUN" + 3 CTYPE ;

pri .ASMONTH ( index -- )

        >N 1- 3 *

        " JanFebMarAprMayJunJulAugSepOctNovDec" + 3 CTYPE

        ;

pub .DT                .DATE SPACE .DAY SPACE .TIME ;        

}

( PCB DEFINITIONS )

\ Do what we need to do to init the hardware on this pcb

pub !PCB

         !LEDS ON READYLED

        ;

" CE1372 WIDGET" 0 STRING PCB$

#1372         == PCB

]~

END