Traditionally, we take the next highest priority story cards from our backlog / release plan (with high level "story point" estimates"), break them down into tasks, have people estimate them, and write these down on a sheet of paper. Whatever pair is next available can pick which task they would like. This usually doesn't take too long (one week iterations).
Recently I've been transitioning my team towards a Kanban system, where the emphasis is on flow instead iterations. High level estimates are still important for release planning, but otherwise we just ensure that the stories are prioritized properly. People pull stories from state to state, and any roadblocks are brought up either at the morning standup or throughout the day (if it is something that would prevent work).
If you're working on a project that lends itself well to somewhat continuous deployment (examples would include a website or auto-updating end user software, as opposed to something that has an arduous install process), you could consider not doing too much estimating. It may still be necessary for some ROI things (i.e. will the work spent on this outweigh the benefit?), but by eliminating the estimates and releasing things when they are ready you can get into more of a flow. This actually gets away from iterations, but it means more time is spent on getting work done in a continuous process than planning, subdividing tasks, etc. A kanban system would be useful for this. This is the technique we currently use for our maintenance / FastTrack releases - when we've finished enough bug fixes / enhancements, we ship. Small releases are valued much higher than large releases.