Thông báo

Collapse
No announcement yet.

hỏi về mạch thu rf bằng module 315Mhz

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #31
    trong hàm main thì em viết thế này. vì e có làm bấm nút thì qua học cho đèn tiếp theo nên cái phần if(button==0) a đừng quan tâm

    while(nut_1==1)
    {
    if(button==0)
    {
    check_5s();
    if(detect_5s==1)
    {
    den_all=0;
    den_mode=0;
    delay_ms(200);
    den_mode=1;
    nut_1=0;
    return_den=0;
    goto point;
    }
    else
    {
    nut_1=0;
    }
    }
    else
    {
    check_sync_bit();
    if(sync_bit_detect==1)
    {
    nhan_du_lieu();
    for(i=0;i<12;i++)
    {
    x[i]=0;
    a[i]=0;
    x[i]=data[i];
    a[i]=data[i];
    }
    den_1=0;
    delay_ms(200);
    den_1=1;
    delay_ms(200);
    den_1=0;
    delay_ms(200);
    den_1=1;
    }
    }
    }

    anh coi dùm e có sai chỗ nào ko ? em làm đồ án mà nó học không dc thấy thốn quá T.T

    Comment


    • #32
      Bạn lập trình thì quan trọng nhất cái khâu giải thuật ... Từng bước làm những cái gì thì mới làm được, chứ lộn tùng phèo thì làm cả tháng chưa chắc đã được.
      Học lệnh :
      1) bấm nút ... Chạy chương trình học lệnh, không bấm nút, chạy chương trình giải mã ( chương trình điều khiển )... Lúc này ta phân chia hẳn ra làm 2 chương trình con, chẳng bao giờ sợ nhầm lẫn ), nút bấm này có thể đưa vào ngắt ngoài ( là tốt nhất ) hay ngắt timer để kiểm tra... Chứ chỗ nào cũng kiểm tra mấy cái nút bấm thì lấy thời gian đâu mà giải mã với nhận biết sync.
      2) kt nhận sync bit ... Nếu kt 1 lần sợ nhiễu làm sai thì bạn kiểm tra sync liên tục vài chục lần vào, kiểm tra ngặt ngèo như thế xem nhiễu nó có chui vào được không ? Chẳng có lẽ nhiễu nó cũng Khôn đến nỗi biết được cả chu kì, định dạng mà chui vào. Cái này tôi cho rằng cần phải động não, người lập trình nào cũng cần phải có tư duy - động não để khắc phục hay đi con đường mới.
      3) nhận địa chỉ, data theo đầy đủ định dạng trong datasheet ( 8 địa chỉ + 4 data)
      4) lưu nó vào eeprom nếu là chương trình học lệnh, so sánh nó với dữ liệu trong eeprom ( để xem nó đúng thì bạt tắt đèn hay làm gì đó...v.v ) nếu là chương trình giải mã.



      Khi chạy chương trình ( lúc mới khởi động ) thì đọc giá trị dữ liệu eeprom ra để lấy cái mà so sánh khi dùng MODE giải mã.
      Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

      Comment


      • #33
        Nguyên văn bởi queduong Xem bài viết
        Bạn lập trình thì quan trọng nhất cái khâu giải thuật ... Từng bước làm những cái gì thì mới làm được, chứ lộn tùng phèo thì làm cả tháng chưa chắc đã được.
        Học lệnh :
        1) bấm nút ... Chạy chương trình học lệnh, không bấm nút, chạy chương trình giải mã ( chương trình điều khiển )... Lúc này ta phân chia hẳn ra làm 2 chương trình con, chẳng bao giờ sợ nhầm lẫn ), nút bấm này có thể đưa vào ngắt ngoài ( là tốt nhất ) hay ngắt timer để kiểm tra... Chứ chỗ nào cũng kiểm tra mấy cái nút bấm thì lấy thời gian đâu mà giải mã với nhận biết sync.
        2) kt nhận sync bit ... Nếu kt 1 lần sợ nhiễu làm sai thì bạn kiểm tra sync liên tục vài chục lần vào, kiểm tra ngặt ngèo như thế xem nhiễu nó có chui vào được không ? Chẳng có lẽ nhiễu nó cũng Khôn đến nỗi biết được cả chu kì, định dạng mà chui vào. Cái này tôi cho rằng cần phải động não, người lập trình nào cũng cần phải có tư duy - động não để khắc phục hay đi con đường mới.
        3) nhận địa chỉ, data theo đầy đủ định dạng trong datasheet ( 8 địa chỉ + 4 data)
        4) lưu nó vào eeprom nếu là chương trình học lệnh, so sánh nó với dữ liệu trong eeprom ( để xem nó đúng thì bạt tắt đèn hay làm gì đó...v.v ) nếu là chương trình giải mã.



        Khi chạy chương trình ( lúc mới khởi động ) thì đọc giá trị dữ liệu eeprom ra để lấy cái mà so sánh khi dùng MODE giải mã.
        có nhiều lệnh kiểm tra nút bấm trong chương trình chính của e là bởi vì e làm nó thế này:
        khi ko bấm nút thì chạy giải mã bt....khi có bấm nút mà 5s thì chạy chương trình học lệnh mà nếu bấm 15s thì xóa lệnh đã học trong eeprom. vào học lệnh thì học theo từng kênh. ví dụ vào học lệnh thì đèn kênh 1 sáng và chờ học lệnh, bấm nút mode ( mạch chỉ có 1 nút bấm duy nhất là nút mode cho mọi công việc) thì chuyển qua kênh 2, bấm nút mode thì chuyển kênh 3, bấm nữa thì chuyển kênh 4, bấm tiếp thì lại về lại kênh 1. muốn thoát ra chương trình giải mã thì bấm mode 5s.....cho nên trong lúc chạy chương trình giải mã hay chương trình học lệnh e cũng phải làm cho nó kiểm tra nút bấm để thực thi cho đúng. phần làm về nút bấm và vào chương trình học hay chương trình giải mã thì e làm cũng hoàn thành rồi.... mà giờ khi vào học lệnh thì nó như kiểu bị học ngu v đó @@! e làm nếu học dc lệnh thì đèn kênh đó sáng nhấp nháy 2 cái. chưa bấm remote mà lâu lâu thì nó lại nhấp nháy báo học dc lệnh!! e thì nghĩ là nó bị nhiễu nếu có 1 xung cao của nhiễu sau đó ko còn nhiễu nữa thì là vừa đúng 4a cao và 124a thấp. sau đó thì nó thu cái phần mà ko phải là data vào và báo là đã học lệnh. e ko biết làm cách nào khắc phục hay giới hạn thế nào thì cần học, thế nào thì ko học ???

        Comment


        • #34
          em viết cái này a coi thử dùm e cái phần học lệnh có vấn đề j ko a
          Code:
          /*******************************************************
          This program was created by the
          CodeWizardAVR V3.12 Advanced
          Automatic Program Generator
          © Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
          http://www.hpinfotech.com
           
          Project :
          Version :
          Date    : 10/28/2015
          Author  :
          Company :
          Comments:
           
           
          Chip type               : ATmega8A
          Program type            : Application
          AVR Core Clock frequency: 8.000000 MHz
          Memory model            : Small
          External RAM size       : 0
          Data Stack size         : 256
          *******************************************************/
           
          #include <mega8.h>
          #include <delay.h>
          #define button      PIND.0
          #define den_1       PORTB.4
          #define den_2       PORTB.3
          #define den_3       PORTB.2
          #define den_4       PORTB.1
          #define den_mode    PORTD.4
          #define rf_data     PINC.5 
          #define den_all     PORTB
          eeprom unsigned char a[12],b[12],c[12],d[12];
          unsigned char eeprom *ptr_to_eeprom;
          // Declare your global variables here
          unsigned long chuki_4a=0;
          unsigned char data[12];
          unsigned int ngat=0,cho_ngat=0, detect_5s=0, dem=0,sync_bit_detect=0;
          // Timer1 overflow interrupt service routine
          interrupt [TIM1_OVF] void timer1_ovf_isr(void)
          {
          // Reinitialize Timer1 value
              if(ngat==1)
              {
              dem++;
              cho_ngat=0; //xoa qua trinh cho ngat
              ngat=0; // khong cho tiep tuc ngat
              }
          // Place your code here
           
          }
           
          void check_sync_bit()
          {
              unsigned long xung_cao,xung_thap;
              sync_bit_detect=0;
              chuki_4a=0;
             if(rf_data==0)
             {
              while(!rf_data)
              {
               if(button==0)
               {  
                  #asm("cli")
                  #asm("sei")
                  break;
               }
              }
              TCNT1=0;
              while(rf_data)
              {
               if(button==0)
               { 
                  #asm("cli")
                  #asm("sei")
                  break;
               }
              }
              #asm ("cli");
              xung_cao=TCNT1;
              TCNT1=0;
              #asm ("sei");
              while(!rf_data)
              {
               if(button==0)
               {
                  #asm("cli")
                  #asm("sei")
                  break;
               }
              }
              #asm ("cli");
              xung_thap=TCNT1;
              TCNT1=0;
              #asm ("sei");
          //////kiem tra xem co phai sync bit khong///////////
              if((xung_thap>=12800)&&(xung_thap<=38400))
              {
              if(xung_thap>xung_cao)
              {
                  if((xung_thap>xung_cao*30)&&(xung_thap<xung_cao*32))
                  {
                     
                          sync_bit_detect= 1;
                          chuki_4a=xung_cao;
                  }
                 
              }
              }
             }
          }
          void nhan_du_lieu() ////thu du lieu va ghi vao data[]
          {
          int i,j;
          int xung_cao,xung_thap,ketqua_1,ketqua_2;
              for(i=0; i<12; i++)
              {
                  for(j=0;j<2;j++)
                  {
                      while(rf_data);
                      #asm ("cli");
                      xung_cao=TCNT1;
                      TCNT1=0;
                      #asm ("sei");
                      while(!rf_data);
                      #asm ("cli");
                      xung_thap=TCNT1;
                      TCNT1=0;
                      #asm("sei")
                      if(j==0)
                      {
                          if((xung_cao>chuki_4a/2)&&(xung_cao<chuki_4a*2))
                          ketqua_1=0;
                          else ketqua_1=1;
                      }
                      if(j==1)
                      {
                          if((xung_cao>chuki_4a/2)&&(xung_cao<chuki_4a*2))
                          ketqua_2=0;
                          else ketqua_2=1;
                      }
                  }
                  if((ketqua_1==0)&&(ketqua_2==0))
                  data[i]='0';
                  else
                  if((ketqua_1==1)&&(ketqua_2==1))
                  data[i]='1';
                  else
                  data[i]='f';
              }
          }
          void check_5s()
          {
          dem=1;
          detect_5s=0;
              while (dem<=100)
              {
                  if(button!=0)
                  {
                      ngat=0;
                      detect_5s=0;
                      break;
                  }
                  if(button==0)
                  {
                      ngat=1;
                      cho_ngat=1;
                      TCNT1=15535;
                      while(cho_ngat==1);
                      if(dem==100)
                      {
                          ngat=0;
                          detect_5s=1;
                      }  
                     
                  }
              }
          }
          void main(void)
          {
          // Declare your local variables here
          unsigned int  n, i, doi_vung_nho, check_data_1, check_data_2, check_data_3, check_data_4;
          unsigned int learn_mode_en,return_den=0;
          unsigned int nut_1,nut_2,nut_3,nut_4;
          unsigned char x[12],y[12],z[12],o[12];
          for(doi_vung_nho=1;doi_vung_nho<4;doi_vung_nho++)
          {
              if(doi_vung_nho==1)
              {
                  ptr_to_eeprom = a;
                  for(n=0;n<12;n++)
                  {
                      x[n]=*(ptr_to_eeprom + n);
                  }
              }
              else
              if(doi_vung_nho==2)
              {
                  ptr_to_eeprom = b;
                  for(n=0;n<12;n++)
                  {
                      y[n]=*(ptr_to_eeprom + n);
                  }
              }
              else
              if(doi_vung_nho==3)
              {
                  ptr_to_eeprom = c;
                  for(n=0;n<12;n++)
                  {
                      z[n]=*(ptr_to_eeprom + n);
                  }
              }
              else
              if(doi_vung_nho==4)
              {
                  ptr_to_eeprom = d;
                  for(n=0;n<12;n++)
                  {
                      o[n]=*(ptr_to_eeprom + n);
                  }
              }
          }
          // Input/Output Ports initialization
          // Port B initialization
          // Function: Bit7=In Bit6=In Bit5=In Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
          DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (0<<DDB0);
          // State: Bit7=T Bit6=T Bit5=T Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=1
          PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
           
          // Port C initialization
          // Function: Bit6=In Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=Out
          DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
          // State: Bit6=T Bit5=T Bit4=T Bit3=0 Bit2=0 Bit1=0 Bit0=0
          PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
           
          // Port D initialization
          // Function: Bit7=In Bit6=In Bit5=In Bit4=out Bit3=In Bit2=In Bit1=In Bit0=In
          DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
          // State: Bit7=T Bit6=T Bit5=T Bit4=1 Bit3=T Bit2=T Bit1=T Bit0=P
          PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (1<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (1<<PORTD0);
           
          // Timer/Counter 0 initialization
          // Clock source: System Clock
          // Clock value: Timer 0 Stopped
          TCCR0=(0<<CS02) | (0<<CS01) | (0<<CS00);
          TCNT0=0x00;
           
          // Timer/Counter 1 initialization
          // Clock source: System Clock
          // Clock value: 1000.000 kHz
          // Mode: Normal top=0xFFFF
          // OC1A output: Disconnected
          // OC1B output: Disconnected
          // Noise Canceler: Off
          // Input Capture on Falling Edge
          // Timer Period: 1 us
          // Timer1 Overflow Interrupt: On
          // Input Capture Interrupt: Off
          // Compare A Match Interrupt: Off
          // Compare B Match Interrupt: Off
          TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
          TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
          TCNT1H=0x00;
          TCNT1L=0x00;
          ICR1H=0x00;
          ICR1L=0x00;
          OCR1AH=0x00;
          OCR1AL=0x00;
          OCR1BH=0x00;
          OCR1BL=0x00;
           
          // Timer/Counter 2 initialization
          // Clock source: System Clock
          // Clock value: Timer2 Stopped
          // Mode: Normal top=0xFF
          // OC2 output: Disconnected
          ASSR=0<<AS2;
          TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
          TCNT2=0x00;
          OCR2=0x00;
           
          // Timer(s)/Counter(s) Interrupt(s) initialization
          TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (1<<TOIE1) | (0<<TOIE0);
           
          // External Interrupt(s) initialization
          // INT0: Off
          // INT1: Off
          MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
           
          // USART initialization
          // USART disabled
          UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
           
          // Analog Comparator initialization
          // Analog Comparator: Off
          // The Analog Comparator's positive input is
          // connected to the AIN0 pin
          // The Analog Comparator's negative input is
          // connected to the AIN1 pin
          ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
          SFIOR=(0<<ACME);
           
          // ADC initialization
          // ADC disabled
          ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
           
          // SPI initialization
          // SPI disabled
          SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
           
          // TWI initialization
          // TWI disabled
          TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
           
          // Global enable interrupts
          #asm("sei")
          point:
          while (1)
          {
          learn_mode_en=0;
          if(button==0)                           ///khi co bam nut mode
          {
              check_5s();
              if(detect_5s==1)
              {  
                  den_mode=0;
                  delay_ms(200);
                  den_mode=1;
                  delay_ms(200);
                  den_mode=0;
                  delay_ms(200);
                  den_mode=1;
                  learn_mode_en=1;
                  den_all=0;
                 
              }
              else
              {
                  goto point;
              }                      
              while(learn_mode_en==1)
              {  
                  if(button==0)
                  { 
                      check_5s();
                      if(detect_5s==1)
                      {  
                          check_5s();
                          if(detect_5s==1)
                          {
                              for(i=0;i<12;i++)
                              {
                                  x[i]=0;y[i]=0;z[i]=0;o[i]=0;
                                  a[i]=0;b[i]=0;c[i]=0;d[i]=0;
                              }
                              den_all=0b00011110;
                              den_mode=0;
                              delay_ms(200);
                              den_all=0;
                              den_mode=1;
                              return_den=0;
                              goto point;
                          }
                      }
                      else
                      {
                        return_den=1;
                        while(return_den==1)
                        {
                           if(den_all==0||den_4==1)
                          {
                              den_all=0;
                              delay_ms(100);
                              den_1=1;
                              nut_1=1;
                              while(nut_1==1)
                              {
                                  if(button==0)
                                  {
                                      check_5s();
                                      if(detect_5s==1)
                                      {
                                          den_all=0;
                                          den_mode=0;
                                          delay_ms(200);
                                          den_mode=1;
                                          nut_1=0;
                                          return_den=0;
                                          goto point;
                                      }
                                      else
                                      {
                                      nut_1=0;
                                      }
                                  }
                                  else
                                  {
                                      check_sync_bit();
                                      if(sync_bit_detect==1)
                                      { 
                                          nhan_du_lieu();
                                          ptr_to_eeprom=a;
                                          for(i=0;i<12;i++)
                                          {
                                              x[i]=0;
                                              *(ptr_to_eeprom+i)=0;
                                              x[i]=data[i];
                                              *(ptr_to_eeprom+i)=data[i];
                                          }
                                          den_1=0;
                                          delay_ms(200);
                                          den_1=1;
                                          delay_ms(200);
                                          den_1=0;
                                          delay_ms(200);
                                          den_1=1;
                                      }
                                  }
                              }
                          }
                          if(den_1==1)
                          {
                              den_all=0;
                              delay_ms(100);
                              den_2=1;
                              nut_2=1;
                              while(nut_2==1)
                              {
                                 
                                  if(button==0)
                                  {
                                      check_5s();
                                      if(detect_5s==1)
                                      {
                                          den_all=0;
                                          den_mode=0;
                                          delay_ms(200);
                                          den_mode=1;
                                          nut_2=0;
                                          return_den=0;
                                          goto point;
                                      }
                                      else
                                      {
                                      nut_2=0;
                                      }
                                  }
                                  else
                                  {
                                      check_sync_bit();
                                      if(sync_bit_detect==1)
                                      {  
                                          nhan_du_lieu();
                                          ptr_to_eeprom=b;
                                          for(i=0;i<12;i++)
                                          {  
                                              y[i]=0;
                                              *(ptr_to_eeprom+i)=0;
                                              y[i]=data[i];
                                              *(ptr_to_eeprom+i)=data[i];
                                          }
                                          den_2=0;
                                          delay_ms(200);
                                          den_2=1;
                                          delay_ms(200);
                                          den_2=0;
                                          delay_ms(200);
                                          den_2=1;
                                      }
                                  }
                              }
                          }
                          if(den_2==1)
                          {
                              den_all=0;
                              delay_ms(100);
                              den_3=1;
                              nut_3=1;
                              while(nut_3==1)
                              {
                                  if(button==0)
                                  {
                                      check_5s();
                                      if(detect_5s==1)
                                      {
                                          den_all=0;
                                          den_mode=0;
                                          delay_ms(200);
                                          den_mode=1;
                                          nut_3=0;
                                          return_den=0;
                                          goto point;
                                      }
                                      else
                                      {
                                      nut_3=0;
                                      }
                                  }
                                  else
                                  {
                                      check_sync_bit();
                                      if(sync_bit_detect==1)
                                      {
                                          nhan_du_lieu();
                                          ptr_to_eeprom=c;
                                          for(i=0;i<12;i++)
                                          {  
                                              z[i]=0;
                                              *(ptr_to_eeprom+i)=0;
                                              z[i]=data[i];
                                              *(ptr_to_eeprom+i)=data[i];
                                          }
                                          den_3=0;
                                          delay_ms(200);
                                          den_3=1;
                                          delay_ms(200);
                                          den_3=0;
                                          delay_ms(200);
                                          den_3=1;
                                      }
                                  }
                              }   
                          }
                          if(den_3==1)
                          {   
                              den_all=0;
                              delay_ms(100);
                              den_4=1;
                              nut_4=1;
                              while(nut_4==1)
                              {   
                                  if(button==0)
                                  {
                                      check_5s();
                                      if(detect_5s==1)
                                      {
                                          den_all=0;
                                          den_mode=0;
                                          delay_ms(200);
                                          den_mode=1;
                                          nut_4=0;
                                          return_den=0;
                                          goto point;
                                      }
                                      else
                                      {
                                      nut_4=0;
                                      }
                                  }        
                                  else
                                  {
                                      check_sync_bit();
                                      if(sync_bit_detect==1)
                                      {
                                          nhan_du_lieu();
                                          ptr_to_eeprom=d;
                                          for(i=0;i<12;i++)
                                          {  
                                              z[i]=0;
                                              *(ptr_to_eeprom+i)=0;
                                              z[i]=data[i];
                                              *(ptr_to_eeprom+i)=data[i];
                                          }
                                          den_4=0;
                                          delay_ms(200);
                                          den_4=1;
                                          delay_ms(200);
                                          den_4=0;
                                          delay_ms(200);
                                          den_4=1;
                                      }
                                  }
                              }
                          } 
                        }
                      }
                  }
              }
          }
          if(PIND.0!=0)          ////khi khong bam nut hoat dong o che do binh thuong
          {
              check_data_1=0; check_data_2=0; check_data_3=0; check_data_4=0;
              check_sync_bit();
              if(sync_bit_detect==1)
              nhan_du_lieu();
              for(i=0;i<12;i++)
              {
                  if(data[i]==x[i])
                  { 
                      check_data_1++;
                  }
                  if(data[i]==y[i])
                  {
                      check_data_2++;
                  }
                  if(data[i]==z[i])
                  {
                      check_data_3++;
                  }
                  if(data[i]==o[i])
                  {
                      check_data_4++;
                  }
              }
              if(check_data_1==12)
              {
                  if(PORTC.3==0)
                  {
                      PORTB.4=1;
                      PORTC.3=1;
                  }           
                  else
                  {
                      PORTB.4=0;
                      PORTC.3=0;
                  }
              }
           
              if(check_data_2==12)
              {
                  if(PORTC.2==0)
                  {
                      PORTB.3=1;
                      PORTC.2=1;
                  }
                  else
                  {
                      PORTB.3=0;
                      PORTC.2=0;
                  }
              }
              if(check_data_3==12)
              {
                  if(PORTC.1==0)
                  {
                      PORTB.2=1;
                      PORTC.1=1;
                  }
                  else
                  {
                      PORTB.2=0;
                      PORTC.1=0;
                  }
              }
              if(check_data_4==12)
              {
                  if(PORTC.0==0)
                  {
                      PORTB.1=1;
                      PORTC.0=1;
                  }
                  else
                  {
                      PORTB.1=0;
                      PORTC.0=0;
                  }
              }
          }
           
           
          }   
          }

          Comment


          • #35
            em viết cái này a coi thử dùm e cái phần học lệnh có vấn đề j ko a
            Code:
            /*******************************************************
            This program was created by the
            CodeWizardAVR V3.12 Advanced
            Automatic Program Generator
            © Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
            http://www.hpinfotech.com
             
            Project :
            Version :
            Date    : 10/28/2015
            Author  :
            Company :
            Comments:
             
             
            Chip type               : ATmega8A
            Program type            : Application
            AVR Core Clock frequency: 8.000000 MHz
            Memory model            : Small
            External RAM size       : 0
            Data Stack size         : 256
            *******************************************************/
             
            #include <mega8.h>
            #include <delay.h>
            #define button      PIND.0
            #define den_1       PORTB.4
            #define den_2       PORTB.3
            #define den_3       PORTB.2
            #define den_4       PORTB.1
            #define den_mode    PORTD.4
            #define rf_data     PINC.5 
            #define den_all     PORTB
            eeprom unsigned char a[12],b[12],c[12],d[12];
            unsigned char eeprom *ptr_to_eeprom;
            // Declare your global variables here
            unsigned long chuki_4a=0;
            unsigned char data[12];
            unsigned int ngat=0,cho_ngat=0, detect_5s=0, dem=0,sync_bit_detect=0;
            // Timer1 overflow interrupt service routine
            interrupt [TIM1_OVF] void timer1_ovf_isr(void)
            {
            // Reinitialize Timer1 value
                if(ngat==1)
                {
                dem++;
                cho_ngat=0; //xoa qua trinh cho ngat
                ngat=0; // khong cho tiep tuc ngat
                }
            // Place your code here
             
            }
             
            void check_sync_bit()
            {
                unsigned long xung_cao,xung_thap;
                sync_bit_detect=0;
                chuki_4a=0;
               if(rf_data==0)
               {
                while(!rf_data)
                {
                 if(button==0)
                 {  
                    #asm("cli")
                    #asm("sei")
                    break;
                 }
                }
                TCNT1=0;
                while(rf_data)
                {
                 if(button==0)
                 { 
                    #asm("cli")
                    #asm("sei")
                    break;
                 }
                }
                #asm ("cli");
                xung_cao=TCNT1;
                TCNT1=0;
                #asm ("sei");
                while(!rf_data)
                {
                 if(button==0)
                 {
                    #asm("cli")
                    #asm("sei")
                    break;
                 }
                }
                #asm ("cli");
                xung_thap=TCNT1;
                TCNT1=0;
                #asm ("sei");
            //////kiem tra xem co phai sync bit khong///////////
                if((xung_thap>=12800)&&(xung_thap<=38400))
                {
                if(xung_thap>xung_cao)
                {
                    if((xung_thap>xung_cao*30)&&(xung_thap<xung_cao*32))
                    {
                       
                            sync_bit_detect= 1;
                            chuki_4a=xung_cao;
                    }
                   
                }
                }
               }
            }
            void nhan_du_lieu() ////thu du lieu va ghi vao data[]
            {
            int i,j;
            int xung_cao,xung_thap,ketqua_1,ketqua_2;
                for(i=0; i<12; i++)
                {
                    for(j=0;j<2;j++)
                    {
                        while(rf_data);
                        #asm ("cli");
                        xung_cao=TCNT1;
                        TCNT1=0;
                        #asm ("sei");
                        while(!rf_data);
                        #asm ("cli");
                        xung_thap=TCNT1;
                        TCNT1=0;
                        #asm("sei")
                        if(j==0)
                        {
                            if((xung_cao>chuki_4a/2)&&(xung_cao<chuki_4a*2))
                            ketqua_1=0;
                            else ketqua_1=1;
                        }
                        if(j==1)
                        {
                            if((xung_cao>chuki_4a/2)&&(xung_cao<chuki_4a*2))
                            ketqua_2=0;
                            else ketqua_2=1;
                        }
                    }
                    if((ketqua_1==0)&&(ketqua_2==0))
                    data[i]='0';
                    else
                    if((ketqua_1==1)&&(ketqua_2==1))
                    data[i]='1';
                    else
                    data[i]='f';
                }
            }
            void check_5s()
            {
            dem=1;
            detect_5s=0;
                while (dem<=100)
                {
                    if(button!=0)
                    {
                        ngat=0;
                        detect_5s=0;
                        break;
                    }
                    if(button==0)
                    {
                        ngat=1;
                        cho_ngat=1;
                        TCNT1=15535;
                        while(cho_ngat==1);
                        if(dem==100)
                        {
                            ngat=0;
                            detect_5s=1;
                        }  
                       
                    }
                }
            }
            void main(void)
            {
            // Declare your local variables here
            unsigned int  n, i, doi_vung_nho, check_data_1, check_data_2, check_data_3, check_data_4;
            unsigned int learn_mode_en,return_den=0;
            unsigned int nut_1,nut_2,nut_3,nut_4;
            unsigned char x[12],y[12],z[12],o[12];
            for(doi_vung_nho=1;doi_vung_nho<4;doi_vung_nho++)
            {
                if(doi_vung_nho==1)
                {
                    ptr_to_eeprom = a;
                    for(n=0;n<12;n++)
                    {
                        x[n]=*(ptr_to_eeprom + n);
                    }
                }
                else
                if(doi_vung_nho==2)
                {
                    ptr_to_eeprom = b;
                    for(n=0;n<12;n++)
                    {
                        y[n]=*(ptr_to_eeprom + n);
                    }
                }
                else
                if(doi_vung_nho==3)
                {
                    ptr_to_eeprom = c;
                    for(n=0;n<12;n++)
                    {
                        z[n]=*(ptr_to_eeprom + n);
                    }
                }
                else
                if(doi_vung_nho==4)
                {
                    ptr_to_eeprom = d;
                    for(n=0;n<12;n++)
                    {
                        o[n]=*(ptr_to_eeprom + n);
                    }
                }
            }
            // Input/Output Ports initialization
            // Port B initialization
            // Function: Bit7=In Bit6=In Bit5=In Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
            DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (0<<DDB0);
            // State: Bit7=T Bit6=T Bit5=T Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=1
            PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
             
            // Port C initialization
            // Function: Bit6=In Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=Out
            DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
            // State: Bit6=T Bit5=T Bit4=T Bit3=0 Bit2=0 Bit1=0 Bit0=0
            PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
             
            // Port D initialization
            // Function: Bit7=In Bit6=In Bit5=In Bit4=out Bit3=In Bit2=In Bit1=In Bit0=In
            DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
            // State: Bit7=T Bit6=T Bit5=T Bit4=1 Bit3=T Bit2=T Bit1=T Bit0=P
            PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (1<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (1<<PORTD0);
             
            // Timer/Counter 0 initialization
            // Clock source: System Clock
            // Clock value: Timer 0 Stopped
            TCCR0=(0<<CS02) | (0<<CS01) | (0<<CS00);
            TCNT0=0x00;
             
            // Timer/Counter 1 initialization
            // Clock source: System Clock
            // Clock value: 1000.000 kHz
            // Mode: Normal top=0xFFFF
            // OC1A output: Disconnected
            // OC1B output: Disconnected
            // Noise Canceler: Off
            // Input Capture on Falling Edge
            // Timer Period: 1 us
            // Timer1 Overflow Interrupt: On
            // Input Capture Interrupt: Off
            // Compare A Match Interrupt: Off
            // Compare B Match Interrupt: Off
            TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
            TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
            TCNT1H=0x00;
            TCNT1L=0x00;
            ICR1H=0x00;
            ICR1L=0x00;
            OCR1AH=0x00;
            OCR1AL=0x00;
            OCR1BH=0x00;
            OCR1BL=0x00;
             
            // Timer/Counter 2 initialization
            // Clock source: System Clock
            // Clock value: Timer2 Stopped
            // Mode: Normal top=0xFF
            // OC2 output: Disconnected
            ASSR=0<<AS2;
            TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
            TCNT2=0x00;
            OCR2=0x00;
             
            // Timer(s)/Counter(s) Interrupt(s) initialization
            TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (1<<TOIE1) | (0<<TOIE0);
             
            // External Interrupt(s) initialization
            // INT0: Off
            // INT1: Off
            MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
             
            // USART initialization
            // USART disabled
            UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
             
            // Analog Comparator initialization
            // Analog Comparator: Off
            // The Analog Comparator's positive input is
            // connected to the AIN0 pin
            // The Analog Comparator's negative input is
            // connected to the AIN1 pin
            ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
            SFIOR=(0<<ACME);
             
            // ADC initialization
            // ADC disabled
            ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
             
            // SPI initialization
            // SPI disabled
            SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
             
            // TWI initialization
            // TWI disabled
            TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
             
            // Global enable interrupts
            #asm("sei")
            point:
            while (1)
            {
            learn_mode_en=0;
            if(button==0)                           ///khi co bam nut mode
            {
                check_5s();
                if(detect_5s==1)
                {  
                    den_mode=0;
                    delay_ms(200);
                    den_mode=1;
                    delay_ms(200);
                    den_mode=0;
                    delay_ms(200);
                    den_mode=1;
                    learn_mode_en=1;
                    den_all=0;
                   
                }
                else
                {
                    goto point;
                }                      
                while(learn_mode_en==1)
                {  
                    if(button==0)
                    { 
                        check_5s();
                        if(detect_5s==1)
                        {  
                            check_5s();
                            if(detect_5s==1)
                            {
                                for(i=0;i<12;i++)
                                {
                                    x[i]=0;y[i]=0;z[i]=0;o[i]=0;
                                    a[i]=0;b[i]=0;c[i]=0;d[i]=0;
                                }
                                den_all=0b00011110;
                                den_mode=0;
                                delay_ms(200);
                                den_all=0;
                                den_mode=1;
                                return_den=0;
                                goto point;
                            }
                        }
                        else
                        {
                          return_den=1;
                          while(return_den==1)
                          {
                             if(den_all==0||den_4==1)
                            {
                                den_all=0;
                                delay_ms(100);
                                den_1=1;
                                nut_1=1;
                                while(nut_1==1)
                                {
                                    if(button==0)
                                    {
                                        check_5s();
                                        if(detect_5s==1)
                                        {
                                            den_all=0;
                                            den_mode=0;
                                            delay_ms(200);
                                            den_mode=1;
                                            nut_1=0;
                                            return_den=0;
                                            goto point;
                                        }
                                        else
                                        {
                                        nut_1=0;
                                        }
                                    }
                                    else
                                    {
                                        check_sync_bit();
                                        if(sync_bit_detect==1)
                                        { 
                                            nhan_du_lieu();
                                            ptr_to_eeprom=a;
                                            for(i=0;i<12;i++)
                                            {
                                                x[i]=0;
                                                *(ptr_to_eeprom+i)=0;
                                                x[i]=data[i];
                                                *(ptr_to_eeprom+i)=data[i];
                                            }
                                            den_1=0;
                                            delay_ms(200);
                                            den_1=1;
                                            delay_ms(200);
                                            den_1=0;
                                            delay_ms(200);
                                            den_1=1;
                                        }
                                    }
                                }
                            }
                            if(den_1==1)
                            {
                                den_all=0;
                                delay_ms(100);
                                den_2=1;
                                nut_2=1;
                                while(nut_2==1)
                                {
                                   
                                    if(button==0)
                                    {
                                        check_5s();
                                        if(detect_5s==1)
                                        {
                                            den_all=0;
                                            den_mode=0;
                                            delay_ms(200);
                                            den_mode=1;
                                            nut_2=0;
                                            return_den=0;
                                            goto point;
                                        }
                                        else
                                        {
                                        nut_2=0;
                                        }
                                    }
                                    else
                                    {
                                        check_sync_bit();
                                        if(sync_bit_detect==1)
                                        {  
                                            nhan_du_lieu();
                                            ptr_to_eeprom=b;
                                            for(i=0;i<12;i++)
                                            {  
                                                y[i]=0;
                                                *(ptr_to_eeprom+i)=0;
                                                y[i]=data[i];
                                                *(ptr_to_eeprom+i)=data[i];
                                            }
                                            den_2=0;
                                            delay_ms(200);
                                            den_2=1;
                                            delay_ms(200);
                                            den_2=0;
                                            delay_ms(200);
                                            den_2=1;
                                        }
                                    }
                                }
                            }
                            if(den_2==1)
                            {
                                den_all=0;
                                delay_ms(100);
                                den_3=1;
                                nut_3=1;
                                while(nut_3==1)
                                {
                                    if(button==0)
                                    {
                                        check_5s();
                                        if(detect_5s==1)
                                        {
                                            den_all=0;
                                            den_mode=0;
                                            delay_ms(200);
                                            den_mode=1;
                                            nut_3=0;
                                            return_den=0;
                                            goto point;
                                        }
                                        else
                                        {
                                        nut_3=0;
                                        }
                                    }
                                    else
                                    {
                                        check_sync_bit();
                                        if(sync_bit_detect==1)
                                        {
                                            nhan_du_lieu();
                                            ptr_to_eeprom=c;
                                            for(i=0;i<12;i++)
                                            {  
                                                z[i]=0;
                                                *(ptr_to_eeprom+i)=0;
                                                z[i]=data[i];
                                                *(ptr_to_eeprom+i)=data[i];
                                            }
                                            den_3=0;
                                            delay_ms(200);
                                            den_3=1;
                                            delay_ms(200);
                                            den_3=0;
                                            delay_ms(200);
                                            den_3=1;
                                        }
                                    }
                                }   
                            }
                            if(den_3==1)
                            {   
                                den_all=0;
                                delay_ms(100);
                                den_4=1;
                                nut_4=1;
                                while(nut_4==1)
                                {   
                                    if(button==0)
                                    {
                                        check_5s();
                                        if(detect_5s==1)
                                        {
                                            den_all=0;
                                            den_mode=0;
                                            delay_ms(200);
                                            den_mode=1;
                                            nut_4=0;
                                            return_den=0;
                                            goto point;
                                        }
                                        else
                                        {
                                        nut_4=0;
                                        }
                                    }        
                                    else
                                    {
                                        check_sync_bit();
                                        if(sync_bit_detect==1)
                                        {
                                            nhan_du_lieu();
                                            ptr_to_eeprom=d;
                                            for(i=0;i<12;i++)
                                            {  
                                                z[i]=0;
                                                *(ptr_to_eeprom+i)=0;
                                                z[i]=data[i];
                                                *(ptr_to_eeprom+i)=data[i];
                                            }
                                            den_4=0;
                                            delay_ms(200);
                                            den_4=1;
                                            delay_ms(200);
                                            den_4=0;
                                            delay_ms(200);
                                            den_4=1;
                                        }
                                    }
                                }
                            } 
                          }
                        }
                    }
                }
            }
            if(PIND.0!=0)          ////khi khong bam nut hoat dong o che do binh thuong
            {
                check_data_1=0; check_data_2=0; check_data_3=0; check_data_4=0;
                check_sync_bit();
                if(sync_bit_detect==1)
                nhan_du_lieu();
                for(i=0;i<12;i++)
                {
                    if(data[i]==x[i])
                    { 
                        check_data_1++;
                    }
                    if(data[i]==y[i])
                    {
                        check_data_2++;
                    }
                    if(data[i]==z[i])
                    {
                        check_data_3++;
                    }
                    if(data[i]==o[i])
                    {
                        check_data_4++;
                    }
                }
                if(check_data_1==12)
                {
                    if(PORTC.3==0)
                    {
                        PORTB.4=1;
                        PORTC.3=1;
                    }           
                    else
                    {
                        PORTB.4=0;
                        PORTC.3=0;
                    }
                }
             
                if(check_data_2==12)
                {
                    if(PORTC.2==0)
                    {
                        PORTB.3=1;
                        PORTC.2=1;
                    }
                    else
                    {
                        PORTB.3=0;
                        PORTC.2=0;
                    }
                }
                if(check_data_3==12)
                {
                    if(PORTC.1==0)
                    {
                        PORTB.2=1;
                        PORTC.1=1;
                    }
                    else
                    {
                        PORTB.2=0;
                        PORTC.1=0;
                    }
                }
                if(check_data_4==12)
                {
                    if(PORTC.0==0)
                    {
                        PORTB.1=1;
                        PORTC.0=1;
                    }
                    else
                    {
                        PORTB.1=0;
                        PORTC.0=0;
                    }
                }
            }
             
             
            }   
            }

            Comment


            • #36
              Nguyên văn bởi queduong Xem bài viết
              Bạn lập trình thì quan trọng nhất cái khâu giải thuật ... Từng bước làm những cái gì thì mới làm được, chứ lộn tùng phèo thì làm cả tháng chưa chắc đã được.
              Học lệnh :
              1) bấm nút ... Chạy chương trình học lệnh, không bấm nút, chạy chương trình giải mã ( chương trình điều khiển )... Lúc này ta phân chia hẳn ra làm 2 chương trình con, chẳng bao giờ sợ nhầm lẫn ), nút bấm này có thể đưa vào ngắt ngoài ( là tốt nhất ) hay ngắt timer để kiểm tra... Chứ chỗ nào cũng kiểm tra mấy cái nút bấm thì lấy thời gian đâu mà giải mã với nhận biết sync.
              2) kt nhận sync bit ... Nếu kt 1 lần sợ nhiễu làm sai thì bạn kiểm tra sync liên tục vài chục lần vào, kiểm tra ngặt ngèo như thế xem nhiễu nó có chui vào được không ? Chẳng có lẽ nhiễu nó cũng Khôn đến nỗi biết được cả chu kì, định dạng mà chui vào. Cái này tôi cho rằng cần phải động não, người lập trình nào cũng cần phải có tư duy - động não để khắc phục hay đi con đường mới.
              3) nhận địa chỉ, data theo đầy đủ định dạng trong datasheet ( 8 địa chỉ + 4 data)
              4) lưu nó vào eeprom nếu là chương trình học lệnh, so sánh nó với dữ liệu trong eeprom ( để xem nó đúng thì bạt tắt đèn hay làm gì đó...v.v ) nếu là chương trình giải mã.



              Khi chạy chương trình ( lúc mới khởi động ) thì đọc giá trị dữ liệu eeprom ra để lấy cái mà so sánh khi dùng MODE giải mã.

              trong chương trình con check sync bit có lệnh chờ cho chân nhận dữ liệu lên 1 thì thu : while(!Rx);
              lệnh này làm chương trình bị lặp không thoát dc, có cách nào sửa ko a? kể cả mấy cái while tương tự bên dưới nữa?

              Comment


              • #37
                Các lệnh này lúc nào cũng chạy, chỉ trừ trường hợp module thu bị hỏng.
                Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                Comment


                • #38
                  Tất cả các chương trình, muốn làm gì thì làm phải ưu tiên tất cả cho việc kiểm tra sync liên tục, bắt được sync mới nghĩ đến cái khác, nếu không ưu tiên xử lý cho nó mà cứ kỉêm tra các tác vụ khác (if, if, if ) thì sẽ bị tốn thời gian ở những chỗ này, sync bit sẽ chạy mất, không bắt được thì sẽ không bao giờ chạy.
                  Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                  Comment


                  • #39
                    Nguyên văn bởi queduong Xem bài viết
                    Tất cả các chương trình, muốn làm gì thì làm phải ưu tiên tất cả cho việc kiểm tra sync liên tục, bắt được sync mới nghĩ đến cái khác, nếu không ưu tiên xử lý cho nó mà cứ kỉêm tra các tác vụ khác (if, if, if ) thì sẽ bị tốn thời gian ở những chỗ này, sync bit sẽ chạy mất, không bắt được thì sẽ không bao giờ chạy.
                    Em làm nó nhận dc sync bit rồi, và chắc chắn là nó học dc lệnh rồi luôn a, vì e cho nó học xong lưu vào eeprom. Xong rồi giải mã và kiểm tra data thu được với eeprom, nếu kiểm tra đúng 12 bit địa chỉ và data thì mới làm việc, thì nó lúc nhận được lúc ko mà ko biết tại sao như v

                    Comment


                    • #40
                      Bạn khoanh vùng từng chương trình con hay quá trình ra hi vọng nó sẽ tốt hơn. Điều tôi nhắc bạn cần luôn nhớ là quá trình bạn kiểm tra dữ liệu với eeprom có thể mất thời gian ==> đến chu trình sau bắt sync bị lệch ( tức là không liên tục, bị ngắt quãng ) nên có thể bị lập bập. Bởi vậy cho nên việc bắt sync là quan trọng nhất ... Phải bắt buộc ... bắt cho bằng được, Nếu không bắt được sync thì cũng không cho phép nhảy khỏi chương trình bắt sync ( kể cả bị nhiễu - ta cần phải kiểm tra nhiều lần để hạn chế nhiễu ngẫu nhiên).

                      --- Để hạn chế nhiễu ngẫu nhiên và bắt sync dễ dàng, chính xác ( khi chương trình đã viết chính xác ) ... ta cũng có thể : Bấm nút trên remote trước và giữ nút rồi đồng thời bấm nút học lệnh ... điều này cho phép tín hiệu của Remote át hết nhiễu ngẫu nhiên ( chỉ còn các tín hiệu ( xung ) sync và địa chỉ, dữ liệu của PT2262 phát ra ), với cách này ta nhận được tín hiệu HOÀN TOÀN SẠCH ... có thể Lấy nó, dùng nó để ghi vào bộ nhớ
                      Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                      Comment


                      • #41
                        Nguyên văn bởi queduong Xem bài viết
                        Bạn khoanh vùng từng chương trình con hay quá trình ra hi vọng nó sẽ tốt hơn. Điều tôi nhắc bạn cần luôn nhớ là quá trình bạn kiểm tra dữ liệu với eeprom có thể mất thời gian ==> đến chu trình sau bắt sync bị lệch ( tức là không liên tục, bị ngắt ...
                        Code:
                        /*******************************************************
                        This program was created by the
                        CodeWizardAVR V3.12 Advanced
                        Automatic Program Generator
                        © Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
                        http://www.hpinfotech.com
                        
                        Project : 
                        Version : 
                        Date    : 11/9/2015
                        Author  : 
                        Company : 
                        Comments: 
                        
                        
                        Chip type               : ATmega8A
                        Program type            : Application
                        AVR Core Clock frequency: 8.000000 MHz
                        Memory model            : Small
                        External RAM size       : 0
                        Data Stack size         : 256
                        *******************************************************/
                        
                        #include <mega8.h>
                        #include <delay.h>
                        #define den_mode    PORTD.4
                        #define den_1       PORTB.4
                        #define den_2       PORTB.3
                        #define den_3       PORTB.2
                        #define den_4       PORTB.1
                        #define button      PIND.2
                        #define relay_1     PORTC.3
                        #define relay_2     PORTC.2
                        #define relay_3     PORTC.1
                        #define relay_4     PORTC.0
                        #define rf_data_in  PINC.5
                        // Declare your global variables here
                        unsigned long chuki_4a, sync_bit_detect;
                        eeprom unsigned char a[12],b[12],c[12],d[12];
                        unsigned char eeprom *ptr_to_eeprom;
                        unsigned int decode_mode=1, learn_mode=0;
                        unsigned char data[12];
                        // External Interrupt 0 service routine
                        interrupt [EXT_INT0] void ext_int0_isr(void)
                        {
                        // Place your code here
                        if(decode_mode==1)      /// chuong trinh ngat de chuyen tu decode_mode sang learn_mode
                        {
                            decode_mode=0;
                        }
                        }
                        
                        // Timer1 overflow interrupt service routine
                        interrupt [TIM1_OVF] void timer1_ovf_isr(void)
                        {
                        // Place your code here
                        
                        }
                        ///// CHUONG TRINH CON DO SYNC BIT ///////
                        void check_sync_bit()
                        {
                            unsigned long xung_cao,xung_thap;
                            sync_bit_detect=0;
                            chuki_4a=0;
                            while(!rf_data_in)
                            {                   /// trong decode_mode neu co bam nut thi break de thoat ra
                                if(button==0)
                                break;
                            }
                            TCNT1=0;
                            while(rf_data_in)
                            {
                                if(button==0)
                                break;
                            }
                            #asm ("cli");
                            xung_cao=TCNT1;
                            TCNT1=0;
                            #asm ("sei");
                            while(!rf_data_in)
                            {
                                if(button==0)
                                break;
                            }
                            #asm ("cli");
                            xung_thap=TCNT1;
                            TCNT1=0;
                            #asm ("sei");
                        //////kiem tra xem co phai sync bit khong///////////
                            if(xung_thap>xung_cao)
                            {
                               if((xung_thap+xung_cao)>=3000&&(xung_thap+xung_cao)<=20480)   /// cai nay e nghi la gioi han chieu dai cua sync bit de no khong phai la nhieu
                                if((xung_thap/xung_cao>30)&&(xung_thap/xung_cao<32))
                                {
                                    sync_bit_detect= 1;
                                    chuki_4a=xung_cao;
                                }
                            }
                        }
                        ///// CHUONG TRINH CON NHAN DU LIEU /////
                        void nhan_du_lieu() ////thu du lieu va ghi vao data[]
                        {
                        int i,j,ketqua_1,ketqua_2;
                        unsigned long xung_cao,xung_thap;
                            for(i=0; i<12; i++)
                            {
                                for(j=0;j<2;j++)
                                {
                                    while(rf_data_in);
                                    #asm ("cli");
                                    xung_cao=TCNT1;
                                    TCNT1=0;
                                    #asm ("sei");
                                    while(!rf_data_in);
                                    #asm ("cli");
                                    xung_thap=TCNT1;
                                    TCNT1=0;
                                    #asm("sei")
                                    if(j==0)
                                    {
                                        if((xung_cao>chuki_4a/2)&&(xung_cao<chuki_4a*2))
                                        ketqua_1=0;
                                        else ketqua_1=1;
                                    }
                                    if(j==1)
                                    {
                                        if((xung_cao>chuki_4a/2)&&(xung_cao<chuki_4a*2))
                                        ketqua_2=0;
                                        else ketqua_2=1;
                                    }
                                }
                                if((ketqua_1==0)&&(ketqua_2==0))
                                data[i]='0';
                                else
                                if((ketqua_1==1)&&(ketqua_2==1))
                                data[i]='1';
                                else
                                data[i]='f';
                            }
                        }
                        //// CHUONG TRINH CHINH ////// 
                        void main(void)
                        {
                        // Declare your local variables here
                        unsigned int i,j, hoc_kenh_1, hoc_kenh_2,hoc_kenh_3,hoc_kenh_4,xong_kenh_1,xong_kenh_2,xong_kenh_3,xong_kenh_4;
                        unsigned int check_kenh_1,check_kenh_2,check_kenh_3,check_kenh_4;
                        unsigned char x[12],y[12],z[12],v[12];
                         
                        // Input/Output Ports initialization
                        // Port B initialization
                        // Function: Bit7=In Bit6=In Bit5=In Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=In 
                        DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (0<<DDB0);
                        // State: Bit7=T Bit6=T Bit5=T Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=T 
                        PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
                        
                        // Port C initialization
                        // Function: Bit6=In Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=Out 
                        DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
                        // State: Bit6=T Bit5=T Bit4=T Bit3=0 Bit2=0 Bit1=0 Bit0=0 
                        PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
                        
                        // Port D initialization
                        // Function: Bit7=In Bit6=In Bit5=In Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In 
                        DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
                        // State: Bit7=T Bit6=T Bit5=T Bit4=1 Bit3=T Bit2=P Bit1=T Bit0=T 
                        PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (1<<PORTD4) | (0<<PORTD3) | (1<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
                        
                        // Timer/Counter 0 initialization
                        // Clock source: System Clock
                        // Clock value: Timer 0 Stopped
                        TCCR0=(0<<CS02) | (0<<CS01) | (0<<CS00);
                        TCNT0=0x00;
                        
                        // Timer/Counter 1 initialization
                        // Clock source: System Clock
                        // Clock value: 1000.000 kHz
                        // Mode: Normal top=0xFFFF
                        // OC1A output: Disconnected
                        // OC1B output: Disconnected
                        // Noise Canceler: Off
                        // Input Capture on Falling Edge
                        // Timer Period: 65.536 ms
                        // Timer1 Overflow Interrupt: On
                        // Input Capture Interrupt: Off
                        // Compare A Match Interrupt: Off
                        // Compare B Match Interrupt: Off
                        TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
                        TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
                        TCNT1H=0x00;
                        TCNT1L=0x00;
                        ICR1H=0x00;
                        ICR1L=0x00;
                        OCR1AH=0x00;
                        OCR1AL=0x00;
                        OCR1BH=0x00;
                        OCR1BL=0x00;
                        
                        // Timer/Counter 2 initialization
                        // Clock source: System Clock
                        // Clock value: Timer2 Stopped
                        // Mode: Normal top=0xFF
                        // OC2 output: Disconnected
                        ASSR=0<<AS2;
                        TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
                        TCNT2=0x00;
                        OCR2=0x00;
                        
                        // Timer(s)/Counter(s) Interrupt(s) initialization
                        TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (1<<TOIE1) | (0<<TOIE0);
                        
                        // External Interrupt(s) initialization
                        // INT0: On
                        // INT0 Mode: Falling Edge
                        // INT1: Off
                        GICR|=(0<<INT1) | (1<<INT0);
                        MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
                        GIFR=(0<<INTF1) | (1<<INTF0);
                        
                        // USART initialization
                        // USART disabled
                        UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
                        
                        // Analog Comparator initialization
                        // Analog Comparator: Off
                        // The Analog Comparator's positive input is
                        // connected to the AIN0 pin
                        // The Analog Comparator's negative input is
                        // connected to the AIN1 pin
                        ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
                        SFIOR=(0<<ACME);
                        
                        // ADC initialization
                        // ADC disabled
                        ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
                        
                        // SPI initialization
                        // SPI disabled
                        SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
                        
                        // TWI initialization
                        // TWI disabled
                        TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
                        
                        /////chuong trinh de coppy du lieu tu eeprom vao 4 mang x,y,z,v khi moi khoi dong /////                                                                           
                        for(i=0;i<4;i++)
                        {
                            if(i==0)
                            {
                                ptr_to_eeprom=a;
                                for(j=0;j<12;j++)
                                x[j]=*(ptr_to_eeprom+j);
                            }
                            if(i==1)
                            {
                               ptr_to_eeprom=b;
                                for(j=0;j<12;j++)
                                y[j]=*(ptr_to_eeprom+j);
                            }
                            if(i==2)
                            {
                               ptr_to_eeprom=c;
                                for(j=0;j<12;j++)
                                z[j]=*(ptr_to_eeprom+j);
                            }
                            if(i==3)
                            {
                                ptr_to_eeprom=d;
                                for(j=0;j<12;j++)
                                v[j]=*(ptr_to_eeprom+j);
                            }
                        }
                        // Global enable interrupts
                        #asm("sei")
                        point:
                        //// CHUONG TRINH GIAI MA DECODE_MODE//////
                        while(decode_mode==1)
                        {
                            check_sync_bit();
                            if(sync_bit_detect==1)
                            {
                               nhan_du_lieu();
                               check_kenh_1=check_kenh_2=check_kenh_3=check_kenh_4=1;
                               
                               for(i=0;i<12;i++)       //// kiem tra 12 byte data vua nhan va data trong eeprom //////
                               {
                                if(data[i]==x[i])
                                check_kenh_1++;
                                if(data[i]==y[i])
                                check_kenh_2++;
                                if(data[i]==z[i])
                                check_kenh_3++;
                                if(data[i]==v[i])
                                check_kenh_4++;
                               }
                               if(check_kenh_1==12)            //// kenh nao dung thi thuc thi /////
                               {                               ///                             ////
                                if(den_1==0||relay_1==0)       ///                             ////
                                {den_1=1;relay_1=1;}            
                                else {den_1=0;relay_1=0;}
                               }
                               if(check_kenh_2==12)
                               {
                                if(den_2==0||relay_2==0)
                                {den_1=2;relay_2=1;}
                                else {den_2=0;relay_2=0;}
                               }
                               if(check_kenh_3==12)
                               {
                                if(den_3==0||relay_3==0)
                                {den_1=3;relay_3=1;}
                                else {den_3=0;relay_3=0;}
                               }
                               if(check_kenh_4==12)
                               {
                                if(den_4==0||relay_4==0)       ///                              ////
                                {den_4=1;relay_4=1;}           ///                              ////
                                else {den_4=0;relay_4=0;}      ///                              ////
                               }                               /////////////////////////////////////
                                
                            }
                        }
                        ///// CHUONG TRINH HOC LENH LEARN_MODE ///////
                        while(learn_mode==1)
                        {
                            hoc_kenh_1=1;
                            while(hoc_kenh_1==1)                     /// hoc kenh 1 ///
                            {
                                PORTB=0;
                                den_1=1;
                                check_sync_bit();
                                if(sync_bit_detect==1)
                                {
                                    nhan_du_lieu();
                                    ptr_to_eeprom=a;
                                    for(i=0;i<12;i++)
                                    {
                                        x[i]=data[i];
                                        *(ptr_to_eeprom+i)=data[i];
                                    }
                                    xong_kenh_1=1;
                                    while(xong_kenh_1==1)            /// hoc xong kenh 1 cho bam nut de chuyen qua kenh 2 ////
                                    {
                                        den_1=0;
                                        delay_ms(50);
                                        den_1=1;
                                        delay_ms(50);
                                        if(button==0)
                                        {
                                            hoc_kenh_1=0;
                                            hoc_kenh_2=1;
                                            break;
                                        }
                                    }          
                                }
                                
                            }
                            while(hoc_kenh_2==1)                   //// hoc kenh 2 /////
                            {
                                PORTB=0;
                                den_2=1;
                                check_sync_bit();
                                if(sync_bit_detect==1)
                                {
                                    nhan_du_lieu();
                                    ptr_to_eeprom=b;
                                    for(i=0;i<12;i++)
                                    {
                                        y[i]=data[i];
                                        *(ptr_to_eeprom+i)=data[i];
                                    }
                                    xong_kenh_2=1;
                                    while(xong_kenh_2==1)               //// xong kenh 2 cho bam nut chuyen qua kenh 3////
                                    {
                                        den_2=0;
                                        delay_ms(50);
                                        den_2=1;
                                        delay_ms(50);
                                        if(button==0)
                                        {
                                            hoc_kenh_2=0;
                                            hoc_kenh_3=1;
                                            break;
                                        }
                                    } 
                                }
                                
                            }                                                   //// hoc kenh 3 //////
                            while(hoc_kenh_3==1)
                            {
                                PORTB=0;
                                den_3=1;
                                check_sync_bit();
                                if(sync_bit_detect==1)
                                {
                                    nhan_du_lieu();
                                    ptr_to_eeprom=c;
                                    for(i=0;i<12;i++)
                                    {
                                        z[i]=data[i];
                                        *(ptr_to_eeprom+i)=data[i];
                                    }
                                    xong_kenh_3=1;
                                    while(xong_kenh_3==1)                         //// xong kenh 3 cho bam nut chuyen qua kenh 4////
                                    {
                                        den_3=0;
                                        delay_ms(50);
                                        den_3=1;
                                        delay_ms(50);
                                        if(button==0)
                                        {
                                            hoc_kenh_3=0;
                                            hoc_kenh_4=1;
                                            break;
                                        }
                                    }
                                }
                                
                            }                                                    /// hoc kenh 4 ////
                            while(hoc_kenh_4==1)
                            {
                                PORTB=0;
                                den_4=1;
                                check_sync_bit();
                                if(sync_bit_detect==1)
                                {
                                    nhan_du_lieu();
                                    ptr_to_eeprom=d;
                                    for(i=0;i<12;i++)
                                    {
                                        v[i]=data[i];
                                        *(ptr_to_eeprom+i)=data[i];
                                    }
                                    xong_kenh_4=1;
                                    while(xong_kenh_4==1)                          //// xong kenh 4 cho bam nut chuyen lai kenh 1////
                                    {
                                        den_4=0;
                                        delay_ms(50);
                                        den_4=1;
                                        delay_ms(50);
                                        if(button==0)
                                        {
                                            hoc_kenh_4=0;
                                            hoc_kenh_1=1;
                                            break;
                                        }
                                    }
                                    
                                }
                                
                            }
                        }    
                        //// PHAN NAY DE THUC HIEN KHI CO NUT BAM, CHUYEN SANG LEARN_MODE ////         
                        while (1)
                        {
                        if(decode_mode==0)
                        {
                            learn_mode=1;
                            goto point; 
                        }
                        
                        }
                        }
                        đây là chương trình em viết thế này ( có chú thích rõ ràng) : bình thường chạy chế độ decode_mode, khi bấm nút chạy learn_mode, hoc xong thì báo đèn nhấp kênh đó và chờ bấm nút để qua kênh tiếp theo. học xong 4 kênh thì rút điện cho nó reset lại vào chế độ decode_mode.
                        a xem giúp e tại sao học ok mà chạy decode_mode thì ko có phản ứng j? còn như a nói là giữ nút remote rồi bấm học lệnh thì nó ko học dc mà vào học lệnh trước rồi bấm thì nó mới dc @@

                        Comment


                        • #42
                          Nguyên văn bởi angelhades Xem bài viết
                          Code:
                          /*******************************************************
                          This program was created by the
                          CodeWizardAVR V3.12 Advanced
                          Automatic Program Generator
                          © Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
                          http://www.hpinfotech.com
                          
                          Project :
                          Version :
                          Date : 11/9/2015
                          Author :
                          Company :
                          Comments:
                          
                          
                          Chip type : ATmega8A
                          Program type : Application
                          AVR Core Clock frequency: 8.000000 MHz
                          Memory model : Small
                          External RAM size : 0
                          Data Stack size : 256
                          *******************************************************/
                          
                          #include <mega8.h>
                          #include <delay.h>
                          #define den_mode PORTD.4
                          #define den_1 PORTB.4
                          #define den_2 PORTB.3
                          #define den_3 PORTB.2
                          #define den_4 PORTB.1
                          #define button PIND.2
                          #define relay_1 PORTC.3
                          #define relay_2 PORTC.2
                          #define relay_3 PORTC.1
                          #define relay_4 PORTC.0
                          #define rf_data_in PINC.5
                          // Declare your global variables here
                          unsigned long chuki_4a, sync_bit_detect;
                          eeprom unsigned char a[12],b[12],c[12],d[12];
                          unsigned char eeprom *ptr_to_eeprom;
                          unsigned int decode_mode=1, learn_mode=0;
                          unsigned char data[12];
                          // External Interrupt 0 service routine
                          interrupt [EXT_INT0] void ext_int0_isr(void)
                          {
                          // Place your code here
                          if(decode_mode==1) /// chuong trinh ngat de chuyen tu decode_mode sang learn_mode
                          {
                          decode_mode=0;
                          }
                          }
                          
                          // Timer1 overflow interrupt service routine
                          interrupt [TIM1_OVF] void timer1_ovf_isr(void)
                          {
                          // Place your code here
                          
                          }
                          ///// CHUONG TRINH CON DO SYNC BIT ///////
                          void check_sync_bit()
                          {
                          unsigned long xung_cao,xung_thap;
                          sync_bit_detect=0;
                          chuki_4a=0;
                          while(!rf_data_in)
                          { /// trong decode_mode neu co bam nut thi break de thoat ra
                          if(button==0)
                          break;
                          }
                          TCNT1=0;
                          while(rf_data_in)
                          {
                          if(button==0)
                          break;
                          }
                          #asm ("cli");
                          xung_cao=TCNT1;
                          TCNT1=0;
                          #asm ("sei");
                          while(!rf_data_in)
                          {
                          if(button==0)
                          break;
                          }
                          #asm ("cli");
                          xung_thap=TCNT1;
                          TCNT1=0;
                          #asm ("sei");
                          //////kiem tra xem co phai sync bit khong///////////
                          if(xung_thap>xung_cao)
                          {
                          if((xung_thap+xung_cao)>=3000&&(xung_thap+xung_cao)<=20480) /// cai nay e nghi la gioi han chieu dai cua sync bit de no khong phai la nhieu
                          if((xung_thap/xung_cao>30)&&(xung_thap/xung_cao<32))
                          {
                          sync_bit_detect= 1;
                          chuki_4a=xung_cao;
                          }
                          }
                          }
                          ///// CHUONG TRINH CON NHAN DU LIEU /////
                          void nhan_du_lieu() ////thu du lieu va ghi vao data[]
                          {
                          int i,j,ketqua_1,ketqua_2;
                          unsigned long xung_cao,xung_thap;
                          for(i=0; i<12; i++)
                          {
                          for(j=0;j<2;j++)
                          {
                          while(rf_data_in);
                          #asm ("cli");
                          xung_cao=TCNT1;
                          TCNT1=0;
                          #asm ("sei");
                          while(!rf_data_in);
                          #asm ("cli");
                          xung_thap=TCNT1;
                          TCNT1=0;
                          #asm("sei")
                          if(j==0)
                          {
                          if((xung_cao>chuki_4a/2)&&(xung_cao<chuki_4a*2))
                          ketqua_1=0;
                          else ketqua_1=1;
                          }
                          if(j==1)
                          {
                          if((xung_cao>chuki_4a/2)&&(xung_cao<chuki_4a*2))
                          ketqua_2=0;
                          else ketqua_2=1;
                          }
                          }
                          if((ketqua_1==0)&&(ketqua_2==0))
                          data[i]='0';
                          else
                          if((ketqua_1==1)&&(ketqua_2==1))
                          data[i]='1';
                          else
                          data[i]='f';
                          }
                          }
                          //// CHUONG TRINH CHINH //////
                          void main(void)
                          {
                          // Declare your local variables here
                          unsigned int i,j, hoc_kenh_1, hoc_kenh_2,hoc_kenh_3,hoc_kenh_4,xong_kenh_1,xong_kenh_2,xong_kenh_3,xong_kenh_4;
                          unsigned int check_kenh_1,check_kenh_2,check_kenh_3,check_kenh_4;
                          unsigned char x[12],y[12],z[12],v[12];
                          
                          // Input/Output Ports initialization
                          // Port B initialization
                          // Function: Bit7=In Bit6=In Bit5=In Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=In
                          DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (0<<DDB0);
                          // State: Bit7=T Bit6=T Bit5=T Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=T
                          PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
                          
                          // Port C initialization
                          // Function: Bit6=In Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=Out
                          DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
                          // State: Bit6=T Bit5=T Bit4=T Bit3=0 Bit2=0 Bit1=0 Bit0=0
                          PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
                          
                          // Port D initialization
                          // Function: Bit7=In Bit6=In Bit5=In Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In
                          DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
                          // State: Bit7=T Bit6=T Bit5=T Bit4=1 Bit3=T Bit2=P Bit1=T Bit0=T
                          PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (1<<PORTD4) | (0<<PORTD3) | (1<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
                          
                          // Timer/Counter 0 initialization
                          // Clock source: System Clock
                          // Clock value: Timer 0 Stopped
                          TCCR0=(0<<CS02) | (0<<CS01) | (0<<CS00);
                          TCNT0=0x00;
                          
                          // Timer/Counter 1 initialization
                          // Clock source: System Clock
                          // Clock value: 1000.000 kHz
                          // Mode: Normal top=0xFFFF
                          // OC1A output: Disconnected
                          // OC1B output: Disconnected
                          // Noise Canceler: Off
                          // Input Capture on Falling Edge
                          // Timer Period: 65.536 ms
                          // Timer1 Overflow Interrupt: On
                          // Input Capture Interrupt: Off
                          // Compare A Match Interrupt: Off
                          // Compare B Match Interrupt: Off
                          TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
                          TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
                          TCNT1H=0x00;
                          TCNT1L=0x00;
                          ICR1H=0x00;
                          ICR1L=0x00;
                          OCR1AH=0x00;
                          OCR1AL=0x00;
                          OCR1BH=0x00;
                          OCR1BL=0x00;
                          
                          // Timer/Counter 2 initialization
                          // Clock source: System Clock
                          // Clock value: Timer2 Stopped
                          // Mode: Normal top=0xFF
                          // OC2 output: Disconnected
                          ASSR=0<<AS2;
                          TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
                          TCNT2=0x00;
                          OCR2=0x00;
                          
                          // Timer(s)/Counter(s) Interrupt(s) initialization
                          TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (1<<TOIE1) | (0<<TOIE0);
                          
                          // External Interrupt(s) initialization
                          // INT0: On
                          // INT0 Mode: Falling Edge
                          // INT1: Off
                          GICR|=(0<<INT1) | (1<<INT0);
                          MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
                          GIFR=(0<<INTF1) | (1<<INTF0);
                          
                          // USART initialization
                          // USART disabled
                          UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
                          
                          // Analog Comparator initialization
                          // Analog Comparator: Off
                          // The Analog Comparator's positive input is
                          // connected to the AIN0 pin
                          // The Analog Comparator's negative input is
                          // connected to the AIN1 pin
                          ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
                          SFIOR=(0<<ACME);
                          
                          // ADC initialization
                          // ADC disabled
                          ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
                          
                          // SPI initialization
                          // SPI disabled
                          SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
                          
                          // TWI initialization
                          // TWI disabled
                          TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
                          
                          /////chuong trinh de coppy du lieu tu eeprom vao 4 mang x,y,z,v khi moi khoi dong /////
                          for(i=0;i<4;i++)
                          {
                          if(i==0)
                          {
                          ptr_to_eeprom=a;
                          for(j=0;j<12;j++)
                          x[j]=*(ptr_to_eeprom+j);
                          }
                          if(i==1)
                          {
                          ptr_to_eeprom=b;
                          for(j=0;j<12;j++)
                          y[j]=*(ptr_to_eeprom+j);
                          }
                          if(i==2)
                          {
                          ptr_to_eeprom=c;
                          for(j=0;j<12;j++)
                          z[j]=*(ptr_to_eeprom+j);
                          }
                          if(i==3)
                          {
                          ptr_to_eeprom=d;
                          for(j=0;j<12;j++)
                          v[j]=*(ptr_to_eeprom+j);
                          }
                          }
                          // Global enable interrupts
                          #asm("sei")
                          point:
                          //// CHUONG TRINH GIAI MA DECODE_MODE//////
                          while(decode_mode==1)
                          {
                          check_sync_bit();
                          if(sync_bit_detect==1)
                          {
                          nhan_du_lieu();
                          check_kenh_1=check_kenh_2=check_kenh_3=check_kenh_4=1;
                          
                          for(i=0;i<12;i++) //// kiem tra 12 byte data vua nhan va data trong eeprom //////
                          {
                          if(data[i]==x[i])
                          check_kenh_1++;
                          if(data[i]==y[i])
                          check_kenh_2++;
                          if(data[i]==z[i])
                          check_kenh_3++;
                          if(data[i]==v[i])
                          check_kenh_4++;
                          }
                          if(check_kenh_1==12) //// kenh nao dung thi thuc thi /////
                          { /// ////
                          if(den_1==0||relay_1==0) /// ////
                          {den_1=1;relay_1=1;}
                          else {den_1=0;relay_1=0;}
                          }
                          if(check_kenh_2==12)
                          {
                          if(den_2==0||relay_2==0)
                          {den_1=2;relay_2=1;}
                          else {den_2=0;relay_2=0;}
                          }
                          if(check_kenh_3==12)
                          {
                          if(den_3==0||relay_3==0)
                          {den_1=3;relay_3=1;}
                          else {den_3=0;relay_3=0;}
                          }
                          if(check_kenh_4==12)
                          {
                          if(den_4==0||relay_4==0) /// ////
                          {den_4=1;relay_4=1;} /// ////
                          else {den_4=0;relay_4=0;} /// ////
                          } /////////////////////////////////////
                          
                          }
                          }
                          ///// CHUONG TRINH HOC LENH LEARN_MODE ///////
                          while(learn_mode==1)
                          {
                          hoc_kenh_1=1;
                          while(hoc_kenh_1==1) /// hoc kenh 1 ///
                          {
                          PORTB=0;
                          den_1=1;
                          check_sync_bit();
                          if(sync_bit_detect==1)
                          {
                          nhan_du_lieu();
                          ptr_to_eeprom=a;
                          for(i=0;i<12;i++)
                          {
                          x[i]=data[i];
                          *(ptr_to_eeprom+i)=data[i];
                          }
                          xong_kenh_1=1;
                          while(xong_kenh_1==1) /// hoc xong kenh 1 cho bam nut de chuyen qua kenh 2 ////
                          {
                          den_1=0;
                          delay_ms(50);
                          den_1=1;
                          delay_ms(50);
                          if(button==0)
                          {
                          hoc_kenh_1=0;
                          hoc_kenh_2=1;
                          break;
                          }
                          }
                          }
                          
                          }
                          while(hoc_kenh_2==1) //// hoc kenh 2 /////
                          {
                          PORTB=0;
                          den_2=1;
                          check_sync_bit();
                          if(sync_bit_detect==1)
                          {
                          nhan_du_lieu();
                          ptr_to_eeprom=b;
                          for(i=0;i<12;i++)
                          {
                          y[i]=data[i];
                          *(ptr_to_eeprom+i)=data[i];
                          }
                          xong_kenh_2=1;
                          while(xong_kenh_2==1) //// xong kenh 2 cho bam nut chuyen qua kenh 3////
                          {
                          den_2=0;
                          delay_ms(50);
                          den_2=1;
                          delay_ms(50);
                          if(button==0)
                          {
                          hoc_kenh_2=0;
                          hoc_kenh_3=1;
                          break;
                          }
                          }
                          }
                          
                          } //// hoc kenh 3 //////
                          while(hoc_kenh_3==1)
                          {
                          PORTB=0;
                          den_3=1;
                          check_sync_bit();
                          if(sync_bit_detect==1)
                          {
                          nhan_du_lieu();
                          ptr_to_eeprom=c;
                          for(i=0;i<12;i++)
                          {
                          z[i]=data[i];
                          *(ptr_to_eeprom+i)=data[i];
                          }
                          xong_kenh_3=1;
                          while(xong_kenh_3==1) //// xong kenh 3 cho bam nut chuyen qua kenh 4////
                          {
                          den_3=0;
                          delay_ms(50);
                          den_3=1;
                          delay_ms(50);
                          if(button==0)
                          {
                          hoc_kenh_3=0;
                          hoc_kenh_4=1;
                          break;
                          }
                          }
                          }
                          
                          } /// hoc kenh 4 ////
                          while(hoc_kenh_4==1)
                          {
                          PORTB=0;
                          den_4=1;
                          check_sync_bit();
                          if(sync_bit_detect==1)
                          {
                          nhan_du_lieu();
                          ptr_to_eeprom=d;
                          for(i=0;i<12;i++)
                          {
                          v[i]=data[i];
                          *(ptr_to_eeprom+i)=data[i];
                          }
                          xong_kenh_4=1;
                          while(xong_kenh_4==1) //// xong kenh 4 cho bam nut chuyen lai kenh 1////
                          {
                          den_4=0;
                          delay_ms(50);
                          den_4=1;
                          delay_ms(50);
                          if(button==0)
                          {
                          hoc_kenh_4=0;
                          hoc_kenh_1=1;
                          break;
                          }
                          }
                          
                          }
                          
                          }
                          }
                          //// PHAN NAY DE THUC HIEN KHI CO NUT BAM, CHUYEN SANG LEARN_MODE ////
                          while (1)
                          {
                          if(decode_mode==0)
                          {
                          learn_mode=1;
                          goto point;
                          }
                          
                          }
                          }
                          đây là chương trình em viết thế này ( có chú thích rõ ràng) : bình thường chạy chế độ decode_mode, khi bấm nút chạy learn_mode, hoc xong thì báo đèn nhấp kênh đó và chờ bấm nút để qua kênh tiếp theo. học xong 4 kênh thì rút điện cho nó reset lại vào chế độ decode_mode.
                          a xem giúp e tại sao học ok mà chạy decode_mode thì ko có phản ứng j? còn như a nói là giữ nút remote rồi bấm học lệnh thì nó ko học dc mà vào học lệnh trước rồi bấm thì nó mới dc @@
                          Mình không có nhiều thời gian xem mã nhưng nếu bạn giữ nút trên remote sau đó bấm nút vào learn mode mà không chạy được thì chương trình của bạn đã có vấn đề.
                          --- Muốn xem sync có chuẩn không thì viết 1 chương trình nhận sync ... nhận chuẩn thì nháy đèn. Không nhấn nút remote mà đèn nháy nghĩa là bị nhiễu. Bấm nút remote thì đèn phải sáng đều đặn .
                          VD :
                          while(1)
                          {
                          seek:
                          kiem_tra_sync();
                          if(xung_thap>xung_cao)
                          {
                          if(xung_thap>xung_cao/30)&&..................................
                          { den1 =1; Delay_ms(200); den1=0;}
                          else goto seek;
                          }
                          else goto seek;
                          }



                          //////////////////////////////

                          Một điều nữa là chương trình của bạn viết rất lủng củng ( có vẻ do kiến thức lập trình C không tốt ) và lạm dụng quá nhiều lệnh while { }

                          --- với 4 nút và 1 mode học lệnh bạn chỉ cần làm 1 chương trình và ghi 4 giá trị học lệnh là có thể giải quyết vấn đề rồi.

                          VD :
                          khai báo
                          bit learn_mode;
                          char lenh;

                          interrupt [EXT_INT0] void ext_int0_isr(void) // Ngắt ngoài
                          {
                          learn_mode=1; // vào learn_mode
                          lenh++; if(lenh>4) { lenh=0; learn_mode=0; } // Bấm tuần tự 4 lần để học 4 lệnh, bấm lần thứ 5 để thoát khỏi learn_mode.
                          }

                          void main()
                          {
                          learn_mode =0;
                          lenh =0;

                          while(1)
                          {
                          if(learn_mode) // Vào học lệnh
                          {
                          --- Kiểm tra sync
                          --- Lấy dữ liệu

                          switch(lenh) // để xem đang học lệnh nào thì lưu cái đó vào EEPROM;
                          {
                          case 1:
                          EEPROM_Write(......... lưu lệnh 1 )
                          break;
                          case 2:
                          EEPROM_Write(......... lưu lệnh 2 )
                          break;
                          case 3:
                          EEPROM_Write(......... lưu lệnh 3 )
                          break;
                          case 4:
                          EEPROM_Write(......... lưu lệnh 4 )
                          break;
                          }
                          }
                          else // Không phải học lệnh ( learn_mode = 0 )
                          {
                          --- Kiểm tra sync
                          --- Lấy dữ liệu
                          --- So sánh và tác động điều khiển (VD : bật tắt đèn ở RA1 )
                          }


                          }



                          }
                          Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                          Comment


                          • #43
                            Muốn thoát khỏi lệnh while ( trong lúc chuyển vào mode học lệnh thì bạn đặt điều kiện cho lệnh while là nó sẽ thoát ngay )
                            VD : while((!RX)&&(!learn_mode)); // với lệnh này nếu learn_mode =1 thì nó sẽ nhảy qua không kiểm tra cái while(!RX) nữa.

                            ---- Bạn viết thế này sẽ không bao giờ có kết quả chính xác cho giá trị xung .
                            while(rf_data_in) { if(button==0) break; } Giá trị xung lúc đó sẽ bị biến động liên tục, sai số do quá trình kiểm tra (if, break, ..các lệnh ở trong.) ngay kể cả khi chip làm việc thời gian này sẽ bị sai lệch do nhiệt độ, xử lý bị nghẽn, hay bị can thiệp bởi các yếu tố khác ( các ngắt hay timer khác )
                            Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                            Comment


                            • #44
                              cảm ơn a, em sẽ chỉnh sửa lại code xem thế nào! thật sự là em học C gà lắm, nhưng phải làm cái này nên ráng mò @@ làm hoài mà chẳng dc. nếu a biết rõ về cái truy xuất eeprom của avr bằng codevision thì chỉ e với, xem cách em làm như trên nó có chép dc vào eeprom ko a?

                              Comment


                              • #45
                                còn 1 vấn để nữa là nếu để lệnh đọc eeprom để trong while(1) nó sẽ đọc liên tục v có làm chết eeprom ko a?

                                Comment

                                Về tác giả

                                Collapse

                                angelhades Tìm hiểu thêm về angelhades

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X