Im looking at the wiring_analog.c file and I noticed that if val == 0 it outputs LOW as a digital signal and if val == 255 the output is digital HIGH. I see that if val is not 0 or 255, it goes to the timer. Usually we need to map the input signal to 0 and 255 because you get weird data if the input is less than or greater than 0 and 255.

Why not make set a limit in the wiring_analog.c file, instead of val == 0 (LOW) or val == 255 (HIGH), make it val <= 0 (LOW) and val >= 255 (HIGH).My reason I noticed that when I mapped my data, I still for some reason got out numbers greater and less than what I wanted to get.

Example, controlling two independent motors from one value ranging -255 and 255, negative number would represent reverse and likewise for positive.

But when the I did a print out of the Motor1 & 2, this is what I noticed. When Drive was less than 0, MotorFor was a negative number and when Drive was greater than 0, MotorRev was negative. Why is that?

So this was when I checked the analog Read/Write file.

In the end, I changed my code and used an IF/ELSE statement, but it's still weird to see that if a number is negative (and mapped that way), the results will be wrong. I was looking to get 0 when Drive was negative for DRVFor, but nope.

Im looking at the wiring_analog.c file and I noticed that if val == 0 it outputs LOW as a digital signal and if val == 255 the output is digital HIGH. I see that if val is not 0 or 255, it goes to the timer. Usually we need to map the input signal to 0 and 255 because you get weird data if the input is less than or greater than 0 and 255.

I believe this was the result of a patch several years ago to the original analogWrite function where if you did a analogWrite(pin#,0); instead of a pure 0% duty cycle you actually got a duty cycle that had one timer bit time of HIGH. This could easily be seen with a scope on the output pin, so they decided to just patch the function to digitalWrite a hard LOW if a 0 duty cycle value was sent to the function. Not sure why the clamp for the 100% value also but I'm sure it's related to the hardware timer behaviour.

Exactly. analogWrite() doesn't return a value, it is a void function,so there is no telling what you get for the assignment.

In the larger picture I do think that analogWrite() should check for >= HIGHinstead of == 255 to provide a "known behavior" for values outside the real range.This may start to be an issue as people use hard coded numbers like 255, 1023, etcor even mapping functions that return values outside the usable range on thedifferent "..duino" boards and the code starts to be used on different processorssince they all may not have the same range.

For this specific case, wouldn't it be easier to use absolute value: abs() instead of map() sincethere is no real need for mapping?