~아서/어서/여서 and ~기 때문에 both state a reason. The slight difference is in their nuance and their form in the past tense.
* -아서/어서 connects the subordinate and main clause rather tightly. Because of this, the verb in this phrase never takes the past tense form. Also, it is not as explicit about the reason as -기 때문에, somewhat like "so (adjective) that (clause)" in English.
* -기 때문에 gives a logical reason explicitly, like "because". It doesn't connect the reason and its effect as tightly as -아서/어서, so the subordinate clause can be in the past tense.
Examples:
- 책을 많이 읽어서 눈이 아픕니다 = 책을 많이 읽기 [or 읽었기] 때문에 눈이 아픕니다.
- 밥을 안 먹었기 때문에 힘이 없습니다 = 밥을 안 먹어서 힘이 없습니다. (먹었어서 doesn't exist)
- 비가 많이 와서 강물이 불었다 = 비가 많이 왔기 때문에 강물이 불었다.
(The past tense here is actually more like present perfect as they indicate a result of the action)
In simple cause-and-effect sentences like the above, -아서/어서 is often shorter and more natural than -기 때문에.
Aside from the above verb-based usage, 때문에 can be used with a noun or noun phrase.
- 네가 한 말 때문에 그 사람은 상처 받았다 = He was emotionally hurt because of what you said.
- 추운 날씨 때문에 화재 발생 가능성이 높다 = The likelihood of fire is high because of the cold spell.
And -아서/어서 can also indicate two actions happening in sequence rather than cause and effect.
- 빨리 가서 선생님께 말씀드려 = Go at once and tell the teacher.
- 쇠뻐를 푹 고아서 먹으면 좋다 = It'd be nice to deep boil the cow bones for a meal.