Keyboard Shortcuts
ctrl + shift + ? :
Show all keyboard shortcuts
ctrl + g :
Navigate to a group
ctrl + shift + f :
Find
ctrl + / :
Quick actions
esc to dismiss
Likes
- BITX20
- Messages
Search
uBitx and CW
I'm a cw guy, so that's my main use for the uBitx. ?As I noted on here before, I find the bandpass too wide to be useable on cw - noise overwhelms the signals. ?Until we get a better fix, I've installed a Hi-Per-Mite SCAF (the same design used in the QCX) in the audio output line and it's HUGELY helpful. ?The rig is now quite competent on cw. ?This also isolates the TDA audio chip from the headphone jack, thus perhaps reducing chances of blowing the chip.
I'm using the KD8CEC firmware, which is great. ?The cw speeds are so close together, however, that after selecting one and trying to confirm it by pushing the encoder, the speed often changes. ?To solve that, I've wired a button parallel to the encoder push switch. ?In fact, I've used a spring-loaded SPDT switch; one side is for the encoder, and the other is PTT for when that is needed to set something in the menu. ?That has made confirming menu settings much easier, especially since I no longer have to hold onto the rig to keep it from moving when pushing the encoder. I've installed the 470uf cap to reduce audio pop, though it increases the TX to RX delay and I may try a smaller one. ?It does reduce the pop on that transition. Also, I've replaced R250 with a pot to control the sidetone volume, at least until I get it where I want it. ?I may replace it with a fixed resistor at that point. Hope this is helpful to somebody. Howard K4LXY |
Re: Pulling Arduino data apart
You definitely need to be endian-aware when coding in assembly language.
toggle quoted message
Show quoted text
But I can code all day in C without worrying about big vs little endian. If you have a 32 bit integer and want to send the 8 msb's over a serial link, do something like this: ? ? sendbyte(data32>>24); I'm assuming sendbyte() accepts an 8 bit argument, so no need to explicitly strip off unused bits. This might make it more obvious: ? ? sendbyte((data32>>24)&0xff); That code is bulletproof in C, should work the same on a PDP-8 with 12 bit hardware? as it does on the the latest stuff from Intel.? Unions will undoubtedly get packed differently on a PDP-8, in case anybody still cares these days.? C does not specify that unions get packed in any particular manner, that's true even on an 8/16/32/64 bit machine. Unions almost always work, might be a good idea on a minimalist machine like the ATMega328P. Shifting a 32 bit integer is relatively painful with an instruction set that can only shift an 8 bit word left or right by one bit at a time.? However, while it might take 100 clock ticks to execute, the code to shift a 32 bit word is instantiated only once as a function call, and 100 ticks happens much faster than sending a single byte out through the I2C interface.? (100 ticks is a wild guess.) If 100 ticks is too painful, then it's time to sack the Nano and move on to the $2 STM32 Blue Pill. Take a look at the si5351 routines in Allard's code and on the uBitx. Totally endian agnostic. I'm looking forward to trying them out on a PDP-8 someday. Jerry, KE7ER On Thu, Mar 8, 2018 at 07:51 am, Jack Purdum wrote: .....? If you are bit shifting or masking, you need to know the "Endian" order for the bytes. On an Arduino, you are given two functions: lowByte() and highByte() to allow you to extract the order to determine how the data are organized in an int. Knowing the byte order can be important, such as transferring binary data from one place to another over a serial link. But what if you are working with a long data type? The lowByte() and highByte() functions don't work since a long is 4 bytes. The solution is to use a C structure called a union. Think of the union as a buffer; a small chunk of memory. I think of it as a bucket, the size of which is determined by the biggest piece of data that will be stored in the union. For example: ..... |
Re: TDA2822 Replacement
The issue has been handled by admin. If it persists, more drastic action can/will be taken. ? Can we please let this go and get back on-topic. Thanks Arv K7HKL _._ On Wed, Mar 7, 2018 at 7:42 PM, Larry Smith <815cpu@...> wrote:
|
Re: Volume Control
Audio taper is logarithmic. Human (and I'd presume most other) ears respond logarithmically to acoustic (sound level) variations - it's how we can detect faint sounds and tolerate loud ones. Use a 'log' pot - pretty much all audio control is such. Part of Alexander Graham Bell's (he of telephone fame) experiments discerned this in converting sound to voltage/current. It's why we measure in (deci)bels - 10 x log (Power1/power2). 73 de ZL2DEX |
First complete contact
Hello all
Have had the first confirmed contacts with the BITX40. !!! I confirmed contact on norcars net this morning. With Sebring Fl, Michigan and maybe MD. The Florida station was about 1100 miles away.? I am using the stock microphone on a wand and am using an inverted V 40m dipole. I am operating my radio off of a 12v 1300mah Lipo. i should be able to go to 24v on the finals.? Dave KE0PVO |
uBITX Firmware CEC Version Added WSPR function, I am looking for a beta tester.
#ubitx
All
uBITX Firmware CEC Version Added WSPR function, but?It is still a test level. so, I am looking for a beta tester who has uBITX and knows how to use WSPR. I used the following method to put the WSPR function in the small space of uBITX. ?- All settings required for WSPR transmission are pre-entered in uBITX. ?- Callsign, location(2alpha, 2 number), db and frequency information to be used for transmission are stored in uBITX. ?- Outdoors, uBITX and antenna are all you need to transmit WSPR with pre-entered information. you do not need to make any modifications to your uBITX to use WSPR. For more information, click on the link below.
(You can download uBITX Manager as firmware for WSPR.
Firmware is based on Cat Support uBITX Firmware CEC Version 1.04.)
-- Best 73 KD8CEC / Ph.D ian lee kd8cec@... (my blog) |
Re: GPS and BITX
WSPR does not require GPS. However: 1) WSPR requires precise frequency, the transmission must be within the 200Hz WSPR sub-band. 2) WSPR requires precise timing: transmissions start on the 2nd second of even minutes, +/- a few seconds. An ordinary crystal or worse still, the ceramic resonator on some Arduinos, will not provide sufficient timing accuracy to run WSPR for long. A GPS is a very convenient and easy way to achieve both of these objectives. On the Ultimate3S kit the latitude and longitude are also converted to Maidenhead Locator which is encoded live, into each WSPR transmission. Something that is necessary if you want to use WSPR for tracking something (ship, balloon) for example the Canadian C3 expedition Speaking of which: Jim N2NXZ's U3S-22 balloon (running modified Ultimate3S firmware) reached Kazakhstan today. For the second time! It's already been flying for 23 days, at a little over 9,000m altitude, and completed one world circumnavigation! See for details and live tracking (using WSPR) during daytime. Big congratulations to Jim! 73 Hans G0UPL? ? |
Pulling Arduino data apart
Jack Purdum
I've been going through some of the BITX/?BITX code and see a number of places where bit shifting and/or masking is being done to get rid of "unwanted" bits of data. Doing this means you have solved the "Endian" problem for the microcontroller being used. For example, on some processors, the number 5 stored as an int data type appears in memory as: 00000000 00000101. On other processors, it is stored as: 00000101 00000000. If you are bit shifting or masking, you need to know the "Endian" order for the bytes. On an Arduino, you are given two functions: lowByte() and highByte() to allow you to extract the order to determine how the data are organized in an int. Knowing the byte order can be important, such as transferring binary data from one place to another over a serial link. But what if you are working with a long data type? The lowByte() and highByte() functions don't work since a long is 4 bytes. The solution is to use a C structure called a union. Think of the union as a buffer; a small chunk of memory. I think of it as a bucket, the size of which is determined by the biggest piece of data that will be stored in the union. For example:
union { ? byte array[4]; ? byte b; ? char c; ? int i; ? long L; ? float f; } myUnion; The long and the float data types are the biggest in the union, so the C compiler will allocate 4 bytes to the union named myUnion. It's a 4-byte bucket. If you want to, you can pour those four bytes into another long variable, or a float variable, or you could use a 1-byte dipper and spoon the 4 bytes into a 4-byte array. Your choice. Suppose, for some reason, the long in the union (i.e., the union member named L) needs to hold an RGB value for a color display. Further suppose you need to know the byte that isn't used as a color value. The following short program will show you how a union works. Note how I can fill the union with any data type, but extract it as a byte array. This makes it easy to observe the byte-order of the data. unions are a great C structure to understand as it gives you a portable way to determine the byte order of the data for a given processor. union { ? byte array[4]; ? byte b; ? char c; ? int i; ? long L; ? float f; } myUnion;????? // Define a union void setup() { ? byte b = 255;????? // create a list of variables... ? char c = 'A'; ? int i = 5; ? long L = 10000000L; ? float f = 3.14; ? Serial.begin(9600); ? Serial.print("low byte = ");????????? // the non-portable way to see the byte order of? variable i ? Serial.print(lowByte(i)); ? Serial.print("?? high byte = "); ? Serial.println(highByte(i)); ? myUnion.i = i;????????????????????????????? // Stuff the int into the union, then look at it ? Serial.print("Union:? low byte = "); ? Serial.print(myUnion.array[0]); ? Serial.print("?? high byte = "); ? Serial.println(myUnion.array[1]); ? myUnion.b = b;??????????????????????? // same for a byte, in DEC and HEX ? Serial.print("Union: byte = "); ? Serial.println(myUnion.array[0]); ? Serial.print("? byte (hex) = "); ? Serial.println(myUnion.array[0], HEX); ? myUnion.L = L;?????????????????????????? // same for a long ? Serial.print("Union: long[0] = "); ? Serial.print(myUnion.array[0]); ? Serial.print("??? long[1] = "); ? Serial.print(myUnion.array[1]); ? Serial.print("??? long[2] = "); ? Serial.print(myUnion.array[2]); ? Serial.print("? long[3] = "); ? Serial.println(myUnion.array[3]); ???????????????????????????????????????????????????????? // Do some others on your own... } void loop() { } |
Re: Cases
Vince Vielhaber
Dunno about your aluminum tape, but copper tape is easy to solder to.
toggle quoted message
Show quoted text
Vince. On 03/08/2018 09:54 AM, W9ZIM wrote:
Nice looking case, Carl. I like the idea of lining the interior with --
Michigan VHF Corp. |
Re: GPS and BITX
Hi Qonita,
I agree with Chris, you do not have to transmit GPS coordinates. WSPR is a protocol for testing propagation, antennas and so on. Using this digital mode you transmit your Callsign, first 4 chars of your locator and power in dBm. Receiving stations report transmitter they are able to heard. GPS usage could be to transform coordinate in Locator so you can made a beacon always transitting right locator and runtime updated. WSJTX is a program written by John Taylor (WSPR creator and Physics Nobel Prize) for operating WSPR, JT65, FT8 etc. digital modes? Hope this helps, Alessandro M. IU1ETR |
Re: KB1OIQ BITX40 / uBITX files now on Sourceforge
WOW!.? I'm excited at all the work different people are doing.? This makes the Bitx40 and uBitx even more exciting.? Now if I can just retire and get to work on all this stuff I'd have a blast. lol?? Thanks to you and all the others that are coming up with some amazing ideas and Farhan.?
73, Michael KM4OLT |
Re: Raduino oscilators. 33mhz and 57mhz " . Documentation says one thing, but this is what I measured.
Jack Purdum
Just to make sure, if you retype the code fragment: ? ? if (prev_freq <= 10000000l && frequency > 10000000l)
? ? ? isUSB = true;
? ? if (prev_freq > 10000000l && frequency <= 10000000l)
? ? ? isUSB = false; note that the last character in the numeric constants is an 'el' not a one. You can make this more obvious by using a capital 'L' for the data type specifier: ? ? if (prev_freq <= 10000000L && frequency > 10000000L) ? ? ? isUSB = true;
? ? if (prev_freq > 10000000L && frequency <= 10000000L) ? ? ? isUSB = false; Jack, W8TEE From: Michael Shreeve <shreevester@...> To: [email protected] Sent: Thursday, March 8, 2018 12:59 AM Subject: Re: [BITX20] Raduino oscilators. 33mhz and 57mhz " . Documentation says one thing, but this is what I measured. 24.99800 MHz clock On Wed, Mar 7, 2018 at 8:34 PM, Michael Shreeve <shreevester@...> wrote:
-- Michael Shreeve N6GRG |
to navigate to use esc to dismiss