You'll get better visualization results if you use TVSCL or bytescale your data prior to calling TV. Here are brief examples of each, using the variable "data" as a placeholder for your actual MODIS data:
==========
;Figure out min and max values in your data array
min_value = min(data)
max_value = max(data)
;Display data using TV
tv, bytscl(data, min=min_value, max=max_value)
;Display your data using TVSCL
tvscl, data
==========
Most MODIS data sets have some sort of background "fill" value that has nothing to do with the actual data in the file. For 16-bit integer data, it's usually -32767, so that would get flagged as your minimum value and could drastically affect how the data are displayed. BYTSCL would definitely have issues with it. In that case, if you use the first example (tv, bytscl) and set your minimum value to 0, you might get better results. The only way to be sure is to use the MIN function to find out what your minimum value is.
Also, MODIS data products are generally stored in integer to save disk space, but the scientifically meaningful values associated with your particular product might actually be in floating point. You can obtain these values by multiplying your integer data array by a "scale" factor and then adding an "offset" factor, if necessary. These factors are generally available on product description pages set up by LPDAAC and other data providers like this one:
http://edcdaac.usgs.gov/modis/mod11a1v4.asp