1

Тема: Проекты в программе Flowcode

Простые часы Pic12f629 & tm1637
http://forum.rcl-radio.ru/uploads/images/2023/12/66ed2c34922f56436317e9fad8323829.bmp
Прошивка и файл проекта
Данный контент доступен только зарегистрированным пользователям.
Часы первичные для механических часов "Стрела". Pic12f675(629)
http://forum.rcl-radio.ru/uploads/images/2023/12/f10faa57fbae2ff5a9b6355a99b904b2.jpg
Прошивка и файл проекта
Данный контент доступен только зарегистрированным пользователям.

2 (2024-04-24 14:57:31 отредактировано klause)

Re: Проекты в программе Flowcode

Простые часы в другой программе MPLAB IDE. Схема такая же.
Данный контент доступен только зарегистрированным пользователям.
Второй вариант с DS3231.
Данный контент доступен только зарегистрированным пользователям.
Третий вариант с DS1307.
Данный контент доступен только зарегистрированным пользователям.
Интересно, что в  DS1307 7бит в регистре секунд установить в ноль надо.

3

Re: Проекты в программе Flowcode

Термометр DS18b20.
http://forum.rcl-radio.ru/uploads/images/2024/04/87d75190965e05fa74522edb69ae2198.png
Проект в  программе MPLAB IDE
Данный контент доступен только зарегистрированным пользователям.

4 (2024-05-18 12:58:43 отредактировано klause)

Re: Проекты в программе Flowcode

Схемка из основного сайта.
http://forum.rcl-radio.ru/uploads/images/2024/04/025e07361743279463041458ec6576a1.jpg

/*
 * File:   newmain.c
 * Author: User
 *
 * Created on 19 ?????? 2024 ?., 14:20
 */
#include <htc.h>
#pragma config WDTE=OFF, MCLRE=OFF, BOREN=OFF, FOSC=INTRCIO, CP=OFF, CPD=OFF    //,INTRCIO
#define _XTAL_FREQ 4000000

void main(void){
	 unsigned int count;
    	// PIC I/O init
    CMCON = 0b111;		//comparator off
    GPIO = 0b00110110;
    TRISIO = 0b00000001;   //GP0 input
    ANSEL = 0b01010001;   //Fosc/16, AN0 pin7
	ADCON0 = 0b10000001;	//right justified, AN0, ADC on 
    
	while(1) {
        GO_DONE = 1;				//start ADC
        while(GO_DONE){};
        
        count=((ADRESH << 8) + ADRESL);
        if(count>=1016){GPIO = 0b00100000;
        __delay_ms(500);
        GPIO = 0b00000000;}
        if((count<1016)&&(count>=952)){GPIO = 0b00100000;}
        if((count<952)&&(count>=918)){GPIO = 0b00010000;}
        if((count<918)&&(count>=846)){GPIO = 0b00000100;}
        if((count<846)&&(count>=776)){GPIO = 0b00000010;}
        if((count<776)&&(count>600)){
           GPIO = 0b00000010;
        __delay_ms(500);
        GPIO = 0b00000000;
        }
        if(count<600){
         GPIO = 0b00110110;
          __delay_ms(500);
        GPIO = 0b00000000;
        }
        __delay_ms(500);
	}
	
}

Файлы проекта.
Данный контент доступен только зарегистрированным пользователям.

5 (2024-05-15 12:39:51 отредактировано klause)

Re: Проекты в программе Flowcode

Датчик влажности и температуры DHT11 + pic12f675+TM1637

/*
 * File:   newmain.c
 * Author: User
 *
 * Created on 19 ?????? 2024 ?., 14:20
 */

#include <htc.h>

#pragma config WDTE=OFF, MCLRE=OFF, FOSC=INTRCIO, CP=OFF

#define _XTAL_FREQ 4000000
#define DIO GPIO4 //pin3
#define CLK GPIO5 //pin2
#define DIOio TRISIO4 // input or output 
#define Data GPIO2		//sensor  pin5
#define DataDir TRISIO2		//sensor input or output

//prototypes
void display( unsigned char addr, unsigned char fig );
void sendData(unsigned char dataB);
void startBit(void);
void stopBit(void);
void clock(void);
void dht11_init(void);
unsigned short find_response();
unsigned short read_dht11();
unsigned int counter = 0, TempC, RH;
unsigned short T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;
const unsigned char  num[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0,1,2,3...9
unsigned short TOUT = 0,CheckSum, i, check;
void main(void){
    unsigned char i;
    GPIO = 0b00000000; 
    TRISIO = 0b00001100; //  
    ANSEL = 0; // 
    CMCON = 7; //
    OPTION_REG = 0;	//pullup
    CLK=1;
    DIO=1;
 GIE = 1;    //Enable global interrupt
 PEIE = 1;   //Enable peripheral interrupt
  // Configure Timer2 module
 TMR1IE = 1;  // Enable Timer1 interrupt
   T1CON = 0;       // Prescaler 1:1, and Timer1 is off initially
 TMR1IF =0;   // Clear TMR INT Flag bit
  TMR1H = 0;
  TMR1L = 0; 
    
	do{
  
        dht11_init();
        check = find_response();
        if (!check) {
           RH = 0;
           TempC = 0;
        }
        else{
             RH_Byte1 = read_dht11();
             RH_Byte2 = read_dht11();
             T_Byte1 = read_dht11();
             T_Byte2 = read_dht11();
             CheckSum = read_dht11();
             // Check for error in Data reception
             if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))
             {
               TempC = T_Byte1;
               RH = RH_Byte1;
              
              }
              else{
                   TempC = 0;
                   RH = 0;
              }
        }
        __delay_ms(2000);
    
            display(0,0b01110110);
            display(1,0b00011100);
            display(2,num[( RH/ 10)%10]);
            display(3,num[( RH/ 10)%10]);
         __delay_ms(2000); 
         
          display(0,num[( TempC / 10) % 10]);
          display(1,num[  TempC % 10]);
          display(2,0b01100011);
          display(3,0b00111001);
    
  }while(1);
}
  
        



void sendData(unsigned char dataB)
{
    for(unsigned char b=0;b<8;b++){
       DIO=(dataB >> b) % 2;
       clock();
    }
    DIOio=1;   //make DIO input
    clock();
    __delay_us(5);
    DIOio=0;   //make DIO output

}

void clock(void)
{
   __delay_us(4);
   CLK=1;
   __delay_us(5);
   CLK=0;
   __delay_us(4);
}

void startBit(void)
{
    DIO=0;
    __delay_us(5);
    CLK=0;
}

void stopBit(void)
{
    CLK=1;
    __delay_us(5);
    DIO=1;
}

    //includes brightness and point setting.
void display( unsigned char addr, unsigned char fig ){
    unsigned char mode=0b01000100;// control=0b10001100;  //0b10001010
    unsigned char brightness=7; //brightness can be selected 0 to 7
    unsigned char control=136+brightness;
   // fig=fig+0x80;    //0x80 is point 
    addr +=192;
    startBit();
    sendData(mode);            // command1-data 
    stopBit();
    startBit();
    sendData(addr);            // command2-address
    sendData(fig);
    stopBit();
    startBit();
    sendData(control);             // command3-control
    stopBit();
}
void dht11_init(){
  DataDir = 0;     // Data port is output
  Data    = 0;
  __delay_ms(25);
  Data    = 1;
  __delay_us(30);
  DataDir = 1;     // Data port is input

 }

 unsigned short find_response(){
 TOUT = 0;
  TMR1L = 0;
  TMR1H = 0;
  TMR1ON = 1;      // start timer
  while(!Data && !TOUT);
  if (TOUT) return 0;
  else {
   TMR1L = 0;
   TMR1H = 0;
   while(Data && !TOUT);
   if (TOUT) return 0;
   else {
   TMR1ON = 0;
    return 1;
   }
  }
 }
 
unsigned short read_dht11(){
  unsigned short num = 0;
  DataDir = 1;
  for (i=0; i<8; i++){
   while(!Data);
   TMR1L = 0;
   TMR1H = 0;
   TMR1ON = 1;
   while(Data);
   TMR1ON = 0;
   if(TMR1L > 40) num |= 1<<(7-i);  // If time > 40us, Data is 1
  }
  return num;
 }
void __interrupt() ISR(void){
  if(TMR1IF){
   TOUT = 1;
   TMR1ON = 0; // stop timer
   TMR1IF  = 0; // Clear TMR1 interrupt flag
  }
}

Данный контент доступен только зарегистрированным пользователям.

6

Re: Проекты в программе Flowcode

Индикатор литиевого аккумулятора. Размышления в теории. > 4.2в мигает зеленый светодиод. 4,2 - 3,8в горит зеленый  светодиод.3,8-3,4в горит желтый светодиод.3,4-3в горит красный  светодиод.<3в мигает красный светодиод. Обычно измеряют напряжение с помощью опорного напряжения. АЦП результат = Uвх*1024/Uref. Думаю, если сделать так, чтобы не делать делитель напряжения. Uвх будет опорным напряжением, например 2.5(1.5)в через TL431(432). А Uref будет настроен на U питания. Главное, чтобы U питания был не меньше 2.5в. Хотя защита литиевого аккумулятора сработает при напряжении 2.5в.
http://forum.rcl-radio.ru/uploads/images/2024/05/0c50cab583648c0bbc825f5c433e139b.bmp

/*
 * File:   newmain.c
 * Author: User
 *
 * Created on 19 ?????? 2024 ?., 14:20
 */
#include <htc.h>
#pragma config WDTE=OFF, MCLRE=OFF, BOREN=OFF, FOSC=INTRCIO, CP=OFF, CPD=OFF    //,INTRCIO
#define _XTAL_FREQ 4000000

void main(void){
	 unsigned int count;
    	// PIC I/O init
    CMCON = 0b111;		//comparator off
    GPIO = 0;
    TRISIO = 0b00011000;   //GPIO4 input
    ANSEL = 0b01011000;   //Fosc/16, AN3 pin3
	ADCON0 = 0b10001101;	//right justified, AN3, ADC on 
    
	while(1) {
        GO_DONE = 1;				//start ADC
        while(GO_DONE){};
        
        count=((ADRESH << 8) + ADRESL);
        if((count>601)&&(count<609)){GPIO = 0b00000001;//blue
         __delay_ms(500);
        GPIO=0;} 
        if((count>609)&&(count<673)){GPIO = 0b0000001;}//blue
        if((count>673)&&(count<752)){GPIO = 0b0000010;}//green
        if((count>752)&&(count<852)){GPIO = 0b0000100;}//red
        if((count>852)&&(count<1024)){GPIO = 0b00000100;//red
        __delay_ms(500);
        GPIO=0;
        }           
        __delay_ms(500);
	}
	
}

Данный контент доступен только зарегистрированным пользователям.

7 (2024-05-18 16:05:43 отредактировано klause)

Re: Проекты в программе Flowcode

Пример кода таймер 1мин(можно время менять). Таймер сработал - уход в "сон". Выход - кнопка сброса и работа таймера.http://forum.rcl-radio.ru/uploads/images/2024/05/6b3565df5947ca11a17dd977a5a47750.bmp

/*
 * File:   newmain.c
 * Author: User
 *
 * Created on 19 ?????? 2024 ?., 14:20
 */

#include <htc.h>
#define _XTAL_FREQ   4000000
#pragma config WDTE=OFF, MCLRE=ON, FOSC=INTRCIO, CP=OFF

unsigned short m = 0,s = 0;
//unsigned short t;
void main(void){
    
    ANSEL  = 0;       // Set ports as digital I/O, not analog input
	ADCON0 = 0;		 // Shut off the A/D Converter
	CMCON  = 7;		 // Shut off the Comparator
	TRISIO = 0b00001000;       // GP3 input, output
	GPIO   = 0b00100000;       // Make all pins 0
    INTCON =0b11000000;         // Enable Global 
  	OPTION_REG &= 0xC1;     // Make Prescalar 1:4
	T0IE = 1;				// Timer0 interrupt	
	while(1){    
     if (m==1000){s++;m=0;}
     if(s==60){GP5=0;s=0;} //set time 60sec
     if(GP5==1) { //input code
     
     
     }
     else {SLEEP();}  
      
    }
}

   	void __interrupt() ISR(void)
{
   if(T0IF)  //If Timer0 Interrupt
	{
		TMR0 = 0x08; // Timer0 should overflow after 250 instructions (250x4 = 1msec)
		T0IF = 0;    // Clear the interrupt
		m++; // 1 msec time has occurred
	}   
}

Схема такая же. Логика работы иная. Включение и выключение одной кнопкой с задержкой. Автовыключение 1мин( можно изменить)

/*
 * File:   newmain.c
 * Author: User
 *
 * Created on 19 ?????? 2024 ?., 14:20
 */

#include <htc.h>
#define _XTAL_FREQ   4000000
#pragma config WDTE=OFF, MCLRE=OFF, FOSC=INTRCIO, CP=OFF

unsigned short m = 0,s = 0;
unsigned short t=0;
void main(void){
    
    ANSEL  = 0;       // Set ports as digital I/O, not analog input
	ADCON0 = 0;		 // Shut off the A/D Converter
	CMCON  = 7;		 // Shut off the Comparator
	TRISIO = 0b00001000;       // GP3 input, output
	GPIO   = 0;       // Make all pins 0
    INTCON =0b11000000;         // Enable Global 
  	OPTION_REG &= 0xC1;     // Make Prescalar 1:4
	T0IE = 0;				// Timer0 interrupt	
	while(1){    
     if (GP3==0){t++;__delay_ms(500);}
     else t=0;
     if(t>=5){GP5=!GP5;t=0;}   
     if(GP5==1) {T0IE = 1;
         //input code
     
     
     }
      
      
    }
}

   	void __interrupt() ISR(void)
{
   if(T0IF)  //If Timer0 Interrupt
	{
		TMR0 = 0x08; // Timer0 should overflow after 250 instructions (250x4 = 1msec)
		T0IF = 0;    // Clear the interrupt
		m++; // 1 msec time has occurred
        if (m==1000){s++;m=0;}
        if(s==60){GP5=0;s=0;} //set time 60sec
	}   
}