Sử dụng Timer0 tràn vào cổng Timer1 trên PIC12F1822


7

Tôi đang cố gắng sử dụng TMR1để đếm TMR0tràn. Để làm điều này, tôi đang sử dụng TMR1với cổng được kích hoạt và sử dụng TMR0tràn làm nguồn cổng.

Sử dụng SIM MPLAB, tôi có thể thấy đó TMR0là đếm và tràn. Các TMROIFbit trong INTCONđang được đặt chính xác.

TMR1 đếm chính xác mà không có cổng được kích hoạt và dừng khi tôi bật điều khiển cổng - cho đến nay vẫn tốt.

Tuy nhiên, TMR0tràn ra dường như không kích hoạt cổng. Các T1GVALbit của T1GCONkhông bao giờ được thiết lập.

Tôi đang chạy TMR1ở Fosc và tôi có cổng chạy không ở chế độ chuyển đổi hoặc chế độ xung đơn ... TMR0đang chạy instruction clock / 256, mặc dù tôi cho rằng điều này không quan trọng ...

Đây là bit cấu hình của tôi:

__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF</code>
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF

và đây là những dòng có liên quan nơi tôi cấu hình TMR1

banksel T1CON
movlw   b'01000001' ; source = Fosc, prescale 1:1, LP osc - no, Timer on
movwf   T1CON

banksel T1GCON
movlw   b'11000001' ; gate enabled, active high, toggle no, pulse mode no, source TMR0
movwf   T1GCON

3
Bước lại và nghĩ về vấn đề thực sự. Bạn có thể đếm bộ đếm thời gian 0 tràn trong phần mềm, sau đó có thể sử dụng bất kỳ byte RAM nào mà nó muốn làm bộ đếm. Tôi không thấy một lý do mà bộ đếm thời gian 1 cần thực hiện đếm, đặc biệt là vì nó rất khó xử. Bạn đang để một ý tưởng thực hiện thúc đẩy thiết kế. Nó nên là cách khác xung quanh. Bạn đang thực sự cố gắng để đạt được điều gì?
Olin Lathrop

Touché, Olin;) Lời khuyên hiền và tôi đã làm điều này. Tôi vẫn muốn biết lý do tại sao nó không hoạt động theo cách tôi đang cố gắng ... Có lẽ tôi nên viết lại câu hỏi của mình ... Tính năng này để làm gì nếu không phải là một cái gì đó như thế này? Có vẻ như giải pháp thanh lịch hơn ...
tsiflana

Những gì được những gì đặc trưng cho?
Olin Lathrop

Khả năng sử dụng tràn Timer0 làm Cổng cho Timer1 ...
tsiflana

1
Việc sử dụng chỉ bị giới hạn bởi trí tưởng tượng của bạn. Tôi không biết tại sao các nhà thiết kế thêm nó, nhưng dù sao nó cũng không quan trọng vì nó ở đây. Điều đầu tiên tôi nghĩ đến là một ứng dụng đếm tần số. Bộ định thời 0 được sử dụng để mở cổng của bộ định thời 1 trong một thời gian đã biết. Tổng số tích lũy trên bộ định thời 1 trong thời gian đó tỷ lệ thuận với tần số.
Olin Lathrop

Câu trả lời:


8

Tôi nghĩ vấn đề của bạn dựa trên sự nhầm lẫn về chính xác những gì tín hiệu Cổng TMR1 thực sự làm. Bản thân nó không làm cho bộ đếm thời gian đếm, nó chỉ cho phép nó đếm nếu có những sự kiện phù hợp xảy ra trên đầu vào đồng hồ của nó.

Thật tinh tế, nhưng nếu bạn nhìn vào "HÌNH 21-1: DIAGRAM BLOCK TIMER1" trong biểu dữ liệu (trang 179), bạn sẽ thấy thanh ghi TMR1H / TMR1L ở giữa. Tất cả các logic ở trên có liên quan đến gating và tất cả các logic bên dưới có liên quan đến xung nhịp. Tất cả xuất hiện cùng nhau tại flip-flop ngay bên phải thanh ghi TMR1, nơi tín hiệu cổng điều khiển đầu vào EN (enable) của flip-flop đó và tín hiệu đồng hồ điều khiển đầu vào D (dữ liệu).

Điều này có nghĩa là đầu ra của flip-flop sẽ chuyển đổi (và khiến TMR1 tăng) chỉ khi tín hiệu cổng cao tín hiệu đồng hồ đang bật.

Đơn giản là không có cách nào để định tuyến các sự kiện tràn từ TMR0 đến logic xung nhịp của TMR1, bên trong hoặc bên ngoài chip.

EDIT: OK, đào sâu hơn một chút (được nhắc nhở bởi các bình luận bên dưới), tôi nhận thấy rằng bạn có bit T1SYNC trong thanh ghi T1CON được đặt thành không. Điều này khiến nguồn đồng hồ được đồng bộ hóa với Fosc. Nếu nguồn đồng hồ đó thực tế là chính Fosc, đầu ra của bộ đồng bộ hóa sẽ ở mức không đổi - luôn luôn cao hoặc luôn luôn thấp, nhưng không bật.

Tôi tin rằng đây là nguyên nhân gốc rễ của vấn đề của bạn. Hãy thử đặt T1CON thành b'01000101'. Điều này sẽ thực hiện những gì bạn muốn, giả sử rằng xung tràn từ TMR0 chính xác là một khoảng thời gian Fosc.


Phải, tôi thấy những gì bạn có ý nghĩa và nghĩ rằng nó là đúng! Tuy nhiên tôi sẽ chờ với tiền thưởng cho đến khi những người khác cũng có thể trả lời.

Tôi không thấy cách này trả lời câu hỏi. Logic cổng sẽ nhận được một xung có cùng thời lượng với một chu kỳ xung nhịp TMR1 (thông qua bộ đồng bộ hóa xung ngầm) khi TMR0 xuất hiện và logic đồng hồ nhận được xung nhịp. Nó sẽ được tính một lần tại mỗi lần tràn. Vì vậy, tại sao nó sẽ không hoạt động? Có lẽ trình giả lập chỉ thất bại ở nó (nó nổi tiếng là thiếu khi mô phỏng các thiết bị ngoại vi). OP không bao giờ nói ông đã thử nó trong phần cứng.
apalopohapa

@apalopohapa: Không, logic đồng hồ không có đồng hồ. Đó là mảnh còn thiếu ở đây.
Dave Tweed

Ok, hãy lùi lại một chút. Cốt lõi của TMR1 là một bộ đếm. Bộ đếm này luôn được tính miễn là nó có đồng hồ ... (tiếp tục bình luận tiếp theo)
apalopohapa

Đồng hồ này được cung cấp bởi một flip-flop. FF này có ba đầu vào: (1) Kích hoạt , (2) Dữ liệu và ĐÃ được đồng hồ hệ thống (3) (nếu không TMR1 hoàn toàn không hoạt động). Cho phép xuất phát từ logic cổng. D xuất phát từ logic đồng hồ. Xung tràn đi vào logic cổng và kết thúc tại đầu vào Bật . Một đồng hồ, FOSC, định tuyến thông qua các mux vào đầu vào D. Tôi thấy không có gì ngăn FOSC (hoặc bất kỳ nguồn đồng hồ có thể chọn nào khác) tiếp cận đầu vào D , do đó làm cho số lượng bộ đếm bất cứ khi nào Bật được xác nhận.
apalopohapa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.