PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TV Textausgabe in Bascom



albundy
18.02.2005, 12:25
Hallo,
ich habe für ein bestehendes Projekt in Bascom, nach einer Möglichkeit gesucht, statisch Text auf dem TV darzustellen. Das ganze sollte erstens ohne Interrupts auskommen, da sonst nicht genügend Zeit für die andere Aufgaben bleibt und zweitens mit 4 MHz zurecht kommen.
Mit Hilfe von JanB's ASM - Terminalquellcode ist es mir gelungen, eine für meine Zwecke ausreichende Lösung in Form einer ASM Subroutine zu finden. (Assembler Freak's mögen mir meinen Programmierstil verzeihen.)
Ich stelle den Quellcode mal hier rein, vielleicht ist ja dem einen oder anderen mit dieser Möglichkeit geholfen.

'************************************************* ******************************
'* Versuchsobjekt für TV Ausgabe in Bascom W.Krüger (c) 2005 *
'* für ein fertiges Projekt mit 4 MHz Quarz *
'* *
'* bei 4 MHz 12 Zeichen pro Zeile (Ausgabezeit pro Pixel 0,5 µs) *
'* Jeder Buchstabe besteht aus 5*12 Bit, da die Buchstaben sonst *
'* sehr gestaucht sind. *
'************************************************* ****************************** .
$regfile = "m8535.dat" 'ATmega8535
$crystal = 4000000

Dim Txt_nr As Byte
Declare Sub Ausgabe
Ddra = 128
Ddrb = 0 'Portb.1 Taster gegen GND
Portb = 2 'Pullup für Taster ein
Ddrc = 255
Const Syn = 7
Const Sync = Porta 'Porta.7 = Sync ---[1,2K]---
Const Video = Portc 'Portc.7 = BAS ---[560 ]---

Do
If Pinb.1 = 0 Then
If Txt_nr = 3 Then Txt_nr = 0
Call Ausgabe
Incr Txt_nr
End If
Loop

Sub Ausgabe
$asm
lds r18,{Txt_nr} 'Txt_nr 0 = Text1
ldi r19,156 '156 Byte = Textblocklänge
ldi zh,high(Text1*2)
ldi zl,low(Text1*2)
mov r0,r19
mul r0,r18
add zl,r0
adc zh,r1
cli 'alle Interrupts sperren
ldi r17,255 'Framezähler R17 * 312 Zeilen * je 64µs
Main: 'bei R17=255 etwa 5 Sekunden Ausgabezeit
ldi r16,5
V_sync1:
cbi sync,syn '5 Zeilen V-Sync + Nachtrabanten
ldi r23,36
V_sync2:
dec r23
brne V_sync2
sbi sync,syn
ldi r23,4
V_sync3:
dec r23
brne V_sync3
nop
dec r16
brne V_sync1
ldi r16,5
V_sync4:
cbi sync,syn
ldi r23,2
V_sync5:
dec r23
brne V_sync5
nop
sbi sync,syn
ldi r23,38
V_sync6:
dec r23
brne V_sync6
dec r16
brne V_sync4
'*********************** Zeile 6-55 ********************************************
ldi r16,49
H_sync1:
cbi sync,syn
ldi r23,5
H_sync2:
dec r23
brne H_sync2
nop
sbi sync,syn 'Schwarzzeilen
ldi r23,77
H_sync3:
dec r23
brne H_sync3
nop
nop
dec r16
brne H_sync1
'*********************** Zeile 56-68 *******************************************
ldi r16,12
H_sync4:
cbi sync,syn
ldi r23,5
H_sync5:
dec r23
brne H_sync5
nop
sbi sync,syn
ldi r23,65
H_sync6:
dec r23
brne H_sync6
lpm r24,z+ 'Ausgabe der Ziffer oben rechts
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
ldi r23,8
H_sync7:
dec r23
brne H_sync7
dec r16
brne H_sync4
'*********************** Zeile 69-150 ******************************************
ldi r16,83
H_sync8:
cbi sync,syn
ldi r23,5
H_sync9:
dec r23
brne H_sync9
nop
sbi sync,syn 'Schwarzzeilen
ldi r23,77
H_sync10:
dec r23
brne H_sync10
nop
nop
dec r16
brne H_sync8
'*********************** Zeile 151-163 *****************************************
ldi r16,12
H_sync11:
cbi sync,syn
ldi r23,5
H_sync12:
dec r23
brne H_sync12
nop
sbi sync,syn
ldi r23,5
H_sync13:
dec r23
brne H_sync13
ldi r23,9
H_sync14:
dec r23
brne H_sync14
lpm r24,z+
Out Video , R24 'Textausgabe (12 Zeichen)
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lpm r24,z+
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lpm r24,z+
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lpm r24,z+
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lpm r24,z+
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lpm r24,z+
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lpm r24,z+
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lpm r24,z+
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lpm r24,z+
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lpm r24,z+
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lpm r24,z+
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lpm r24,z+
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
lsl r24
Out Video , R24
ldi r23,7
H_sync15:
dec r23
brne H_sync15
dec r16
breq H_sync16
nop
jmp H_sync11
'*********************** Zeile 164-312 *****************************************
H_sync16:
nop
ldi r16,150
H_sync17:
cbi sync,syn
ldi r23,5
H_sync18:
dec r23
brne H_sync18
nop
sbi sync,syn 'Schwarzzeilen
ldi r23,73
H_sync19:
dec r23
brne H_sync19
dec r16
breq Frame_end
ldi r23,4
H_sync20:
dec r23
brne H_sync20
nop
jmp H_sync17
'********************* ENDE ************************************************** **
Frame_end:
ldi zh,high(Text1*2) 'für jeden Frame Textadresse
ldi zl,low(Text1*2) 'neu laden
mov r0,r19
mul r0,r18
add zl,r0
adc zh,r1
dec r17 'Framezähler herunterzählen
breq Sub_end
nop
nop
jmp main
Sub_end:
cbi sync,syn 'Syncport auf "0"
sei 'Interrupt freigeben
$end Asm
End Sub

'----------------------------------------------------------------------------

Text1:
Data 32 , 96 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 112 '1 oben rechts

Data 112 , 32 , 248 , 0 , 240 , 248 , 112 , 112 , 136 , 248 , 240 , 0
Data 112 , 112 , 248 , 0 , 248 , 248 , 112 , 32 , 136 , 248 , 248 , 0
Data 136 , 216 , 32 , 0 , 136 , 128 , 136 , 32 , 136 , 128 , 136 , 0
Data 128 , 136 , 32 , 0 , 136 , 128 , 128 , 32 , 136 , 128 , 136 , 0
Data 128 , 136 , 32 , 0 , 136 , 128 , 128 , 32 , 136 , 128 , 136 , 0
Data 112 , 136 , 32 , 112 , 248 , 240 , 128 , 32 , 136 , 240 , 248 , 0
Data 112 , 248 , 32 , 112 , 240 , 240 , 128 , 32 , 136 , 240 , 240 , 0
Data 8 , 248 , 32 , 0 , 192 , 128 , 128 , 32 , 136 , 128 , 192 , 0
Data 8 , 136 , 32 , 0 , 160 , 128 , 128 , 32 , 80 , 128 , 160 , 0
Data 136 , 136 , 32 , 0 , 176 , 128 , 136 , 32 , 80 , 128 , 176 , 0
Data 112 , 136 , 32 , 0 , 152 , 248 , 112 , 32 , 32 , 248 , 152 , 0
Data 112 , 136 , 32 , 0 , 136 , 248 , 112 , 112 , 32 , 248 , 136 , 0
' S A T - R E C I V E R
Text2:
Data 112 , 248 , 136 , 8 , 24 , 48 , 96 , 192 , 128 , 128 , 248 , 248 '2 oben rechts

Data 0 , 224 , 136 , 224 , 0 , 240 , 128 , 32 , 136 , 248 , 240 , 0
Data 0 , 240 , 136 , 240 , 0 , 248 , 128 , 112 , 136 , 248 , 248 , 0
Data 0 , 88 , 136 , 88 , 0 , 136 , 128 , 216 , 136 , 128 , 136 , 0
Data 0 , 72 , 136 , 72 , 0 , 136 , 128 , 136 , 80 , 128 , 136 , 0
Data 0 , 72 , 136 , 72 , 0 , 136 , 128 , 136 , 80 , 128 , 136 , 0
Data 0 , 72 , 136 , 72 , 112 , 248 , 128 , 136 , 80 , 240 , 248 , 0
Data 0 , 72 , 136 , 72 , 112 , 240 , 128 , 248 , 32 , 240 , 240 , 0
Data 0 , 72 , 136 , 72 , 0 , 128 , 128 , 248 , 32 , 128 , 192 , 0
Data 0 , 72 , 80 , 72 , 0 , 128 , 128 , 136 , 32 , 128 , 160 , 0
Data 0 , 88 , 80 , 88 , 0 , 128 , 128 , 136 , 32 , 128 , 176 , 0
Data 0 , 240 , 32 , 240 , 0 , 128 , 240 , 136 , 32 , 248 , 152 , 0
Data 0 , 224 , 32 , 224 , 0 , 128 , 240 , 136 , 32 , 248 , 136 , 0
' D V D - P L A Y E R
Text3:
Data 112 , 248 , 136 , 8 , 8 , 48 , 48 , 8 , 8 , 136 , 248 , 112 '3 oben rechts

Data 136 , 112 , 224 , 248 , 112 , 0 , 240 , 248 , 112 , 112 , 240 , 224
Data 136 , 32 , 240 , 248 , 112 , 0 , 248 , 248 , 112 , 112 , 248 , 240
Data 136 , 32 , 88 , 128 , 136 , 0 , 136 , 128 , 136 , 136 , 136 , 88
Data 136 , 32 , 72 , 128 , 136 , 0 , 136 , 128 , 128 , 136 , 136 , 72
Data 136 , 32 , 72 , 128 , 136 , 0 , 136 , 128 , 128 , 136 , 136 , 72
Data 136 , 32 , 72 , 240 , 136 , 112 , 248 , 240 , 128 , 136 , 248 , 72
Data 136 , 32 , 72 , 240 , 136 , 112 , 240 , 240 , 128 , 136 , 240 , 72
Data 136 , 32 , 72 , 128 , 136 , 0 , 192 , 128 , 128 , 136 , 192 , 72
Data 80 , 32 , 72 , 128 , 136 , 0 , 160 , 128 , 128 , 136 , 160 , 72
Data 80 , 32 , 88 , 128 , 136 , 0 , 176 , 128 , 136 , 136 , 176 , 88
Data 32 , 32 , 240 , 248 , 112 , 0 , 152 , 248 , 112 , 112 , 152 , 240
Data 32 , 112 , 224 , 248 , 112 , 0 , 136 , 248 , 112 , 112 , 136 , 224
' V I D E O - R E C O R D

Hier noch ein Foto.

JanB
18.02.2005, 12:35
Hallo,
Ja Super !!
Mach weiter dran !

Aber einen Punkt verstehe ich nicht.

..sollte ohne Interrupts auskommen, da sonst nicht genügend Zeit für die andere Aufgaben bleibt..
Das sehe ich genau anders rum.
Nur wenn es im Interrupt läuft bleibt noch Zeit für andere Bascom-Aufgaben.
Sonst bricht doch das BIld zusammen, wenn du was anderes machst.
Oder wie meinst du das ?

Gruß Jan

pebisoft
18.02.2005, 17:18
hallo, hast du gut hinbekommen. ich habe bei mir noch fehler drin, klappt nicht so.
schaffst du es auch für 8mhz, oder was muss man da ändern.
mfg pebisoft

albundy
18.02.2005, 18:23
Hallo Jan,

Nur wenn es im Interrupt läuft bleibt noch Zeit für andere Bascom-Aufgaben.
Sonst bricht doch das BIld zusammen, wenn du was anderes machst.
Kann es ja auch.
Mein Ziel war es nur, für eine bestimmte Zeit einige vordefinierte Texte auf den Bildschirm zu bringen. Dafür ist es doch am einfachsten, ein Frame mit genau 312*64 µs zu erzeugen und es eine bestimmte Zeit anzuzeigen. Wozu sollte ich dafür einen Interrupt erzeugen.

Hallo Peter,

schaffst du es auch für 8mhz, oder was muss man da ändern.
Sicher geht es auch mit 8 MHz, war aber nicht mein Ziel.
Nimm dir mal nur den Assemblercode aus der Subroutine und lass ihn im AVR Studio Simulator laufen. (Der ist komfortabler als der in Bascom)
Dann wirst du sehen, dass der V-Sync mit Nachtrabanten genau 5 Zeilen (320 µs) lang ist. Und dann kommen noch 307 Zeilen mit je 64 µs.
wenn du das dann ändern willst, musst du die Pausenzeiten (r23) entsprechend anpassen. Aber Vorsicht, 1 Takt zuviel oder zuwenig reicht und das Bild läuft durch.

pebisoft
18.02.2005, 18:31
hallo, habe es auf dem avr16 mit intern 4mhz getestet und läuft stabil ohne bildwanderung. die zeilen "$prog ...." wo hast du die her, habe sie ausgeklammert und läuft trotzdem wie gehabt.
mfg pebisoft

albundy
18.02.2005, 19:13
Hallo,

die zeilen "$prog ...." wo hast du die her
die kann ich bei mir nicht finden, oder meinst du $asm ?

JanB
18.02.2005, 19:23
Hallo,

Mein Ziel war es nur, für eine bestimmte Zeit einige vordefinierte Texte auf den Bildschirm zu bringen
Ah so, du willst das sowieso nur eine Weile lang anzeigen,
und dann machst du was anderes, und brauchst das Bild dann nicht mehr.
Dann verstehe ich, was du meinst, dann brauchst du das nicht
im Hintergrund laufen lassen.

Gruß Jan

albundy
18.02.2005, 19:50
Hallo Jan,
Das ganze ist ein Videoquellen Umschalter mit RC5 und noch anderem Schnickschnack.
Wäre ja blöd, wenn der Bildschirmtext stehen bliebe, nachdem ich den Eingang umgeschaltet habe.
Ich will nur kurz sehen können, welche Quelle gerade aktiv ist.
Schön wäre allerdings noch, wenn man Text in ein vorhandenes Bild blenden könnte. (z.B. Datum / Uhrzeit)
Ich habe mich auch schon theoretisch mit dem LM 1881 beschäftigt.
Mittels diesem kann man aus einem vorhandenem FBAS Signal den V-Sync und H-Sync als TTL Signal herausnehmen.
Man braucht dann nur noch die Position abzählen und an geeigneter Stelle entsprechende Informationen in das Bild einfügen.
Um den ausgehenden V und H-Sync kümmert sich der IC allein.
Aber wie gesagt, alles noch Theorie.

Manf
18.02.2005, 20:10
Vielen Dank für das schöne Beispiel.
Meine Anwendung ist sicher noch weniger komplex, ich komme nur im Moment nicht dazu sie umzusetzen.
Ich komme bestimmt noch mal darauf zurück.

Manfred