Probably because your program needs environment variables that cron does not have set. You need to wrap your job in a script that sets and exports whatever variables it needs- likely TERM and PATH at least.
Using "at" works because at grabs all your current environment settings and uses them when it runs the job. See Cron is not working for a more complete discussion.
Some systems are replacing cron (and init and everything else that is part of historical Unix). You may also want to read Ding, dong, the Cron is dead for Mac OS X.
If you found something useful today, please consider a small donation.
Got something to add? Send me email.