Thông báo

Collapse
No announcement yet.

Phát, giải mã DTMF và Call Progress không cần MT88xx

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

  • Phát, giải mã DTMF và Call Progress không cần MT88xx

    Phát, giải mã DTMF và Call Progress không cần MT88xx

    1. Phát DTMF không cần MT8888: dùng chế độ PWM phát ra 1 chân OCx, làm theo App Note AVR314: DTMF Genarator.

    2. Giải mã DTMF và Call Progress: làm theo App Note AT3344: AVR Phone Recorder & Telephony Platform.

    Làm được 2 mục trên sẽ tiết kiệm được 7 pin trên AVR so với dùng MT8888.

    Mục 1 mình đã làm xong, trong tài liệu tương đối dễ hiểu (Chỉ tốn 1 Timer). Các bác chú ý bảng tính toán giá bảng trị sin trong AppNote chưa chính xác -> Khi phát sẽ sai một vài số. Dùng Excel tính lại công thức sẽ phát ra DTMF chính xác.

    Mục 2 làm theo mà chưa được. Không biết có bác nào làm được chưa?

    Theo tài liệu, việc giải mã dựa vào giải thuật Goertzel để phát hiện ra 1 tần số trong tín hiệu.
    Về giải thuật Goertzel, mình thử đọc qua nhưng để hiểu được là điệp vụ bất khả thi. Không tin các bác thử xem, sẽ choáng ngay.

    AVR nhận tín hiệu audio vào qua chân ADC0, tần số lấy mẫu tín hiệu 8Khz (125us).
    ADC được kích hoạt tự động dựa vào ngắt của 1 timer -> thiết lập ở tần số 8Khz.
    Giá trị ADC được gán vào biến sample16.

    Tín hiệu được phân tích trên một block N mẫu. N lấy bằng 206 -> để giải mã tín hiệu phải có thời gian ít nhất = 125us x 206 ~ 25.75ms.

    Các giá trị tần số của DTMF và Call Progress (CP) được tính toán trước để ra một hệ số dùng trong giải thuật Goertzel.

    Vì làm theo không thành công nên mình xem lại giải thuật xử lý kèm theo, hoặc là mình không hiểu hoặc là giải thuật tác giả đưa ra chưa đúng !!?

    Mình thử phiên lại quá trình xử lý mẫu thành vòng lặp từ ngắt
    Code:
    while (1) {
       nn=0; // -> index của bảng tần số DTMF và CP cần giải mã
       gcount=0; -> đếm số mẫu
       while (gcount<N_sample) {
          for (cc=0; cc<10; cc++) {
             lấy mẫu tín hiệu ADC -> giá trị biến sample16;
             tính toán, xử lý các hệ số;
             if (nn<MAX_ITEM) {
                xử lý, tính toán;
                nếu phát hiện có tín hiệu -> biến tích lũy;
             } else if (nn=MAX_ITEM) {
                lấy ra kết quả từ biến tích lũy;
             } 
             gcount++;
          }
          nn++;
       } //end while
    } //end while (1)
    MAX_ITEM ở đây = 9 tần số DTMF và CP cần xét.
    Theo đoạn code trên, cứ 10 mẫu -> nn++ -> tăng chỉ mục tần số cần xét lên.
    -> sau khi xét hết 9 tần số tương ứng với 90 mẫu (nn chạy từ 0 đến 8) -> nn tiếp tục tăng.
    nn = MAX_ITEM = 9 -> lấy ra kết quả nếu có.

    Sau 100 mẫu nn tiếp tục tăng với giá trị nn > MAX_ITEM (nn=10), không thấy xử lý tiếp.
    Từ mẫu 101 đến mẫu 206 -> chương trình không làm gì ??

    Vậy là code có vấn đề hay mình có vấn đề ??
    Các bác nào làm rồi thì giúp với nhé. Bác nào chưa làm có thời gian rỗi thì ngâm cứu thử.
    Rất mong các bác quan tâm.

    http://www.circuitcellar.com/avr2006/winners/AT3344.htm
    AT3344: AVR Phone Recorder & Telephony Platform
    Attached Files
    Last edited by tintintin; 02-05-2008, 23:37.

  • #2
    Em đọc qua cái appnote AVR314 thấy ý đồ của tác giả cũng không phải là quá khó hiểu. Dùng PWM để tạo ta một điện áp trung bình tại một thời điểm t bằng với điện áp tức thời của hình sin cũng tại điểm t đó. Sau đó qua một mạch lọc để lấy điện áp sin.

    Tuy nhiên em vẫn đang không hiểu sao bác tintintin lại phải cố dùng một con AVR để làm việc này khi đã có IC chuyên dụng rồi. Cho dù ta giải quyết được việc đọc và giải mã DTMF thì con MCU của ta cũng đã hết khả năng xử lý công việc khác. Để thời gian đó nghiên cứu việc khác em nghĩ tốt hơn nhỉ?
    Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
    Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

    Comment


    • #3
      Nguyên văn bởi nghaiha Xem bài viết
      Em đọc qua cái appnote AVR314 thấy ý đồ của tác giả cũng không phải là quá khó hiểu. Dùng PWM để tạo ta một điện áp trung bình tại một thời điểm t bằng với điện áp tức thời của hình sin cũng tại điểm t đó. Sau đó qua một mạch lọc để lấy điện áp sin.

      Tuy nhiên em vẫn đang không hiểu sao bác tintintin lại phải cố dùng một con AVR để làm việc này khi đã có IC chuyên dụng rồi. Cho dù ta giải quyết được việc đọc và giải mã DTMF thì con MCU của ta cũng đã hết khả năng xử lý công việc khác. Để thời gian đó nghiên cứu việc khác em nghĩ tốt hơn nhỉ?
      Phần phát DTMF (AVR314) chỉ tốn 1 timer (mà timer thì dư, không xài phí), đầu ra cũng không cần bộ lọc RC (đã test với kết quả rất OK). Phần này mình đã giải quyết sau khi đọc AppNote.

      Phần giải mã DTMF tốn nhiều time hơn để MCU xử lý nhưng cũng không nhiều lắm, đủ dư để làm các chuyện khác. Phần này làm chưa thành công, đang ngân cứu.

      Đành rằng đã có IC chuyên dụng rồi nhưng cơ bản là mình muốn mạch nhỏ gọn (bỏ đi IC 20pin và các R, C) và tiết kiệm port MCU cho mục đích khác.

      Mỗi hướng đi đều có một ý hay, bình thường mình chọn hướng sử dụng IC chuyên dụng. Nhưng vì cần port MCU cho chuyện khác nên mới rỗi hơi như vậy. Cám ơn bác nhé!

      Comment


      • #4
        Nguyên văn bởi tintintin Xem bài viết
        Phần phát DTMF (AVR314) chỉ tốn 1 timer (mà timer thì dư, không xài phí), đầu ra cũng không cần bộ lọc RC (đã test với kết quả rất OK). Phần này mình đã giải quyết sau khi đọc AppNote.

        Phần giải mã DTMF tốn nhiều time hơn để MCU xử lý nhưng cũng không nhiều lắm, đủ dư để làm các chuyện khác. Phần này làm chưa thành công, đang ngân cứu.

        Đành rằng đã có IC chuyên dụng rồi nhưng cơ bản là mình muốn mạch nhỏ gọn (bỏ đi IC 20pin và các R, C) và tiết kiệm port MCU cho mục đích khác.

        Mỗi hướng đi đều có một ý hay, bình thường mình chọn hướng sử dụng IC chuyên dụng. Nhưng vì cần port MCU cho chuyện khác nên mới rỗi hơi như vậy. Cám ơn bác nhé!
        mình cũng đang ngâm cứu cái này, nhưng chưa làm thành công. không biết tại sai cái gì nữa. bác có thể post cái code để mình ngâm cứu với không? bác nói không sai, tạo DTMF bằng IC chuyên dụng thì có thể làm được rồi, nhưng để chúng ta học tập và với một số ứng dụng thì cần phải tiết kiệm chân của VDK. đó là một ý tưởng rất hay, cái AppNote AVR314 mình đã đọc khá kỹ nhưng làm chưa được, chắc có lẽ tay nghề của mình chưa cao?????.
        hãy cố gắng dù vướn phải thất bại!!!!!!!!

        Comment


        • #5
          Nguyên văn bởi chipmickey Xem bài viết
          mình cũng đang ngâm cứu cái này, nhưng chưa làm thành công. không biết tại sai cái gì nữa. bác có thể post cái code để mình ngâm cứu với không? bác nói không sai, tạo DTMF bằng IC chuyên dụng thì có thể làm được rồi, nhưng để chúng ta học tập và với một số ứng dụng thì cần phải tiết kiệm chân của VDK. đó là một ý tưởng rất hay, cái AppNote AVR314 mình đã đọc khá kỹ nhưng làm chưa được, chắc có lẽ tay nghề của mình chưa cao?????.
          Mình chỉ làm theo AppNote thôi, bác load cái file avr_dtmf.h về, include vào main.c -> khởi tạo Timer0 (Timer khác tùy bạn).

          Đoạn code bên dưới để phát DTMF đi. Hàm delay dùng Timer nhé.

          Code:
          void Gen_DTMF(uint8_t dtmfCode, uint16_t dtmfDura, uint16_t dtmfPause)
          {
          	i_CurSinValA = 0;
          	i_CurSinValB = 0;
          	x_SWa = pgm_read_byte(dtmfFreqH + dtmfCode);
          	x_SWb = pgm_read_byte(dtmfFreqL + dtmfCode);
          
          	cli();
          	TCCR0 = (1<<WGM00)|(1<<COM01)|(1<<CS00);	// Timer/Couter0 8 Bit PWM, non inverting, no prescale / 
          	sei();
          
          	delay_ms(dtmfDura);
          
          	cli();
          	TCCR0 = 0;						// Stop timer
          	sei();
          
          	delay_ms(dtmfPause);
          }
          Attached Files

          Comment


          • #6
            ai có sơ đồ mạch giải ma dtmf ko?

            Comment

            Về tác giả

            Collapse

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

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

            Collapse

            Đang tải...
            X