[time-nuts] TruePosition and Arduino Progress
jimlux
jimlux at earthlink.net
Sun May 21 23:16:26 UTC 2017
On 5/21/17 11:20 AM, Chris Albertson wrote:
> The problem is that you get the ENTIRE string then parse it. This is
> not going to work well as you found out. Your CPU spends almost the
> entire time waiting for characters to come in slowly off the serial
> line. You are just waiting on bits and wasting CPU cycles
On many Arduinos these days, the "getSerialString()" is a
buffered/interrupt driven routine under the hood - it's not burning many
cycles.
That said, even if your serial port code was "spin on a bit", you can do
a lot of parsing/processing pretty quickly. Arduinos aren't 4 MHz Z80s
or 8051s. The modern crop have 50 MHz clocks and a millisecond is a lot
of instructions.
>
> What you need to do is parse one character at a time. I bet your
> parser reads one character at a time from the string. Have it read
> one character at a time directly from the serial port. (Use a state
> machine. It will work for such a simple job as this)
>
> Yes if your CPU was MUCH faster your plan could work. But on some
> GPSes the data never has a break. You are trying to do ALL the work
> in the break but actually most of the down time when you should be
> working is between the characters. There is not a lot of work a
> finite state machine needs to do between characters, just move state
> based on a 'character class" table.
I think that would be overkill, it's a lot harder to write a state
machine than a simple "is the first N characters $GPPGA?" kind of thing.
You'd want to write a generalized parser first if only to make sure that
you're decoding the strings properly. You'd run your arduino code with
a "getSerialString()" then a "Serial.print(str)" in a loop, then cut and
paste from the console display into a file, then run your decoder
against it.
I you ever studied this
> formally, what you are building here is a "lexer" not a parcer. The
> "Language" is not recursive and you never need to backtrack so it can
> be de-coded literally one character at a time.
>
> You DO really want the 1PPS to drive an interrupt. Thisway you just
> continue working on the data stream and don't wait for the PPS. When
> the PPS happens you do something QUICK. never do anything time
> consuming in the ISR or you will miss the next serial character.
> increment a seconds count and write two bytes the the LCD and exit
Thats what the Arduino "AttachInterrupt()" is for
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
where mode is probably going to be "RISING".
Nothing fancy in the ISR, just a "1ppsdetected++;" or something.
then in the void loop(), you do a test on 1ppsdetected
if (1ppsdetected>0){
1ppsdetected = 0;
update_display();
}
>
> On Sun, May 21, 2017 at 6:45 AM, Ben Hall <kd5byb at gmail.com> wrote:
>> Good morning all,
>>
>> A quick update for those interested on my Arduino code development for the
>> TruePosition boards. I've got Arduino code together than can read in the
>> serial stream, parse it, and display time, date, number of satellites, and
>> TFOM on a 2x16 LCD display. It does not do multiple screens, handle survey,
>> or display lat/long yet.
>>
>> What I'm having issues with is handling the 1 PPS. Ideally, I want to use
>> the 1PPS signal to trigger the display update. IE:
>>
>> void loop()
>> {
>> getSerialString() // uses serial.available to pull in the serial data
>>
>> parser() // this parses the data
>>
>> wait for 1PPS tick to go high
>>
>> if there has been a clock message, updateDispay() // update the display
>> }
>>
>> This works great when there is a just a clock message. But when there is a
>> clock message, an extstatus message, and a status message, it seems like it
>> is still parsing when the 1PPS tick comes in...so it will display seconds as
>> follows: 30, 31, 33, 34, 35, 36, 37, 39, etc...
>>
>> (If I don't wait for the 1PPS tick, it seems that my clock is one second
>> fast. I say "seems" to be fast, as the time agrees with an NTP clock on one
>> computer, but seems a half second slow per GPSCon's time display on the
>> Z3801. I think I need to put up the antenna and check against WWV.)
>>
>> I've got one of those cheap little USB logic analyzers on order to figure
>> out how much time elapses between the clock, extstatus, status, and 1PPS
>> tick. I may need something faster than an Arduino Uno to do this.
>>
>> I'm sure there is a way to do this with an interrupt...but I couldn't make
>> that work yesterday. More to follow.
>>
>> thanks much and 73,
>> ben, kd5byb
>> _______________________________________________
>> time-nuts mailing list -- time-nuts at febo.com
>> To unsubscribe, go to
>> https://www.febo.com/cgi-bin/mailman/listinfo/time-nuts
>> and follow the instructions there.
>
>
>
More information about the Time-nuts_lists.febo.com
mailing list