Height values has limitations in theory, but basically you can go very wild with it (I think, though never tested the limits.) It's all about how many grayscale levels you use and how you set your levels in relation with each other through smf height values. For 8-bit grayscale its 255 levels. However, spring map format supports 16-bit grayscale images so it means 65,535 levels. This is what you should always use. 8-bit heightmaps looks ugly and limits the height variations. Usually 8-bit maps end up being jagged.
Height values are always written and hardcoded in .smf but you can override them via .smd. It makes the whole process a lot easier as wolas said: you dont need to recompile just to change heightvalues.
If your problems with flatness still exist please post a screenshot from ingame, heightmap and height values (both).