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

            • tuyennhan
              Trả lời cho Tiếng Anh cho người Việt
              bởi tuyennhan
              Cái thư sai ngay câu chào Dear sir mới đúng Hi chỉ dùng cho người quen , các vấn đề về kỹ thuật nó không trả lời hoặc nói loanh quanh tránh ảnh hưởng đến công ty .
              Giup1 người cần không giúp người không cần với lại văn mình vợ người nha đừng quên .
              hôm nay, 07:44
            • vi van pham
              Trả lời cho Tiếng Anh cho người Việt
              bởi vi van pham
              Cám ơn những lời chúc tốt đẹp của em.

              Việc em làm giống như chê sếp dốt, chẳng những không có miếng xôi nào để ăn mà còn chịu nhiều trù dập lên bờ , xuống ruộng.

              Hãy tránh vết xe đổ của tui đi. Dành thời gian lo cho gia đình....
              hôm nay, 02:00
            • nhathung1101
              Trả lời cho Tiếng Anh cho người Việt
              bởi nhathung1101
              Ngoại ngữ là không thể thiếu, nhất là làm việc với công nghệ.

              Nhưng học để tán gái hay để đọc datasheet, manual là chuyện cần quan tâm.

              Và đọc ở nguồn nào đáng tin cậy, chứ cứ lên tictok hay facebook học lỏm thì...
              Hôm qua, 22:18
            • dinhthuong80
              Trả lời cho Tiếng Anh cho người Việt
              bởi dinhthuong80
              Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.

              Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...
              Hôm qua, 14:51
            • dinhthuong80
              Trả lời cho Tiếng Anh cho người Việt
              bởi dinhthuong80
              Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.

              Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...
              Hôm qua, 14:39
            • dinhthuong80
              Trả lời cho Tiếng Anh cho người Việt
              bởi dinhthuong80
              Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.

              Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...
              Hôm qua, 14:28
            • bqviet
              Trả lời cho Tiếng Anh cho người Việt
              bởi bqviet
              Đúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
              21-02-2025, 20:26
            • mèomướp
              Trả lời cho Tiếng Anh cho người Việt
              bởi mèomướp
              Dạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
              21-02-2025, 12:32
            • vi van pham
              Trả lời cho Tiếng Anh cho người Việt
              bởi vi van pham
              Những lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).

              Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...
              20-02-2025, 21:31
            • bqviet
              Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
              bởi bqviet
              Thiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.
              20-02-2025, 17:22
            Đang tải...
            X