program RTC6705_TX_Ctrl_DIP '**************************************************************** ' RTC6705 Einsteller mit Schaltern für Pic16F628 (intosc 4MHz) * ' * ' -- Version V1a 31.02.2014 * ' - erster versuch * ' * '**************************************************************** ' Bits die zu übertragen sind * ' A0 A1 A2 A3 Registeradresse * ' RW Lese/Schreib Adresse Schreiben = 1 * ' D0 D1 D2 D3 D4 D5 D6 A-Counter * ' D7 bis D19 N-Counter * ' sind zusammen 25 Bit zu übertragen * '**************************************************************** '**************************************************************** ' Ein und Ausgänge * ' SPI-Leitungen * '**************************************************************** ' SPI Pins dim LE as sbit at RA0_bit CLK as sbit at RA1_bit DAT as sbit at RA7_bit '**************************************************************** ' Variable * '**************************************************************** Temp_alt as byte Temp as byte QRG as word I as byte Daten as longword ' da haben 32Bit Platz Daten_t as longword ' da haben 32Bit Platz '**************************************************************** ' Konstanten * '**************************************************************** const Start = 5600 ' 5600 = 5600MHz '**************************************************************** ' Initialisierung * '**************************************************************** sub procedure Init() CMCON = 7 ' Schaltet die PortA-Pins auf I/O TRISB = %11111111 ' PORT B ist Eingang OPTION_REG = %00000000 ' PORT B Pullups einschalten TrisA = %01111100 ' SPI Ausgänge 0,1,7 Schalten LE = 1 ' Leitungen definiert setzen CLK = 0 Temp_alt = PORTB + 1 Delay_ms(2000) ' Pause damit sich alles resetten kann end sub '**************************************************************** ' SPI-Schnittstelle nachgebaut weil sonst nur Bytes über SPI * ' ausgegeben werden können (25Bit) * '**************************************************************** sub procedure Spi_out() LE = 0 Delay_us(1) For I = 0 to 24 ' 25Bit hinausschieben LSBs zuerst DAT = Daten.i ' Datenleitung setzen Delay_us(1) CLK = 1 ' Clock- Leitung umschalten Delay_us(1) CLK = 0 Delay_us(1) next I ' nächstes Bit LE = 1 ' Leitungen definiert setzen Delay_us(1) end sub '**************************************************************** ' Daten zusammenbaun * '**************************************************************** sub procedure Daten_baun() Daten_t = (qrg * 100)/256 ' N-Counter berechnen Daten = Daten_t << 12 ' Daten_t an die richtige Stelle schieben Daten_t = (qrg * 25)-(Daten_t*64) ' A-Counter berechnen Daten_t = Daten_T << 5 ' Daten_t an die richtige Stelle schieben Daten = Daten or Daten_t ' und auf Daten schreiben Daten = Daten or %10001 ' 1000 Adresse + 1 RW end sub '**************************************************************** ' Hauptprogramm * '**************************************************************** main: Init() while TRUE Temp = PORTB If Temp <> Temp_alt then ' Prüfen ob sich Schalter geändert haben Temp_alt = Temp ' Status merken QRG = Start + Temp ' 5600MHz + Temp*1MHz Daten_baun() SPI_Out() end if wend ' für immer end.