Tôi có thể tạo số ngẫu nhiên trên PIC từ INTOSC so với pha lê không?


7

Tạo các số thực sự ngẫu nhiên trên một vi điều khiển là một nhiệm vụ khó khăn đã biết.

Một cách là chạy hai đồng hồ khác nhau và đo độ trôi của đồng hồ giữa chúng.

PIC16F1783 mà tôi đang sử dụng có hai đồng hồ. Một người sử dụng một tinh thể bên ngoài và LFINTOSC cung cấp năng lượng cho cơ quan giám sát.

Có cách nào để có được tại LFINTOSC, trong khi chạy từ đồng hồ pha lê bên ngoài không?

Một ý tưởng tôi có là để cho cơ quan giám sát hết hạn và kiểm tra giá trị của TMR2, nhưng nó không hoạt động vì TMR2 được đặt lại bởi bộ cơ quan giám sát.

Người ta có thể viết một bộ đếm cho EEPROM trong một vòng lặp chặt chẽ và để cho cơ quan giám sát hết hạn, sau đó kiểm tra nội dung của EEPROM, nhưng điều này có vẻ rất không phù hợp. Chỉnh sửa: Tốt hơn hết là ghi vào RAM, như được đề xuất trong một trong các ý kiến.

Có cách nào tốt hơn? Không sử dụng mạch ngoài và không phụ thuộc vào nhiễu ADC (có thể không phải lúc nào cũng có mặt)?

Bảng dữ liệu: http://ww1.microchip.com/doads/en/DeviceDoc/40001579E.pdf

Chỉnh sửa: Tôi muốn số ngẫu nhiên tạo GUID để có thể phân biệt nhiều thiết bị chia sẻ cùng một bus RS485. Ý tưởng của tôi là sử dụng một cái gì đó tương tự như khám phá thiết bị 1 dây. Nhưng để làm điều này, tôi cần phải có GUID khác nhau trên các thiết bị khác nhau và tôi muốn tránh những rắc rối khi phải lập trình chúng với ID duy nhất: s.


1
+1 không có câu trả lời nhưng câu hỏi hay. Một mục tiêu hữu ích nếu có thể đạt được. Một diode nhiễu có thể dễ dàng hơn mặc dù cần phần cứng và pin. .
Russell McMahon

1
Sử dụng "Mô-đun chỉ báo nhiệt độ" hiện có.
JonRB

1
Nhiệt độ tự nó không thực sự quan trọng; bạn quan tâm đến tiếng ồn được tạo ra trong quá trình vận hành ADC (bạn có thể sử dụng bất kỳ nguồn nào khác cho ADC, nhưng cảm biến nhiệt độ không cần phần cứng bên ngoài).
CL.

1
Tại sao bạn lại viết thư cho EEPROM, thay vì RAM?
Nick Johnson

1
Microchip không thể phá vỡ quy luật tự nhiên . Nhưng trong thực tế, bạn phải đo mức chênh lệch bạn nhận được khi nhiệt độ không đổi. (Và phá vỡ tất cả các khuyến nghị của Microchip về cách giảm tiếng ồn, nghĩa là sử dụng thời gian mẫu ngắn hơn.)
CL.

Câu trả lời:


4

Được rồi, tôi đã tìm ra cách để làm chính xác những gì tôi đã hỏi trong câu hỏi mà không liên quan đến WDT.

Đó là một chút hack, để nói rằng ít nhất, và hy sinh hai chân (EDIT: chỉ có một pin được hy sinh) (nhưng không yêu cầu các thành phần bên ngoài, vì vậy nếu bạn có hai chân không sử dụng, nó sẽ là "miễn phí").

Ý tưởng là sử dụng PSMC (Điều khiển chế độ chuyển đổi chế độ) của PIC16F1783.

Điều này có thể được xung nhịp từ INTOSC, bằng cách kết nối HFINTOSC với PLL 4x, mang lại tần số 64 MHz để theo dõi đầu ra của PWM.

Đầu ra PWM sau đó có thể được định tuyến đến một chân khác trên PCB.

Bây giờ, bằng cách sử dụng tinh thể bên ngoài để xung nhịp CPU, tín hiệu PWM có thể được đọc trong một vòng lặp chặt chẽ. Vì hai đồng hồ không được đồng bộ hóa, nên có jitter giữa hai đồng hồ và đầu vào PWM sẽ chứa một số jitter không thể đoán trước.

Trên đường sử dụng jitter này để xây dựng các giá trị ngẫu nhiên có thể có một mảng tổng kiểm tra 16 byte. TMR1 sau đó có thể được cấu hình để chạy nhanh nhất có thể và mỗi khi tín hiệu PWM thay đổi, giá trị TMR1 có thể được ghi vào đầu mảng. Sau đó, tổng MD5 của mảng có thể được lấy và ghi lại vào cùng một mảng.

Bằng cách lặp lại quy trình này vài nghìn lần, hàm băm MD5 16 byte có thể được xây dựng, điều này hoàn toàn ngẫu nhiên.

Tuy nhiên, thuật toán kiểm tra MD5 hầu như không phù hợp với PIC16F1783, do đó, thuật toán này được sử dụng nhiều hơn trên các chip mạnh hơn một chút. Mặc dù vậy, ý tưởng tương tự có thể được sử dụng, chỉ bằng cách tăng một byte theo giá trị TMR1 và để nó bao quanh vài nghìn lần trước khi xem xét nó "đủ ngẫu nhiên".

Cách duy nhất điều này có thể thất bại là nếu nguồn 500kHz bên trong bằng cách nào đó sẽ đồng bộ hóa với bộ dao động tinh thể. Tôi không biết nếu điều đó là có thể.

Cập nhật:

Các mã sau đây dường như hoạt động trong thực tế trong phòng thí nghiệm của tôi:

#define RAND_SIZE 255
unsigned char random_data[RAND_SIZE];
void make_random_data()
{
//Used output pin: RC3. Make sure it is unconnected!
PSMC1PRH=0x0; //choose a very short period period
PSMC1PRL=0x3;

PSMC1DCH=0x00; //set 50% duty
PSMC1DCL=0x2;

PSMC1PHH=0;
PSMC1PHL=0;

PSMC1CONbits.PSMC1EN=1;

PSMC1CLK=1; //64mhz    
PSMC1STR0bits.P1STRD=1;
PSMC1OENbits.P1OED=1;
PSMC1PRSbits.P1PRST=1;
PSMC1PHSbits.P1PHST=1;
PSMC1DCSbits.P1DCST=1;

// Zero the id, to make sure any previous value does not influence result.
for(int i=0;i<RAND_SIZE;++i)
    random_data[i]=0;

// Generate the new random id:
for(int pass=0;pass<1000;++pass)
{
    for(int j=0;j<RAND_SIZE;++j)
    {
        unsigned char bitmask=1;
        for(signed char bitnum=7;bitnum>=0;--bitnum)
        {
            if (PORTCbits.RC3)
                random_data[j] ^= bitmask;
            bitmask<<=1;
        }
    }
}
}

Cập nhật 2:

Chỉ có một chân được hy sinh, vì có thể đọc chân PWM đầu ra, bạn không cần định tuyến nó đến đầu vào và đọc nó.


1
Một số loại đồng hồ sẽ có xu hướng tự đồng bộ hóa với các đồng hồ khác, vì vậy mối quan tâm này có thể hợp lệ. Không phải tất cả các loại làm điều đó, vì vậy một chút nghiên cứu sẽ được theo thứ tự.
AaronD

Hừm. Có lẽ ý tưởng cảm biến tạm thời là tốt hơn trong thực tế sau đó.
avl_sweden

1
Tôi muốn thấy một số thử nghiệm ngẫu nhiên được áp dụng cho đầu ra (nhưng không đủ hứng thú để tự làm điều đó!). Đây có phải là một cái gì đó bạn có thể làm thuận tiện?
Scott Seidman

Tôi đã thử nghiệm cả phương pháp jitter đồng hồ và cảm biến nhiệt độ đồng hồ PSMC. Cả hai đều hoạt động và cả hai có thể tạo ra một số sê-ri 16 byte trong vài giây trên PIC16F1783.
avl_sweden

Dưới đây là một chuỗi ngẫu nhiên được tạo ra chỉ sử dụng cách tiếp cận đồng hồ jitter: 1a7b2fecfbb0447fcce418089ea1f56082367cd921a041155181455ac437a8557d2ff122429790b170846df01434ae3c31f9ccd499882b8e38ab30f0adf550abf9ac223cc7e4820bb1956b6960c51ceeb7a59edad202b09cdb1fbd228a0ee63a586368869acc527489fed9f67073aab1f7d2ccd8259bf5980d74802add17caacdcd6f82374bfaedd092b66bc702d4cf84de320b678f2a712685c334c79741cce2c7632a5771d887d32fb52667bc190cc5517a1b0104d28a4b4644662e4dd6ad5dcf7470883de22ea9a399bc0b94a7fc4a5a2233b26900b27fdb16bc15e14bbfdaace1d6ee0568bee186985ab914058128d8208e095e3adac7284f7cce36e69
avl_sweden
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.