fratello Postat Iunie 27, 2020 Partajează Postat Iunie 27, 2020 Incerc sa compilez softul de pe prima pagina, care merge pe 16F1824, tot cu 4k ROM.... Link spre comentariu
UDAR Postat Iunie 27, 2020 Partajează Postat Iunie 27, 2020 în acest caz, scuze ! Eu m-am uitat în postul tău unde ai compilat cu succes pe 1825 - de acolo de altfel am luat și mărimea programului . Link spre comentariu
Kreator Postat Iunie 27, 2020 Autor Partajează Postat Iunie 27, 2020 @fratello incearca codul de mai jos. Mie mi-a compilat program Ceas_MAX7219_PIC1827 ' Declarations section Const cnfgww As Byte = %11010000 'Adress for write DS3231 Const cnfgwr As Byte = %11010001 'Adress for read DS3231 const MAX7219_TEST as byte =0x0F const MAX7219_BRIGHTNESS as byte = 0x0A const MAX7219_SCAN_LIMIT as byte = 0x0B const MAX7219_DECODE_MODE as byte = 0x09 const MAX7219_SHUTDOWN as byte = 0x0C const mxbt As Byte[11] =(0, 23, 59, 31, 12, 99, 59, 23, 59, 15, 1) ' max value const mnbt As Byte[11] =(0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0) ' min value const stadrs As Byte[11] =(0, 0x02, 0x01, 0x04, 0x05, 0x06, 0x00, 0x09, 0x08, 0x0B, 0x0D) ' Adress data RTC const alfabet as byte [16] [8]= (( 30, 63, 51, 51, 51, 51, 63, 30), '0 ( 6, 14, 30, 6, 6, 6, 6, 15), '1 ( 30, 63, 35, 6, 12, 24, 63, 63), '2 ( 30, 63, 35, 14, 14, 35, 63, 30), '3 ( 6, 14, 30, 54, 54, 63, 6, 15), '4 ( 62, 63, 48, 62, 51, 3, 63, 30), '5 ( 30, 63, 48, 62, 51, 51, 63, 30), '6 ( 63, 63, 3, 6, 12, 12, 12, 12), '7 ( 30, 63, 51, 30, 51, 51, 63, 30), '8 ( 30, 63, 51, 51, 31, 3, 63, 30), '9 ( 0, 0, 0, 0, 0, 0, 0, 0), 'blank ( 0, 3, 3, 0, 0, 3, 3, 0), 'dp (120, 124, 68, 64, 64, 68, 124, 120), 'C ( 56, 109, 109, 109, 57, 1, 1, 0), '` ( 62, 63, 51, 62, 51, 51, 63, 62), 'B ( 0, 0, 27, 31, 28, 24, 24, 24)) 'r Dim CS as sbit at RB3_bit 'Chip Select pin for MAX7219 CS_Direction as sbit at TRISB3_bit Dim Soft_I2C_Sda as sbit at RB6_bit 'SDA pin for DS3231 Dim Soft_I2C_Scl as sbit at RB7_bit 'SCL pin for DS3231 Dim Soft_I2C_Sda_Direction as sbit at TRISB6_bit Dim Soft_I2C_Scl_Direction as sbit at TRISB7_bit Dim i,j, x, y, yy, bright, m, s_, z_, u, dp, str as byte Dim k, k0, k1, k4, k5, al as byte Dim flgal, flsh, x0, x1, x5, flgint, pflgint as bit Dim ma, sa, za, uua, utmp, ztmp, stmp, ltmp, rtmp, mtmp as byte[8] Dim dsp, th_dsp, h_dsp as byte[32] Dim s0, s1, m0, m1, h0, h1, ah0, ah1, am0, am1 As Byte Dim d0, d1, mo0, mo1, y0, y1, th0, th1, br1, br0 As Byte Dim btset, btmod, btvar, btmp, grc As Byte sub function I2CR(dim byref adress as byte) as byte ' Read value from RTC Soft_I2C_Start() ' Issue start signal Soft_I2C_Write(cnfgww) ' Address DS3221 datasheet Soft_I2C_Write(adress) ' Go to adresa Soft_I2C_Start() ' Issue repeated start signal Soft_I2C_Write(cnfgwr) ' Address for reading R/W=1 result = Soft_I2C_Read(0) ' Read with NAK Soft_I2C_Stop() ' Stop end sub sub procedure I2CW(dim adress, value as byte) ' Write value in TRC Soft_I2C_Start() ' Issue start signal Soft_I2C_Write(cnfgww) ' Address Soft_I2C_Write(adress) ' Go to adresa Soft_I2C_Write(value) ' Write valoare Soft_I2C_Stop() ' Stop end sub sub procedure read_RTC() ' Read some data from RTC btmp=0x00 btmp=I2CR(btmp) 'sec s0 = btmp Mod 16 s1 = btmp / 16 btmp=0x01 btmp=I2CR(btmp) 'min m0 = btmp Mod 16 m1 = btmp / 16 btmp=0x02 btmp=I2CR(btmp) 'hour h0 = btmp Mod 16 h1 = btmp / 16 btmp=0x04 btmp=I2CR(btmp) 'day d0 = btmp Mod 16 d1 = btmp / 16 btmp=0x05 btmp=I2CR(btmp) 'mounth mo0 = btmp Mod 16 mo1 = btmp / 16 btmp=0x06 btmp=I2CR(btmp) 'year y0 = btmp Mod 16 y1 = btmp / 16 btmp=0x08 btmp=I2CR(btmp) 'almin am0 = btmp Mod 16 am1 = btmp / 16 btmp=0x09 btmp=I2CR(btmp) 'alhour ah0 = btmp Mod 16 ah1 = btmp / 16 btmp=0x11 btmp=I2CR(btmp) 'temp th0 = btmp Mod 10 th1 = btmp / 10 btmp=0x0B bright=I2CR(btmp) ' brightness br0 = bright Mod 16 br1 = bright / 16 btmp=0x0C al=I2CR(btmp) ' set alarm On/Off btmp=0x0F btmp=I2CR(btmp) ' flag alarm flgal=btmp.0 btmp=0x0D btmp=I2CR(btmp) ' Temperature On/Off grc=btmp end sub sub procedure maxCMD (dim address, value as byte) ' Send command to MAX7219 CS = 0 for i = 0 to 3 SPI_Write(address) '// Send address. SPI_Write(value) '// Send the value. next i CS = 1 end sub sub procedure max7219_init() ' Initialize MAX7219 maxCMD(MAX7219_TEST, 0x01) ' Test mode maxCMD(MAX7219_TEST, 0x00) ' Finish test mode maxCMD(MAX7219_DECODE_MODE, 0x00) ' Disable BCD mode maxCMD(MAX7219_BRIGHTNESS, bright) ' Use lowest intensity maxCMD(MAX7219_SCAN_LIMIT, 0x0f) ' Scan all digits maxCMD(MAX7219_SHUTDOWN, 0x01) ' Turn on chip end sub 'Prepare hour data sub procedure prepare_to_show_hour(dim m, s_, z_, u, dp1, al1 as byte) for i = 0 to 7 ma[i] = alfabet[m] [i] sa[i] = alfabet[s_] [i] za[i] = alfabet[z_] [i] uua[i] = alfabet[u] [i] next i for i = 0 to 7 utmp[i]=uua[i] next i for i = 0 to 7 utmp[i].7 =za[i].0 next i for i = 0 to 7 ztmp[i]=za[i]>>1 next i for i = 0 to 7 ztmp[i].6 = alfabet[10 + dp1] [i]. 0 ztmp[i].7 = alfabet[10 + dp1] [i]. 1 next i for i = 0 to 7 stmp[i]=sa[i]<<1 next i for i = 0 to 7 mtmp[i]=ma[i] next i mtmp[0].7=al1 for i = 0 to 7 h_dsp[i] = utmp[i] h_dsp[i+8] = ztmp[i] h_dsp[i+16] = stmp[i] h_dsp[i+24] = mtmp[i] next i end sub 'Prepare Temperature data sub procedure prepare_to_show_temp(dim z_, u as byte) for i = 0 to 7 za[i] = alfabet[z_] [i] uua[i] = alfabet[u] [i] next i for i = 0 to 7 mtmp[i] = za[i] >>1 next i for i = 0 to 7 stmp[i]=uua[i] next i for i = 0 to 7 stmp[i].7 =za[i].5 next i for i = 0 to 7 ztmp[i] = alfabet[13] [i] next i for i = 0 to 7 utmp[i] = alfabet[12] [i] <<1 next i for i = 0 to 7 th_dsp[i] = utmp[i] th_dsp[i+8] = ztmp[i] th_dsp[i+16] = stmp[i] th_dsp[i+24] = mtmp[i] next i end sub sub procedure temp2hour 'Scroll from temperature to hour for i = 0 to 7 th_dsp[i+24] = th_dsp[i+24] << 1 th_dsp[i+24].0 = th_dsp[i+16].7 th_dsp[i+16] = th_dsp[i+16] << 1 th_dsp[i+16].0 = th_dsp[i+8].7 th_dsp[i+8] = th_dsp[i+8] << 1 th_dsp[i+8].0 = th_dsp[i].7 th_dsp[i] = th_dsp[i] << 1 th_dsp[i].0 = h_dsp[24+i].7 h_dsp[i+24] = h_dsp[i+24] << 1 h_dsp[i+24].0 = h_dsp[i+16].7 h_dsp[i+16] = h_dsp[i+16] << 1 h_dsp[i+16].0 = h_dsp[i+8].7 h_dsp[i+8] = h_dsp[i+8] << 1 h_dsp[i+8].0 = h_dsp[i].7 h_dsp[i] = h_dsp[i] << 1 next i for i = 0 to 31 dsp[i] = th_dsp[i] next i end sub sub procedure hour2temp 'Scrool from hour to temperature for i = 0 to 7 h_dsp[i+24] = h_dsp[i+24] << 1 h_dsp[i+24].0 = h_dsp[i+16].7 h_dsp[i+16] = h_dsp[i+16] << 1 h_dsp[i+16].0 = h_dsp[i+8].7 h_dsp[i+8] = h_dsp[i+8] << 1 h_dsp[i+8].0 = h_dsp[i].7 h_dsp[i] = h_dsp[i] << 1 h_dsp[i].0 = th_dsp[24+i].7 th_dsp[i+24] = th_dsp[i+24] << 1 th_dsp[i+24].0 = th_dsp[i+16].7 th_dsp[i+16] = th_dsp[i+16] << 1 th_dsp[i+16].0 = th_dsp[i+8].7 th_dsp[i+8] = th_dsp[i+8] << 1 th_dsp[i+8].0 = th_dsp[i].7 th_dsp[i] = th_dsp[i] << 1 next i for i = 0 to 31 dsp[i] = h_dsp[i] next i end sub sub procedure up_down() 'Procedure for Button Up or Button Down if x0 = 1 then if btset = 6 then I2CW(btmod, 0) else btvar = I2CR(btmod) btvar = bcd2dec(btvar) if btvar = mnbt[btset] Then btvar = mxbt[btset] else btvar = btvar - 1 end if I2CW(btmod, dec2bcd(btvar)) end if x0 = 0 end if if x1 = 1 then if btset = 6 then I2CW(btmod, 0) else btvar = I2CR(btmod) btvar = bcd2dec(btvar) if btvar = mxbt[btset] Then btvar = mnbt[btset] else btvar = btvar + 1 end if I2CW(btmod, dec2bcd(btvar)) end if x1 = 0 end if end sub sub procedure prepare_2_show_data ' Prepare data for send to MAX7219 for i = 0 to 31 dsp[i] = h_dsp[i] next i end sub sub procedure send_2_display() ' Send data to MAX7219 for i = 0 to 7 CS = 0 ' Begin transfer. SPI_Write(i+1) ' Send address. SPI_Write(dsp[i+24]) ' Send the value. SPI_Write(i+1) ' Send address. SPI_Write(dsp[i+16]) ' Send the value. SPI_Write(i+1) ' Send address. SPI_Write(dsp[i+8]) ' Send the value. SPI_Write(i+1) ' Send address. SPI_Write(dsp[i]) ' Send the value. CS = 1 ' Finish transfer. next i end sub sub procedure show_data() ' Show received data prepare_2_show_data send_2_display() end sub sub procedure alarm ' Buzz if PORTC1 = 1 PORTB.1 =flgal and al.0 and PORTA.2 end sub sub procedure init_main() OSCCON = %11111111 ' MCU clock at 16 MHz ANSELA = %00000000 ' All I/O pins of the PORTA are configured as digital ANSELB = %00000000 ' All I/O pins of the PORTC are configured as digital CM1CON0 = %00000000 ' Disbale comparator CM2CON0 = %00000000 ' Disbale comparator TRISA = %11111111 ' PORTA All Inputs TRISB = %00000000 ' PORTC All Outputs APFCON0.SDO1SEL = 0 APFCON0.SS1SEL = 0 INTCON.GIE = 1 ' Enables all unmasked interrupts INTCON.PEIE = 0 ' Disables all peripheral interrupts INTCON.T0IE = 1 ' Enables the TMR0 interrupt INTCON.INTE = 1 ' Enables the RA2/INT external interrupt INTCON.IOCIE = 0 ' Disables the PORTA change interrupt INTCON.T0IF = 0 ' TMR0 register did not overflow INTCON.INTF = 0 ' The RA2/INT external interrupt did not occur INTCON.IOCIF = 0 ' None of the PORTA <5:0> pins have changed state OPTION_REG.WUE = 0 ' PORTA pull-ups are enabled by individual port latch values OPTION_REG.INTEDG = 0 ' Interrupt on rising/falling edge of RA2/INT pin OPTION_REG.T0CS = 0 ' set Timer0 clock source to internal OPTION_REG.T0SE = 1 ' Increment on high-to-low transition on RA2/T0CKI pin OPTION_REG.PSA = 0 ' asign prescaler to Timer 0 OPTION_REG.PS2 = 1 ' asign prescaler value OPTION_REG.PS1 = 1 ' asign prescaler value OPTION_REG.PS0 = 1 ' asign prescaler value WPUA = %00111111 ' Pull-ups PORTA to be enabled SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH) Soft_I2C_Init() ' Initialize I2C module SPI1_Init() ' Initialize SPI module btmp=0xB ' Set brtightness adress bright=I2CR(btmp) ' Read brtightness value grc=0 ' Read Temp_On/Off value btmp=0xC ' Set alarm on/off adress al=I2CR(btmp) ' Read alarm on/off value max7219_init() ' Initialize MAX7219 module PORTB.1 = 0 ' Do not start alarm on start_up I2CW(0xA,%10000000) ' Alarm when hours, minutes, and seconds match I2CW(0x0E,0) ' Square wave is output on the INT/SQW pin TRISB.1 = 0 ' Because SPI1_Init make PORTC1 as input str = 0 j = 0 y = 0 k = 0 x = 0 x0 = 0 x1 = 0 x5 = 0 flgint = 0 pflgint = 0 flgal = 0 dp = 0 btset = 0 CS=1 end sub sub procedure Interrupt() iv 0x0004 ics ICS_AUTO if INTCON.INTF = 1 then flgint = not flgint OPTION_REG.INTEDG = not OPTION_REG.INTEDG dp.0 = not dp.0 k = k + 1 if k = 23 then k = 0 end if INTCON.INTF = 0 End if if INTCON.T0IF = 1 then TMR0 = 61 if flgal and al.0 and porta.2 then end if y = y + 1 if y = 20 then flsh = not flsh y = 0 end if ' buton mod if Button(PORTA, 4, 1, 1) then k4 = 255 end if if k4 and Button(PORTA, 4, 1, 0) then btset = btset + 1 if btset= 11 then btset= 0 end if btmod = stadrs[btset] k4 = 0 end if ' Button Up if btset <> 0 then if Button(PORTA, 0, 1, 1) then k0 = 255 end if if k0 and Button(PORTA, 0, 1, 0) then k0 = 0 x0 = 1 end if end if ' Button Down if btset <> 0 then if Button(PORTA, 1, 1, 1) then k1 = 255 end if if k1 and Button(PORTA, 1, 1, 0) then k1 = 0 x1 = 1 end if end if ' Button Al On/Off if Button(PORTA, 5, 1, 1) then k5 = 255 end if if k5 and Button(PORTA, 5, 1, 0) then x5 = 1 k5 = 0 end if INTCON.T0IF = 0 End if end sub main: ' Main program delay_ms(100) init_main() while TRUE select case btset case 0 ' show alt hour & temperature if flgint <> pflgint then pflgint = flgint read_RTC() prepare_to_show_hour(h1, h0, m1, m0, dp, al ) prepare_to_show_temp(th1, th0) if grc = 1 then if k<=16 then if k=16 then dp = 1 prepare_to_show_hour(h1, h0, m1, m0, dp, al ) for yy = 0 to 31 hour2temp send_2_display() delay_ms(30) alarm() next yy else prepare_2_show_data send_2_display() alarm() end if else if k=22 then dp = 1 prepare_to_show_hour(h1, h0, m1, m0, dp, al ) for yy = 0 to 31 temp2hour send_2_display() delay_ms(30) alarm() next yy else prepare_to_show_temp(th1, th0) for i = 0 to 31 dsp[i] = th_dsp[i] next i send_2_display() alarm() end if end if else show_data alarm() end if end if case 1 read_RTC() if flsh = 0 then h1 = 10 h0 = 10 end if prepare_to_show_hour(h1, h0, m1, m0, 1, 0 ) show_data() up_down() case 2 read_RTC() if flsh = 0 then m1 = 10 m0 = 10 end if prepare_to_show_hour(h1, h0, m1, m0, 1, 0 ) show_data() up_down() case 3 read_RTC() if flsh = 0 then d1 = 10 d0 = 10 end if prepare_to_show_hour(d1, d0, mo1, mo0, 0, 0 ) show_data() up_down() case 4 read_RTC() if flsh = 0 then mo1 = 10 mo0 = 10 end if prepare_to_show_hour(d1, d0, mo1, mo0, 0, 0 ) show_data() up_down() case 5 read_RTC() if flsh = 0 then y1 = 10 y0 = 10 end if prepare_to_show_hour(2, 0, y1, y0, 0, 0 ) show_data() up_down() case 6 read_RTC() if flsh = 0 then s1 = 10 s0 = 10 end if prepare_to_show_hour(10, 10, s1, s0, 1, 0 ) show_data() up_down() case 7 read_RTC() if flsh = 0 then ah1 = 10 ah0 = 10 end if prepare_to_show_hour(ah1, ah0, am1, am0, 1, 1 ) show_data() up_down() case 8 read_RTC() if flsh = 0 then am1 = 10 am0 = 10 end if prepare_to_show_hour(ah1, ah0, am1, am0, 1, 1 ) show_data() up_down() case 9 read_RTC() if flsh = 0 then br1 = 10 br0 = 10 end if prepare_to_show_hour(14, 15, br1, br0, 1, 0 ) show_data() up_down() read_RTC() maxCMD(MAX7219_BRIGHTNESS, bcd2dec(bright)) case 10 read_RTC() if flsh = 0 then grc = 10 end if prepare_to_show_hour(13, 12, 0, grc, 1, 0 ) show_data() up_down() end select if x5 = 1 then x5 = 0 if al <> 0 then al = 0 else al = 1 end if while not k5.0 prepare_to_show_hour(ah1, ah0, am1, am0, 1, 1 ) show_data() wend I2CW(0xc,dec2bcd(al)) ' Alarm On/Off I2CW(0xf,dec2bcd(0x0)) ' Clear alarm flag end if alarm() wend end. Link spre comentariu
fratello Postat Iunie 28, 2020 Partajează Postat Iunie 28, 2020 (editat) Mii de multumiri ! A compilat si la mine ! ...acum nu mai am nicio scuza, trebuie sa-l fac ! Revin cu update. Duminica frumoasa ! Editat Iunie 28, 2020 de fratello LE : Sper ca am inteles bine si schema. Link spre comentariu
nel65 Postat Iunie 29, 2020 Partajează Postat Iunie 29, 2020 (editat) Salutare ,vreau sa fac si eu ceasul asta ,nu stiu precis ce varianta de PIC o sa aleg ,va rog ,daca vreti ,sa puneti si hexurile la 1825 si 1827.N-am cu ce sa compilez codurile respective... Poate mai sunt si alti doritori! le pana una alta am facut tot eu niste incercari,daca le puteti verifica ... 1825.hex 1827.hex Editat Iunie 29, 2020 de nel65 Link spre comentariu
Kreator Postat Iunie 29, 2020 Autor Partajează Postat Iunie 29, 2020 pentru cel cu 1827 nu garantez ca merge fizic, fiindca nu l-am relizat. Link spre comentariu
Kreator Postat Iunie 29, 2020 Autor Partajează Postat Iunie 29, 2020 @fratello schema corectata Programul corectat program Ceas_MAX7219_PIC1827 ' Declarations section Const cnfgww As Byte = %11010000 'Adress for write DS3231 Const cnfgwr As Byte = %11010001 'Adress for read DS3231 const MAX7219_TEST as byte =0x0F const MAX7219_BRIGHTNESS as byte = 0x0A const MAX7219_SCAN_LIMIT as byte = 0x0B const MAX7219_DECODE_MODE as byte = 0x09 const MAX7219_SHUTDOWN as byte = 0x0C const mxbt As Byte[11] =(0, 23, 59, 31, 12, 99, 59, 23, 59, 15, 1) ' max value const mnbt As Byte[11] =(0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0) ' min value const stadrs As Byte[11] =(0, 0x02, 0x01, 0x04, 0x05, 0x06, 0x00, 0x09, 0x08, 0x0B, 0x0D) ' Adress data RTC const alfabet as byte [16] [8]= (( 30, 63, 51, 51, 51, 51, 63, 30), '0 ( 6, 14, 30, 6, 6, 6, 6, 15), '1 ( 30, 63, 35, 6, 12, 24, 63, 63), '2 ( 30, 63, 35, 14, 14, 35, 63, 30), '3 ( 6, 14, 30, 54, 54, 63, 6, 15), '4 ( 62, 63, 48, 62, 51, 3, 63, 30), '5 ( 30, 63, 48, 62, 51, 51, 63, 30), '6 ( 63, 63, 3, 6, 12, 12, 12, 12), '7 ( 30, 63, 51, 30, 51, 51, 63, 30), '8 ( 30, 63, 51, 51, 31, 3, 63, 30), '9 ( 0, 0, 0, 0, 0, 0, 0, 0), 'blank ( 0, 3, 3, 0, 0, 3, 3, 0), 'dp (120, 124, 68, 64, 64, 68, 124, 120), 'C ( 56, 109, 109, 109, 57, 1, 1, 0), '` ( 62, 63, 51, 62, 51, 51, 63, 62), 'B ( 0, 0, 27, 31, 28, 24, 24, 24)) 'r Dim CS as sbit at RB3_bit 'Chip Select pin for MAX7219 CS_Direction as sbit at TRISB3_bit Dim Soft_I2C_Sda as sbit at RB6_bit 'SDA pin for DS3231 Dim Soft_I2C_Scl as sbit at RB7_bit 'SCL pin for DS3231 Dim Soft_I2C_Sda_Direction as sbit at TRISB6_bit Dim Soft_I2C_Scl_Direction as sbit at TRISB7_bit Dim i,j, x, y, yy, bright, m, s_, z_, u, dp, str as byte Dim k, k0, k1, k4, k5, al as byte Dim flgal, flsh, x0, x1, x5, flgint, pflgint as bit Dim ma, sa, za, uua, utmp, ztmp, stmp, ltmp, rtmp, mtmp as byte[8] Dim dsp, th_dsp, h_dsp as byte[32] Dim s0, s1, m0, m1, h0, h1, ah0, ah1, am0, am1 As Byte Dim d0, d1, mo0, mo1, y0, y1, th0, th1, br1, br0 As Byte Dim btset, btmod, btvar, btmp, grc As Byte sub function I2CR(dim byref adress as byte) as byte ' Read value from RTC Soft_I2C_Start() ' Issue start signal Soft_I2C_Write(cnfgww) ' Address DS3221 datasheet Soft_I2C_Write(adress) ' Go to adresa Soft_I2C_Start() ' Issue repeated start signal Soft_I2C_Write(cnfgwr) ' Address for reading R/W=1 result = Soft_I2C_Read(0) ' Read with NAK Soft_I2C_Stop() ' Stop end sub sub procedure I2CW(dim adress, value as byte) ' Write value in TRC Soft_I2C_Start() ' Issue start signal Soft_I2C_Write(cnfgww) ' Address Soft_I2C_Write(adress) ' Go to adresa Soft_I2C_Write(value) ' Write valoare Soft_I2C_Stop() ' Stop end sub sub procedure read_RTC() ' Read some data from RTC btmp=0x00 btmp=I2CR(btmp) 'sec s0 = btmp Mod 16 s1 = btmp / 16 btmp=0x01 btmp=I2CR(btmp) 'min m0 = btmp Mod 16 m1 = btmp / 16 btmp=0x02 btmp=I2CR(btmp) 'hour h0 = btmp Mod 16 h1 = btmp / 16 btmp=0x04 btmp=I2CR(btmp) 'day d0 = btmp Mod 16 d1 = btmp / 16 btmp=0x05 btmp=I2CR(btmp) 'mounth mo0 = btmp Mod 16 mo1 = btmp / 16 btmp=0x06 btmp=I2CR(btmp) 'year y0 = btmp Mod 16 y1 = btmp / 16 btmp=0x08 btmp=I2CR(btmp) 'almin am0 = btmp Mod 16 am1 = btmp / 16 btmp=0x09 btmp=I2CR(btmp) 'alhour ah0 = btmp Mod 16 ah1 = btmp / 16 btmp=0x11 btmp=I2CR(btmp) 'temp th0 = btmp Mod 10 th1 = btmp / 10 btmp=0x0B bright=I2CR(btmp) ' brightness br0 = bright Mod 16 br1 = bright / 16 btmp=0x0C al=I2CR(btmp) ' set alarm On/Off btmp=0x0F btmp=I2CR(btmp) ' flag alarm flgal=btmp.0 btmp=0x0D btmp=I2CR(btmp) ' Temperature On/Off grc=btmp end sub sub procedure maxCMD (dim address, value as byte) ' Send command to MAX7219 CS = 0 for i = 0 to 3 SPI_Write(address) '// Send address. SPI_Write(value) '// Send the value. next i CS = 1 end sub sub procedure max7219_init() ' Initialize MAX7219 maxCMD(MAX7219_TEST, 0x01) ' Test mode maxCMD(MAX7219_TEST, 0x00) ' Finish test mode maxCMD(MAX7219_DECODE_MODE, 0x00) ' Disable BCD mode maxCMD(MAX7219_BRIGHTNESS, bright) ' Use lowest intensity maxCMD(MAX7219_SCAN_LIMIT, 0x0f) ' Scan all digits maxCMD(MAX7219_SHUTDOWN, 0x01) ' Turn on chip end sub 'Prepare hour data sub procedure prepare_to_show_hour(dim m, s_, z_, u, dp1, al1 as byte) for i = 0 to 7 ma[i] = alfabet[m] [i] sa[i] = alfabet[s_] [i] za[i] = alfabet[z_] [i] uua[i] = alfabet[u] [i] next i for i = 0 to 7 utmp[i]=uua[i] next i for i = 0 to 7 utmp[i].7 =za[i].0 next i for i = 0 to 7 ztmp[i]=za[i]>>1 next i for i = 0 to 7 ztmp[i].6 = alfabet[10 + dp1] [i]. 0 ztmp[i].7 = alfabet[10 + dp1] [i]. 1 next i for i = 0 to 7 stmp[i]=sa[i]<<1 next i for i = 0 to 7 mtmp[i]=ma[i] next i mtmp[0].7=al1 for i = 0 to 7 h_dsp[i] = utmp[i] h_dsp[i+8] = ztmp[i] h_dsp[i+16] = stmp[i] h_dsp[i+24] = mtmp[i] next i end sub 'Prepare Temperature data sub procedure prepare_to_show_temp(dim z_, u as byte) for i = 0 to 7 za[i] = alfabet[z_] [i] uua[i] = alfabet[u] [i] next i for i = 0 to 7 mtmp[i] = za[i] >>1 next i for i = 0 to 7 stmp[i]=uua[i] next i for i = 0 to 7 stmp[i].7 =za[i].5 next i for i = 0 to 7 ztmp[i] = alfabet[13] [i] next i for i = 0 to 7 utmp[i] = alfabet[12] [i] <<1 next i for i = 0 to 7 th_dsp[i] = utmp[i] th_dsp[i+8] = ztmp[i] th_dsp[i+16] = stmp[i] th_dsp[i+24] = mtmp[i] next i end sub sub procedure temp2hour 'Scroll from temperature to hour for i = 0 to 7 th_dsp[i+24] = th_dsp[i+24] << 1 th_dsp[i+24].0 = th_dsp[i+16].7 th_dsp[i+16] = th_dsp[i+16] << 1 th_dsp[i+16].0 = th_dsp[i+8].7 th_dsp[i+8] = th_dsp[i+8] << 1 th_dsp[i+8].0 = th_dsp[i].7 th_dsp[i] = th_dsp[i] << 1 th_dsp[i].0 = h_dsp[24+i].7 h_dsp[i+24] = h_dsp[i+24] << 1 h_dsp[i+24].0 = h_dsp[i+16].7 h_dsp[i+16] = h_dsp[i+16] << 1 h_dsp[i+16].0 = h_dsp[i+8].7 h_dsp[i+8] = h_dsp[i+8] << 1 h_dsp[i+8].0 = h_dsp[i].7 h_dsp[i] = h_dsp[i] << 1 next i for i = 0 to 31 dsp[i] = th_dsp[i] next i end sub sub procedure hour2temp 'Scrool from hour to temperature for i = 0 to 7 h_dsp[i+24] = h_dsp[i+24] << 1 h_dsp[i+24].0 = h_dsp[i+16].7 h_dsp[i+16] = h_dsp[i+16] << 1 h_dsp[i+16].0 = h_dsp[i+8].7 h_dsp[i+8] = h_dsp[i+8] << 1 h_dsp[i+8].0 = h_dsp[i].7 h_dsp[i] = h_dsp[i] << 1 h_dsp[i].0 = th_dsp[24+i].7 th_dsp[i+24] = th_dsp[i+24] << 1 th_dsp[i+24].0 = th_dsp[i+16].7 th_dsp[i+16] = th_dsp[i+16] << 1 th_dsp[i+16].0 = th_dsp[i+8].7 th_dsp[i+8] = th_dsp[i+8] << 1 th_dsp[i+8].0 = th_dsp[i].7 th_dsp[i] = th_dsp[i] << 1 next i for i = 0 to 31 dsp[i] = h_dsp[i] next i end sub sub procedure up_down() 'Procedure for Button Up or Button Down if x0 = 1 then if btset = 6 then I2CW(btmod, 0) else btvar = I2CR(btmod) btvar = bcd2dec(btvar) if btvar = mnbt[btset] Then btvar = mxbt[btset] else btvar = btvar - 1 end if I2CW(btmod, dec2bcd(btvar)) end if x0 = 0 end if if x1 = 1 then if btset = 6 then I2CW(btmod, 0) else btvar = I2CR(btmod) btvar = bcd2dec(btvar) if btvar = mxbt[btset] Then btvar = mnbt[btset] else btvar = btvar + 1 end if I2CW(btmod, dec2bcd(btvar)) end if x1 = 0 end if end sub sub procedure prepare_2_show_data ' Prepare data for send to MAX7219 for i = 0 to 31 dsp[i] = h_dsp[i] next i end sub sub procedure send_2_display() ' Send data to MAX7219 for i = 0 to 7 CS = 0 ' Begin transfer. SPI_Write(i+1) ' Send address. SPI_Write(dsp[i+24]) ' Send the value. SPI_Write(i+1) ' Send address. SPI_Write(dsp[i+16]) ' Send the value. SPI_Write(i+1) ' Send address. SPI_Write(dsp[i+8]) ' Send the value. SPI_Write(i+1) ' Send address. SPI_Write(dsp[i]) ' Send the value. CS = 1 ' Finish transfer. next i end sub sub procedure show_data() ' Show received data prepare_2_show_data send_2_display() end sub sub procedure alarm ' Buzz if PORTC1 = 1 PORTB.1 =flgal and al.0 and PORTA.2 end sub sub procedure init_main() OSCCON = %11111111 ' MCU clock at 16 MHz ANSELA = %00000000 ' All I/O pins of the PORTA are configured as digital ANSELB = %00000000 ' All I/O pins of the PORTC are configured as digital CM1CON0 = %00000000 ' Disbale comparator CM2CON0 = %00000000 ' Disbale comparator TRISA = %11111111 ' PORTA All Inputs TRISB = %00000000 ' PORTC All Outputs APFCON0.SDO1SEL = 0 APFCON0.SS1SEL = 0 INTCON.GIE = 1 ' Enables all unmasked interrupts INTCON.PEIE = 0 ' Disables all peripheral interrupts INTCON.T0IE = 1 ' Enables the TMR0 interrupt INTCON.INTE = 1 ' Enables the RA2/INT external interrupt INTCON.IOCIE = 0 ' Disables the PORTA change interrupt INTCON.T0IF = 0 ' TMR0 register did not overflow INTCON.INTF = 0 ' The RA2/INT external interrupt did not occur INTCON.IOCIF = 0 ' None of the PORTA <5:0> pins have changed state OPTION_REG.WUE = 0 ' PORTA pull-ups are enabled by individual port latch values OPTION_REG.INTEDG = 0 ' Interrupt on rising/falling edge of RA2/INT pin OPTION_REG.T0CS = 0 ' set Timer0 clock source to internal OPTION_REG.T0SE = 1 ' Increment on high-to-low transition on RA2/T0CKI pin OPTION_REG.PSA = 0 ' asign prescaler to Timer 0 OPTION_REG.PS2 = 1 ' asign prescaler value OPTION_REG.PS1 = 1 ' asign prescaler value OPTION_REG.PS0 = 1 ' asign prescaler value WPUA = %11111111 ' Pull-ups PORTA to be enabled SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH) Soft_I2C_Init() ' Initialize I2C module SPI1_Init() ' Initialize SPI module btmp=0xB ' Set brtightness adress bright=I2CR(btmp) ' Read brtightness value grc=0 ' Read Temp_On/Off value btmp=0xC ' Set alarm on/off adress al=I2CR(btmp) ' Read alarm on/off value max7219_init() ' Initialize MAX7219 module PORTB.1 = 0 ' Do not start alarm on start_up I2CW(0xA,%10000000) ' Alarm when hours, minutes, and seconds match I2CW(0x0E,0) ' Square wave is output on the INT/SQW pin TRISB.1 = 0 ' Because SPI1_Init make PORTB1 as input str = 0 j = 0 y = 0 k = 0 x = 0 x0 = 0 x1 = 0 x5 = 0 flgint = 0 pflgint = 0 flgal = 0 dp = 0 btset = 0 CS=1 end sub sub procedure Interrupt() iv 0x0004 ics ICS_AUTO if INTCON.INTF = 1 then flgint = not flgint OPTION_REG.INTEDG = not OPTION_REG.INTEDG dp.0 = not dp.0 k = k + 1 if k = 23 then k = 0 end if INTCON.INTF = 0 End if if INTCON.T0IF = 1 then TMR0 = 61 if flgal and al.0 and portb.0 then end if y = y + 1 if y = 20 then flsh = not flsh y = 0 end if ' buton mod if Button(PORTA, 4, 1, 1) then k4 = 255 end if if k4 and Button(PORTA, 4, 1, 0) then btset = btset + 1 if btset= 11 then btset= 0 end if btmod = stadrs[btset] k4 = 0 end if ' Button Up if btset <> 0 then if Button(PORTA, 0, 1, 1) then k0 = 255 end if if k0 and Button(PORTA, 0, 1, 0) then k0 = 0 x0 = 1 end if end if ' Button Down if btset <> 0 then if Button(PORTA, 1, 1, 1) then k1 = 255 end if if k1 and Button(PORTA, 1, 1, 0) then k1 = 0 x1 = 1 end if end if ' Button Al On/Off if Button(PORTA, 2, 1, 1) then k5 = 255 end if if k5 and Button(PORTA, 2, 1, 0) then x5 = 1 k5 = 0 end if INTCON.T0IF = 0 End if end sub main: ' Main program delay_ms(100) init_main() while TRUE select case btset case 0 ' show alt hour & temperature if flgint <> pflgint then pflgint = flgint read_RTC() prepare_to_show_hour(h1, h0, m1, m0, dp, al ) prepare_to_show_temp(th1, th0) if grc = 1 then if k<=16 then if k=16 then dp = 1 prepare_to_show_hour(h1, h0, m1, m0, dp, al ) for yy = 0 to 31 hour2temp send_2_display() delay_ms(30) alarm() next yy else prepare_2_show_data send_2_display() alarm() end if else if k=22 then dp = 1 prepare_to_show_hour(h1, h0, m1, m0, dp, al ) for yy = 0 to 31 temp2hour send_2_display() delay_ms(30) alarm() next yy else prepare_to_show_temp(th1, th0) for i = 0 to 31 dsp[i] = th_dsp[i] next i send_2_display() alarm() end if end if else show_data alarm() end if end if case 1 read_RTC() if flsh = 0 then h1 = 10 h0 = 10 end if prepare_to_show_hour(h1, h0, m1, m0, 1, 0 ) show_data() up_down() case 2 read_RTC() if flsh = 0 then m1 = 10 m0 = 10 end if prepare_to_show_hour(h1, h0, m1, m0, 1, 0 ) show_data() up_down() case 3 read_RTC() if flsh = 0 then d1 = 10 d0 = 10 end if prepare_to_show_hour(d1, d0, mo1, mo0, 0, 0 ) show_data() up_down() case 4 read_RTC() if flsh = 0 then mo1 = 10 mo0 = 10 end if prepare_to_show_hour(d1, d0, mo1, mo0, 0, 0 ) show_data() up_down() case 5 read_RTC() if flsh = 0 then y1 = 10 y0 = 10 end if prepare_to_show_hour(2, 0, y1, y0, 0, 0 ) show_data() up_down() case 6 read_RTC() if flsh = 0 then s1 = 10 s0 = 10 end if prepare_to_show_hour(10, 10, s1, s0, 1, 0 ) show_data() up_down() case 7 read_RTC() if flsh = 0 then ah1 = 10 ah0 = 10 end if prepare_to_show_hour(ah1, ah0, am1, am0, 1, 1 ) show_data() up_down() case 8 read_RTC() if flsh = 0 then am1 = 10 am0 = 10 end if prepare_to_show_hour(ah1, ah0, am1, am0, 1, 1 ) show_data() up_down() case 9 read_RTC() if flsh = 0 then br1 = 10 br0 = 10 end if prepare_to_show_hour(14, 15, br1, br0, 1, 0 ) show_data() up_down() read_RTC() maxCMD(MAX7219_BRIGHTNESS, bcd2dec(bright)) case 10 read_RTC() if flsh = 0 then grc = 10 end if prepare_to_show_hour(13, 12, 0, grc, 1, 0 ) show_data() up_down() end select if x5 = 1 then x5 = 0 if al <> 0 then al = 0 else al = 1 end if while not k5.0 prepare_to_show_hour(ah1, ah0, am1, am0, 1, 1 ) show_data() wend I2CW(0xc,dec2bcd(al)) ' Alarm On/Off I2CW(0xf,dec2bcd(0x0)) ' Clear alarm flag end if alarm() wend end. @nel65 hex pt 1825 Varianta cu DS 18B20 Ceas_MAX7219_PIC1825.hex Link spre comentariu
fratello Postat Iunie 30, 2020 Partajează Postat Iunie 30, 2020 (editat) Multumesc frumos ! ...OSCCON insa nu cred ca poate avea valoarea %11111111 pt PIC16F1827 ... Am ales din Mikrobasic optiunea de "internal osc", frecventa 32 MHz si am comentat in cod linia OSCCON. E OK asa ? LE. In PicBasic Pro folosesc asa pt acest PIC : DEFINE OSC 32 OSCCON= %11110000 'PLL enabled, Internal osc Daca modific OSCCON in codul postat, imi da eroare la compilare (?!?). Editat Iunie 30, 2020 de fratello LE Link spre comentariu
fratello Postat Iunie 30, 2020 Partajează Postat Iunie 30, 2020 Stiu ca poate nu e locul potrivit...dar matricea mea cred ca are o problema ! Am incercat toate tutorialele gasite (Hello World, MERT, etc, etc) cu Arduino Uno si Arduino Nano si nu am obtinut decat matrice stinsa sau matrice aprinsa complet !!! Uneori doar cate o matrice din cele 4 aprinsa .... Cum as putea verifica daca este OK matricea ??? Multumesc. Link spre comentariu
fratello Postat Iulie 4, 2020 Partajează Postat Iulie 4, 2020 Despre 16F1827 ... Am facut cablajul, am programat PIC-ul ... din pacate cu 1 eroare : "Error writing config area: written 1613, read 1EFF". Bineinteles, ceasul nu functioneaza :( Am incercat : - modificare OSCCAL in cod %11110000 (pt 32 MHz) - comentare linia OSCCAL - valoari de 8, 16, 32 MHz pentru "Frequency". Compilarea reuseste, de fiecare data, fara erori ... dar programarea, de fiecare data, da aceeasi eroare ! "Error writing config area: written 1613, read 1EFF" Sugestii ? Multumesc !! Link spre comentariu
UDAR Postat Iulie 4, 2020 Partajează Postat Iulie 4, 2020 Nu cred că e acolo problema - eroarea e generată de faptul că biții care nu pot fi scriși din ConfigWord2 sunt citiți ca ”1” deci cuvântul s-a scris bine dar este citit greșit la verificare . Programatorul scrie 0x1613 . Locația de memorie are biți care vor da la citire ”1” indiferent ce ai încerca să scrii peste ei - corespunzând cu 0x08EC . Făcând ”OR” între astea rezultă 0x1EFF ! Caută deci în altă parte cauza nefuncționării. Link spre comentariu
djvas Postat Iulie 4, 2020 Partajează Postat Iulie 4, 2020 Ce programator folosesti ? Link spre comentariu
fratello Postat Iulie 4, 2020 Partajează Postat Iulie 4, 2020 Revin cu update : -OSCCAL %11111000 (8 Mhz) -programare cu clona Pickit2, in loc de OpenProg (care dadea eroarea de mai sus). Acum ceasul porneste. Arata ora, data, secunde, alarma, bright...dar la temperatura este o eroare.... Daca apas 1 data pe butonul de MODE, nu mai pot reveni la functionare normala ... merge in bucla setarea tuturor parametrilor (ca in clip). Link spre comentariu
Florian Ciobanu Postat Iulie 4, 2020 Partajează Postat Iulie 4, 2020 (editat) cand esti in meniul temperaturii seteaza sa apara 01 in loc de 0 si artefactul ala , vezi ca ai mai mult de dat din butoane ,si va arata temperatura , cand este 00 nu arata , se seteaza cu butoanele + si - Editat Iulie 4, 2020 de Florian Ciobanu completare Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum