Hallo,
ein w. krüger hatte einmal ein einfaches video-programm für AVR in Bascom mit asm geschrieben.
Ich habe einmal von meinen damaligen Test's einen genommen, abgespeckt und ausführlich kommentiert.
Allerdings wirst du nicht umhinkommen, dich mit Assembler zu beschäftigen.

Das Programm habe ich aber nur im Simulator getestet, da ich im Moment weder Zeit noch meinen Versuchsaufbau zur Verfügung habe.

Code:
;********************************************************************
;
;             Testprogramm Videoausgabe 1 Zeile weiss
;
;********************************************************************
.include "m8def.inc"   ;--> mit externem 4 MHz Quarz <--


.equ	sync = Portb			;-[ 1,2K ]- Sync Ausgang  
.equ	video = Portd   		;-[ 560  ]- Video Ausgang 
.equ	syn = 7				; Pin 7 von Portb

.cseg

        ;Wichtig !!! Stackpointer initialisieren

	ldi 	r16, LOW(RAMEND)      ;LOW-Byte der obersten RAM-Adresse           
	out 	SPL, r16           
	ldi 	r16, HIGH(RAMEND)     ;HIGH-Byte der obersten RAM-Adresse           
	out 	SPH, r16 

	ldi	r16,0b10000000
	out 	ddrb,r16	  ;Portb.7 als Ausgang
	out 	ddrd,r16	  ;Portd.7 als Ausgang
;	ldi	r16,168		  ;bei internem RC Takt, unbedingt
;	out     osccal,r16	  ;Kallibrieren !!!
;beim Wert von 168 wurden bei mir genau 4MHz erzeugt 
	cli			  ;alle Interrupts sperren

;**************** Hauptschleife **************************************
;
;  bei 4 MHz ( 1 Takt = 0,25µs )
;  im AVR Studio steht, welcher Befehl wieviel Zeit benötigt
;  oder dort im Debug Modus "View Processor"
;
;  die Zeiten im Hauptprogramm zählen immer von "cbi sync,syn" (Sync auf Low)	
;  bis "sbi sync,syn" (Sync auf High) oder eben von High nach Low
;
;*********************************************************************
;            __         __         __
;  V-Sync      |_______|  |_______|  |     ---> die ersten 2,5 Zeilen 
;               27,5µs 4,5  27,5µs 4,5      



main:
	ldi	r16,5
syn_0:	
	cbi	sync,syn		;V Sync
	ldi	r23,36			;27,5 µs
syn_1:
	dec	r23
	brne	syn_1
	sbi	sync,syn
	ldi	r23,4			;4,5 µs
syn_2:
	dec	r23
	brne	syn_2
	nop
	dec	r16
	brne	syn_0			;Schleife 5 x 32µs = 160µs
	ldi	r16,5			

;                  __   ________   ________
;  Nachtrabanten     |_|        |_|        |   ---> wieder 2,5 Zeilen
;                   2,25 29,75  2,25  29,75



sync2:	
	cbi	sync,syn		;Nachtrabanten
	ldi	r23,2			;2,25 µs
syn_3:
	dec	r23
	brne	syn_3
	nop
	sbi	sync,syn
	ldi	r23,38			;29,75 µs
syn_4:
	dec	r23
	brne	syn_4
	dec	r16
	brne	sync2			;Schleife 5 x 32µs = 160µs
					;zusammen 320µs = 5 Zeilen

;************************ Zeile 6-156 *******************************	
;
;                       _______________________
;            __      __|                       |___   ---> 307 Zeilen mit Bildinhalt
;  H-Sync      |____|					
;               4,5  1,5   52µs Bildinhalt     6µs
;
;********************************************************************

	ldi	r16,151			;Schleife für 151 Zeilen
hsyn_0:					 
	cbi	sync,syn		
	ldi	r23,5			;4,5 µs
hsyn_1:
	dec	r23
	brne	hsyn_1
	nop
	sbi	sync,syn
	ldi	r23,77			;59,5 µs ( 1,5 + 52 + 6µs )
hsyn_2:					;da die Pegel für Bildinhalt schwarz
	dec	r23			;und 5,8 µs Nachsync gleich bleiben
	brne	hsyn_2			;habe ich die Impulslänge zusammengefasst
	nop
	nop
	dec	r16
	brne	hsyn_0
;************************ Zeile 157 *********************************	
	nop
hsyn_3:
	cbi	sync,syn		;1 Zeile
	ldi	r23,5			;4,5 µs
hsyn_4:
	dec	r23
	brne	hsyn_4
	nop
	sbi	sync,syn		;1,5 µs 
	nop
	nop
	nop
	ldi     r24,0b10000000		; --> Bildinhalt = weiss			
	out	video,r24		;Bildinhalt 52µs ausgeben
	ldi	r23,68
hsyn_5:
	dec	r23
	brne	hsyn_5
	clr	r24
	nop
	nop
	out	video,r24		;6 µs Nachsync
	ldi	r23,7
hsyn_6:
	dec	r23
	brne	hsyn_6

;************************Zeile 158-312 *******************************	
	nop
	ldi	r16,155			;Schleife für 155 Zeilen
hsyn_8:					 
	cbi	sync,syn		;4,5 µs
	ldi	r23,5			
hsyn_9:
	dec	r23
	brne	hsyn_9
	nop
	sbi	sync,syn
	ldi	r23,75			;59,5 µs ( 1,5 + 52 + 6µs )
hsyn_10:				;da die Pegel für Bildinhalt schwarz
	dec	r23			;und 5,8 µs Nachsync gleich bleiben
	brne	hsyn_10			;habe ich die Impulslänge zusammengefasst
	nop
	nop
	dec	r16
	breq	ende			;der Sprung zu "ende" spart 5 Takte
	nop
	nop
	nop				;Ausgleichs nop's, da der 
	nop				;Sprung zu main mehr Takte benötigt
	nop
	brne	hsyn_8
ende:
	nop				;Ausgleichs nop's um genau auf
	nop				;312 Zeilen * 64µs = 19968µs zu kommen
	jmp	main			;Endlos Schleife
;********************** ENDE *****************************************
Ich hoffe, das macht dir das Timing verständlicher ...