/* PLL CONTROL FOR ITALTEL MB-45 02/11/2011 18.07.42 - by Davide Achilli IZ2UUF - iz2uuf@iz2uuf.net */ void setFrequency (double MHz, int dataPort, int clockPort, int enablePort); #define P_STROBE 10 #define P_CLOCK 9 #define P_DATA 8 #define P_TX_EN 7 #define P_POWER 6 #define P_PTT 5 #define P_LED 13 void setup () { Serial.begin(115200); // connect to the serial port // initialize the digital pin as an output. // Pin 13 has an LED connected on most Arduino boards: pinMode(P_LED, OUTPUT); // Pin are: // 8-data // 9-clock // 10-enable pinMode (P_STROBE, OUTPUT); pinMode (P_CLOCK , OUTPUT); pinMode (P_DATA , OUTPUT); pinMode (P_TX_EN , OUTPUT); pinMode (P_POWER , OUTPUT); pinMode (P_PTT , OUTPUT); Serial.println("Ready!"); //setFrequency (437.0125 - 21.4, P_DATA, P_CLOCK, P_STROBE); setFrequency (455.0125, P_DATA, P_CLOCK, P_STROBE); Serial.println("Ready to TX in 2s"); digitalWrite (P_TX_EN, HIGH); digitalWrite (P_PTT, HIGH); delay (2000); Serial.println("TX"); digitalWrite (P_LED, HIGH); digitalWrite (P_TX_EN, LOW); digitalWrite (P_PTT, LOW); digitalWrite (P_POWER, HIGH); delay (4000); digitalWrite (P_LED, LOW); digitalWrite (P_TX_EN, HIGH); digitalWrite (P_PTT, HIGH); Serial.println("DONE"); } #define DELAY_uS 100 void setFrequency (double MHz, int dataPort, int clockPort, int enablePort) { //unsigned long FK = (unsigned long)(MHz/0.0125); unsigned long FK = MHz * 80; unsigned long A = FK & 0x3F; unsigned long N = FK >> 6; // Sequence of 19 bits to be sent. Send MSB first // It goes (starting from MSB): // SW1 // SW2 // 10-bits N // 7-bits A unsigned long PLL; PLL = (N << 7) | A; unsigned long i; Serial.print("Freq "); Serial.print(MHz); Serial.print(" N="); Serial.print(N); Serial.print(" A="); Serial.print(A); Serial.print(" PLL="); Serial.print(PLL); Serial.print(" - "); digitalWrite(clockPort, LOW); digitalWrite(enablePort, HIGH); delayMicroseconds (DELAY_uS); digitalWrite(enablePort, LOW); digitalWrite(clockPort, LOW); delayMicroseconds (DELAY_uS); digitalWrite(enablePort, LOW); for (i=0; i<19; i++) { unsigned long sh = (((unsigned long)1) << (18-i)); int bt = !!(PLL & sh); //Serial.print("["); //Serial.print((unsigned)sh); //Serial.print("]"); Serial.print(bt ? "1" : "0"); } Serial.println (""); for (i=0; i<19; i++) { unsigned long sh = (((unsigned long)1) << (18-i)); int bt = !!(PLL & sh); delayMicroseconds (DELAY_uS); digitalWrite(dataPort, (bt ? HIGH : LOW)); delayMicroseconds (DELAY_uS); digitalWrite(clockPort, HIGH); delayMicroseconds (DELAY_uS); digitalWrite(clockPort, LOW); } delayMicroseconds (DELAY_uS); digitalWrite(enablePort, HIGH); delayMicroseconds (DELAY_uS); digitalWrite(enablePort, LOW); } void loop() { }