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 ...
Lesezeichen