www.mikrocontroller.net

Forum: Codesammlung AVR ASCII Video Terminal - 40 x 25 - BAS Signal

Autor: Jan B (Gast)
Datum:
Angehängte Dateien:

Hallo,
ich habe ein Video-Terminalprogramm für den AVR AtMega8-16
geschrieben.
Das Programm ist in Assembler geschieben.
Es erzeugt ein BAS-Signal und stellt auf einem Fernsehgerät mit Video-
oder Scarteingang 20 Zeilen mit je 40 Zeichen dar. Die ASCII-Zeichen
werden an den Mega8 über die serielle Schnittstelle (USART) gesendet.
Die Baudrate ist zwischen 300 und 19200 Baud einstellbar. Benötigt
werden ausser dem Mega8 mit 16-MHz Quarz und der üblichen Beschaltung
noch drei Widerstände und eine Diode. Ein Schaltplan befindet sich in
der angehängten ZIP-Datei.
Es werden 96 ASCII Zeichen und einige Steuerzeichen wie CR, LF, FF und
Zeichen zur Corsorpositionierung unterstützt.
Eine genauere Beschreibung der Terminalfunktionen findet ihr am Anfang
des Source-Codes (ASM-File).
In der ZIP-Datei befindet sich:
Der Source-Code des Programmes. (.ASM)
Das Hex-File, das man direkt in den Mega8 brennen kann. (.HEX)
Der Schaltplan für das Terminal. (.GIF)
Ein Bildschirmphoto (.jpg)

Viel Spaß mit dem Programm

Jan
Autor: Jan B (Gast)
Datum:
Angehängte Dateien:

Sorry, hier geht anscheinend nur ein Attachment,
also hier ist jetzt das versprochene ZIP-Datei
mit dem Programm.

Gruß Jan
Autor: Bernhard S. (bernhard)
Datum:

Hallo Jan,

Super Projekt!!!

Du beschreitest den raffinierten Weg über das Hardware SPI-Interface,

schienbst ein Byte in's SPI und lässt anschließend die Harware für

Dich arbeiten und entlastest somit den µC, der dann in aller Ruhe

das nächste Datenbyte heranorganisieren kann ;)

Bernhard
Autor: leo9 (Gast)
Datum:

Kann mich Bernhard nur anschließen, tolle Leistung. Es finden sich wohl
nur wenige die so ein Projekt durchstehen und dann noch
veröffentlichen.
Ich habe den source zwar nur überflogen, aber mir fallen zwei
Verbesserungsvorschläge auf:

1) Latenzzeit des Interrupts
Der Int tritt entweder während dem nop oder dem jump auf, demnach
müssten manche Einsprünge 62,5ns später passieren als andere. Und
62,5ns müßte man eigentlich im Bild sehen.

2) Vsync
bin mir nicht sicher aber ich glaube die Vsyncgenerierung passt nicht
ganz zu den genormten Vor-, Haupt- und Nachtrabantensignalen. Wird aber
nicht stören da "moderne" Fernseher hinsichtlich dieser Signale sehr
tolerant sind.

Grüße leo
Autor: Benedikt (Gast)
Datum:

Wenn man die Timerzeit so anpasst, dass der Interrupt immer zur selben
Seit eintritt, ist die Latenzzeit immer gleich groß. Das geht nur über
ausprobieren, macht in der Praxis aber kein Problem.
Bei mir musste ich alle Verzweigungen einzeln mit 0-2 nops abgleichen,
denn das ist die Zeit die bei Warteschleifen auftreten kann.
Autor: Jan B (Gast)
Datum:

@leo
>>Und 62,5ns müßte man eigentlich im Bild sehen.

Das simmt, das würde man deutlich sehen.
Der Int tritt immer während des NOP auf.
Das wird erreicht durch "abgleichen" im Programm.
Die Stelle zum Abgleich ist am Anfang des HSYNC.
Wenn am Programm geändert wird, und das Bild wird griselig,
dann muss man ausprobieren ob dort 0 oder 1 oder 2 NOPs hinmüssen.
Zwei Versuche also maximal. Mehr als zwei NOPs kann nicht sein,
Drei NOPs ist wie keiner, wie modulo 2.

Der Vsync ist mit Vor- und Nachtrabanten im Halbzeilenabstand
weitgehend korrekt nachgebildet. Es findet aber keine
Halbbildumschaltung statt, deshalb gibt es auch keine halbe Zeile.

Trotzdem Danke für dein Interesse und deine Vorschläge !

Gruß Jan
Autor: Robert Richard Konrad (Gast)
Datum:

Dier Weg über SPI ist genial, keine Frage - aber nicht neu:
http://www.serasidis.gr/circuits/AVR_VGA/avr_vga.htm - das Selbe in C.
Autor: Bernhard S. (bernhard)
Datum:

@Jan

Man kann das nop-Problem auch durch eine SLEEP Anweisung umgehen.

Somit wird der Interrupt immer aus einer definierten Stellung heraus
gestartet ;)

LOOP:
   sleep
   ...
   ...
rjmp LOOP


oder einem ext. Interrupt:

EXT_INT1:
  SEI   ; alle Interrupts wieder freigeben
  SLEEP
  ....
reti



Bernhard
Autor: Jan B (Gast)
Datum:

Hallo Bernhard,

>>Man kann das nop-Problem auch durch eine SLEEP Anweisung umgehen.

Hab ich anfangs versucht, brachte aber auch einen ziemlichen Jitter.
Ich hätte dann noch mit den verschiedenen Sleep-Modi des Mega-8
herumexperimentrieren müssen, aber da hatte ich es schon mit den NOPs
hingekriegt. Und das klappt ja auch problemlos. Wie schon beschrieben,
ich brauche nur an einer Stelle im Programm abzugleichen.
Bei einer Neuentwicklung würde ich den 16-Bit Timer benutzen,
und die Latenzzeit berechnen. Das finde ich persönlich am saubersten.

Gruß Jan
Autor: Bernhard S. (bernhard)
Datum:

@Jan

>.... brachte aber auch einen ziemlichen Jitter.


Nur wo soll denn der Jitter hergekommen sein,
konntest Du die Ursache finden?

In meinem TV-Projekt war ich sogar so frech, dass ich die Interrupts
verschachtelte ("SEI + SLEEP")


http://www.mikrocontroller.net/forum/read-4-427581.html


SLEEP-Idle-Initialisierung:

; SLEEP-MODUS (Idle)
    ldi temp, (1<<SE)|(0<<SM2)|(0<<SM1)|(0<<SM0)
    out MCUCR, temp


Bernhard
Autor: Jan B (Gast)
Datum:
Angehängte Dateien:

Hallo,
Hier eine verbesserte Version des Programmes.
Es war noch ein dicker Bug in der Cursorpositionierung (Pos.0),
ein Vertauscher in der Beschreibung und die Grafiksymbole 1 - 15
sind nach 129 - 143 verschoben.

Gruß Jan
Autor: Jan B (Gast)
Datum:
Angehängte Dateien:

Hallo,
hier wieder eine neue Version des Programmes.
Gerry hat unermüdlich getestet und tatsächlich noch ein paar
Bugs aufgedeckt. Die sind jetzt auch korrigiert. Insbesonders ist
die Darstellungsqualität der Grafikzeichen verbessert worden.

Vielen Dank an Gerry, und ich hoffe, das jetzt alle Fehler beseitigt
sind.

Gruß Jan
Autor: Simon K. (simon) Benutzerseite
Datum:

Respekt Respekt...
Autor: Harry S. (Gast)
Datum:

Also ich habe bisher noch nichts in dem Forum geschrieben, aber diesmal
muß ich einfach meinen Respekt gegenüber Jan B. äussern!
Wirklich klasse Arbeit. Habe mir eben mal auf die schnelle dein
Video-Terminal zusammen gebastelt und deinen Source draufgespielt und
zack, Bild auf dem Fernseher. Ohne wenn und aber ;-)
Wirklich klasse Arbeit!

Liebe Grüße
Harry S.
Autor: Christian D. (Gast)
Datum:

Hallo,
Super Projekt! bin gerade am Nachbauen ;)
hätte nur ne Frage, hab die benötigte Diode nicht, ohne geht es nicht
oder?
Autor: Jan B (Gast)
Datum:

Da kannst du irgendeine Standard-Diode nehmen.
Funktioniert aber auch ohne.

Gruß Jan
Autor: Christian D. (Gast)
Datum:

ah ok, Danke ;)
Autor: Christian D. (Gast)
Datum:

so Funktioniert nun ohne Diode!
aber sagmal ist es normal das manchmal Buchstaben vertauscht werden?
Autor: neuer (Gast)
Datum:

nein....
Autor: Sir Sydom (sirsydom)
Datum:

Sorry das ich einen alten Thread nochmal zum Leben erwecke, aber ich bin
grad am nachbauen!

Ich hab die Schaltung soweit fertig, ABER bin mir nicht ganz siocher was
das Programmierinterface angeht.

Pin 17 (MOSI) wird ja in der Schaltung benutzt uns do über 710Ohm mit
Pin12 verbunden, mit 1150 Ohm mit GND.

Kann ich trotzdem den MOSI für den Programmiere einfach parallel nutzen
oder muss da ein Jumper oä rein?
Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Wenn es nicht gerade ein billiger "direkt am LPT" Programmer ist, sollte
es keine Probleme geben.
Autor: Sir Sydom (sirsydom)
Datum:

Sooo,

nun bin ich fertig! Die erste selbst gelötete Platine und programmieren
haut hin.

ABER:

Ich seh kaum was am TV.

Das Bild ist dunkelgrau, unten und oben schwarze Balken.

Die Schrift die das Beispielprogramm das als Hex dabei war ausgibt zeigt
etwas Text an

AVR TV-Terminal ... und in der näcgsten Zeile was von 9600 Baud.
Das Problem ist die Schrift und nur ganz ganz schwer zu erkennen. Sie
ist kaum sichtbar, nur ein klein wenig dunkler als der Rest des
Bildschirms..

Was könnte den falsch sein?

Die Widerstände passen, die hab ich nachgemessen..

Nur beim 1k Widerstande mess ich je nachdem wierum ich meine Fühler
ranhalte entweder 1k oder 700 Ohm.. Ist aber definitiv ein 1k
Widerstand..
Autor: Jan B (Gast)
Datum:

Hallo,
wenn du die Schrift dunkel auf hellem Grund siehst,
dann hast du in der Beschaltung irgendwas verkehrt gemacht.
Die Schrift muss weiss auf Schwarz sein, wie auf dem Screenshot.

Gruß Jan
Autor: Peter Winges (Gast)
Datum:

Tolles Projekt!

Ich staune nur was man mit nur so wenig Hardware anstellen kann. Diese
Projekt kann ich vielleicht für mein eigenes verwenden. Mein 1987
erstellter Z8 Rechner macht leider nur 8 Zeilen mit 13 Zeichen. Mit
dieser Schaltung könnte ich die Bildschirmerzeugung enorm aufpeppen. Das
Problem ist vermutlich die Kopplung. Denn die serielle Schnittstelle
scheidet aus, sie ist belegt!


Viele Grüße Peter
Autor: Sir Sydom (sirsydom)
Datum:

Hallo Jan,

das dachte ich mir auch schon - wie gesagt ich hab alles nochmal
nachkontrolliert und nachgemessen.. bleibt nur noch die Diode - es ist
schon so das der schwarze Strich auf dem Bauteil den Strich auf dem
Symbol entspricht, oder?

Wenns das nicht is, kanns nur noch der komische Effekt mit dem 1k
Widerstand sein den ich oben beschrieben habe.

Ich werds morgen mal mit in die Arbeit nehmen und evtl mal per Oszi
ankucken - vielleicht bringt das Erkenntniss.

Über weitere Tipps wäre ich trotzdem dankbar.
Autor: peter winges (Gast)
Datum:

hallo

hast du mir neulich eine email gesendet? ich hatte leider einen PC_crash
und alles ist weg. es ging um die kopplung meines "Z8" mit deinem modul.

viele grüße

          PETER
Autor: Pawel (Gast)
Datum:

Hallo, kann man deine Schaltung ganz einfach an den Antenneneingang
eines normalen Fernsehers anschliessen?

Mein TV (sehr alt) hat nämlich keinen anderen Eingang. Eine schnelle
Antwort wäre super :-)

MfG
Autor: Pawel (Gast)
Datum:

Achja .... und kann man den Code so ummodeln, dass er auch mit nem 15MHz
Quarz funktioniert?

MfG!!
Autor: Sir Sydom (sirsydom)
Datum:

Nein und Ja, vielleicht. Dafür musst du abr definitiv den Code ändern.
Ob dann die Geschwindigkeit noch für 40x25 reicht glaube ich nicht.
Autor: Jan B (Gast)
Datum:

Hallo Pawel,
nein, du kannst die Schaltung nicht direkt an einen Antenneneingang
anschliessen. Dazu müsstest du einen sog. HF-Modulator
dazwischenschalten.

Ja, sicher kann man das Programm modifizieren, so das es mit 15Mhz
läuft.
Die volle Auflösung wird dann wohl nicht mehr erreichbar sein.
Vielleicht noch 36x25 oder 38x25.
Allerdings lohnt sich der Aufwand kaum, wenn man bedenkt das ein 16MHz
Quarz bei Reichelt nur 24 Cents kostet.

Gruß Jan
Autor: mork (Gast)
Datum:

Hallo Jan,

wirklich tolles Programm, funktioniert bei mir problemlos. Der einzige
Nachteil ist, dass es nicht schneller geht als mit 19200baud. Was mir
aufgefallen ist, dass nicht die main die Zeichen aus dem UART-Buffer
holt sondern die ISR beim VSync(wenn ich das richtig verstanden hab).
Kann man denn das Bearbeiten von Zeichen nicht in die main verlegen, um
größere Baudraten zu erhalten?

MfG Mark
Autor: Jan B (Gast)
Datum:

Hi Mark,
Vielen Dank für dein Interesse und deine konstruktive Kritik.
die Zeichen werden beim H-Sync vom USART abgeholt und gepuffert. Damit
könnten bis zu 15625 Zeichen/sec empfangen werden, also ca. 150000baud.
Der Engpass liegt vielmehr in der Weiterverarbeitung der empfangenen
Zeichen. Besonders das Scrollen das Bildschirminhaltes kostet viel Zeit.
Hier müssen fast 2K Ram verschoben werden, bevor das nächste Zeichen
bearbeitet werden kann. Und der Empfangspuffer ist nur 16Byte groß, weil
bei 40x25 schon 1000 Bytes des 1K großen RAMs des Mega8 für den
Bildspeicher gebraucht werden.
Allerdings würde ich mit meinen jetzigen Kenntnissen das Programm völlig
anders aufbauen und könnte bestimmt mehr Geschwindigkeit rauskitzeln.
Naja, jedes fertige Programm ist im Grunde obsolet, hinterher könnte man
es immer besser...

Gruß Jan
Autor: mork (Gast)
Datum:

Hallo Jan,

danke für Deine Antwort!

>Besonders das Scrollen das Bildschirminhaltes kostet viel Zeit.
Könnte man das nicht so machen, dass man die Zeilen scrollt, indem man
einen Zeiger auf die erste Zeile erzeugt und beim Scrollen um eine
Position weiter verschiebt? Dann müsste nur die freigewordene Zeile mit
Leerzeichen gefüllt werden, was deutlich weniger Zeit beansprucht als
das scrollen des ganzen RAMs.

>Und der Empfangspuffer ist nur 16Byte groß, weil
>bei 40x25 schon 1000 Bytes des 1K großen RAMs des Mega8 für den
>Bildspeicher gebraucht werden.

Würde es mit einem Mega32 besser gehen? Ich hab versucht, das Pogramm
auf den Mega32 umzuschreiben, bin jedoch mangels Kenntnissen des
Programmablaufs auf die Nase gefallen. MOSI liegt dort ja an PORTB.5 und
nicht PB3.

Aja, eine Frage noch: ist es ohne großen Aufwand möglich, das Programm
so umzuschreiben, dass es die Zeichen-Fonts aus dem RAM lädt und nicht
aus dem Flash? Beim Mega32 ist ja noch ein KB frei und da wäre ja
eigentlich Platz für mind. 125 Zeichen. Ziel des ganzen wäre dann, dass
man vor dem Programmstart ein beliebiges Font laden könnte, so dass man
auch einfache aber relativ hochauflösende Graphik(320x200) hinkriegt.

MfG Mark
Autor: Jan B (Gast)
Datum:

Hi Mark,
du hast schon Recht, da könnte noch einiges verbessert werden an dem
Programm. Natürlich ginge das auch noch besser mit einem Mega32.
Besonders dessen 2k Ram wären interessant. Andererseits macht es mir
auch immer wieder Spaß zu sehen was mit dem "kleinen" Mega-8 so alles
möglich ist.
Ein ladbarer Fonts im Ram würde mit 128 Zeichen schon das gesamte
zusätzliche Ram eines Mega8 aufbrauchen, da halte ich es für sinnvoller
mehrere umschaltbare Fonts im Flash-Rom zu halten. Da ist Platz genug.
Es wäre auch denkbar, eigene Fonts zu laden und ins Flash zu brennen.
Die AVRs können sich
ja selbst im laufenden Betrieb programmieren. Hab ich aber noch nie
probiert.

Gruß Jan
Autor: chris (Gast)
Datum:

Hallo,
Cooles Projekt, nur wie geht das mit den Steuerzeichen?
Autor: JanB (Gast)
Datum:

Hallo,

>nur wie geht das mit den Steuerzeichen?

Du sendest die Steuerzeichen an das Terminal,
ganz normal wie die anderen Zeichen auch.
Eine Beschreibung zur Funktion der Steuerzeichen
findest du am Anfang des ASM-Datei.

Gruß Jan
Autor: vadim (Gast)
Datum:

Grüße zu dir von Ukraine!
Für dein ausgezeichnetes Projekt danke!
Verwenden es in Verbindung mit dem Kreation amforth
autonomes programmierbares System.
Es gibt Ausgaben und Ideen:
- Kannst du dem Entwurf PC an der Tastatur den hinzufügen
volles Videoterminal.
- möchten die Idee vorschlagen. den Entwurfgeweben schon hinzufügen
Attribute mit einen Kristallen für Farbe, blitzend Umstellung,…
Autor: Wolfram Quehl (quehl)
Datum:

Wirklich gutes Programm.

Anmerkungen:

Im BAS Signal gibt es doch eine negative Austastlücke. Ich kann in der
Schaltung keine neg. Spannung sehen. Darum hatte ich nicht erwartet, daß
man mit 3 Widerständen ein BAS Signal erzeugen kann, wo andere
Hersteller extra Chips für herstellen.

Reicht die Zeit aus, um in der horizontalen Lücke 2 Bytes zu
verarbeiten? Der Hardware UART hat 1 Byte Puffer und dann könnte man die
Übertragungsgeschwindigkeit verdoppeln.

Könnte man nicht beim Scrollen statt der Byteverschiebung eine
Adressverschiebung machen? Das würde dann wesentlich schneller gehen.
Ich habe in meinem Programm einen 256 Byte Software-Empfangspuffer, den
könnte man ja entsprechend erweitern. Ich verwende den Mega32, so daß
die Speichergröße kein Problem darstellen sollte.

Für eine prakt. Anwendung sehe ich nur eingeschränkte Möglichkeiten. Da,
wo Daten über die serielle Schnittstelle eingelesen werden können (PC),
ist meist auch ein Bildschirm vorhanden. Und ein PC hat meistens auch
einen TV Ausgang.

mfg
Autor: JanB (Gast)
Datum:

Hallo Wolfram,
dieser Thread und auch das Programm sind schon fast ein Jahr alt.
Klar habe ich mittlerweile einges verbessern können.

>Im BAS Signal gibt es doch eine negative Austastlücke.
>Ich kann in der Schaltung keine neg. Spannung sehen...
Der neg. Sync-Impuls in der Austastlücke ist nur bezogen auf
den Schwarzpegel negativ. Der Schwarzpegel liegt bei 0,3V und
der Sync-Impuls liegt 0,3V niedriger also auf 0V (GND). Es wird also
für ein BAS-Signal keine neg. Spannung gebraucht.

>Könnte man nicht beim Scrollen statt der Byteverschiebung eine
>Adressverschiebung machen?
Ist in einer neuen Version schon realisiert, Geschwindigkeitsgewinn
enorm.
Code ist auch noch einfacher. Also, hätte ich gleich so machen sollen.

>Reicht die Zeit aus, um in der horizontalen Lücke 2 Bytes zu
>verarbeiten?
Die ankommenden Zeichen werden jetzt asynchron ausserhalb der
Videosignalerzeugung verarbeitet. Klappt jetzt mit bis zu 115000 Baud.
Getestet. Auch mit Scrollen im Text.

>Für eine prakt. Anwendung sehe ich nur eingeschränkte Möglichkeiten.
Sehe ich auch so. Dehalb habe ich es auch hier nicht weiter fortgeführt.
Es ist nur ein Experiment zu meinem persönlichen Vergnügen.
Um zu probieren was so geht mit einem Mega8...

Gruß Jan
Autor: roboterheld (Gast)
Datum:

kannst du dein neuesten code  mal reinstellen.

danke.

mfg
Autor: vado (Gast)
Datum:

Hallo!
Ich nehme am Projekt amForth… teil
Antwort: Du kannst PC AT Kayboard Treiber hinzufügen?
Autor: Petr Tomášek (Gast)
Datum:

Zur UART: könnte man nich RTS/CTS benutzen um den UART zu halten beim
scrollen usw.?
Autor: PhilW (Gast)
Datum:

Hallo Jan!

Tolles Projekt! Gibt es eine Möglichkeit anstatt eines PAL-Signals ein
NTSC-Signal zu erzeugen?
Ich denke man muss 'nur' etwas am Timing spielen. Aber wo?

Gruß, Phil
Autor: nummernschalter (Gast)
Datum:
Angehängte Dateien:

Hallo,

wäre es möglich, der Schaltung eine "kleine Busschnittstelle" an den
Portpins PC0-PC3 und PD2-PD4 zu spendieren ? Habe da mal ein geändertes
Schaltbild angehängt. So ließe sich die Schaltung in beliebige
Bussysteme integrieren. Die Baudrate könnte man auf PC4-5 verlegen:

PC4,PC5 Baud
0  ,  0 9600
0  ,  1 19200
1  ,  0 4800
1  ,  1 Busschnittstelle

Ein Beispiel:

PC0-3 Daten (4Bit)
PD2-4 Steuerwort

1 Byte Steuerwörter

PC0,PC1,PC2,PC3,PD4,PD3,PD2  Aktion
  1,  1,  1,  1,  1,  0,  0  L-Teil Bildschirm löschen
  1,  1,  1,  1,  1,  0,  1  H-Teil Bildschirm löschen
  X,  X,  X,  X,  1,  1,  1  Datenübernahme
  1,  1,  0,  1,  1,  0,  0  L-Teil Cursor auf Anfang der Zeile setzen
  0,  0,  0,  0,  1,  0,  1  H-Teil Cursor auf Anfang der Zeile setzen
  X,  X,  X,  X,  1,  1,  1  Datenübernahme
  1,  1,  0,  0,  1,  0,  0  L-Teil Cursor eine Zeile tiefer setzen
  0,  0,  0,  0,  1,  0,  1  H-Teil Cursor eine Zeile tiefer setzen
  X,  X,  X,  X,  1,  1,  1  Datenübernahme

2 Byte Steuerwörter

1.Parameter setzen
  0,  0,  0,  1,  0,  1,  0  L-Teil Zeile X=1 setzen (Bsp.)
  0,  0,  0,  0,  0,  1,  1  H-Teil Zeile X=1 setzen (Bsp.)
  X,  X,  X,  X,  1,  1,  1  Datenübernahme
2.Steuerwort setzen
  1,  1,  1,  0,  1,  0,  0  L-Teil Cursor auf Zeile X setzen
  0,  0,  0,  0,  1,  0,  1  H-Teil Cursor auf Zeile X setzen
  X,  X,  X,  X,  1,  1,  1  Datenübernahme
1.Parameter setzen
  0,  0,  0,  1,  0,  1,  0  L-Teil Spalte Y=1 setzen (Bsp.)
  0,  0,  0,  0,  0,  1,  1  H-Teil Spalte Y=1 setzen (Bsp.)
  X,  X,  X,  X,  1,  1,  1  Datenübernahme
2.Steuerwort setzen
  1,  1,  1,  1,  1,  0,  0  L-Teil Cursor auf Zeile Y setzen
  0,  0,  0,  0,  1,  0,  1  H-Teil Cursor auf Zeile Y setzen
  X,  X,  X,  X,  1,  1,  1  Datenübernahme
1.Parameter setzen
  0,  0,  1,  0,  0,  1,  0  L-Teil ASCII=32 setzen (Bsp.)
  0,  0,  1,  1,  0,  1,  1  H-Teil ASCII=32 setzen (Bsp.)
  X,  X,  X,  X,  1,  1,  1  Datenübernahme
2.Steuerwort setzen
  1,  0,  1,  1,  1,  0,  0  L-Teil ASCII "0B" setzen
  0,  0,  0,  0,  1,  0,  1  H-Teil ASCII "0B" setzen
  X,  X,  X,  X,  1,  1,  1  Datenübernahme
Autor: nummernschalter (Gast)
Datum:
Angehängte Dateien:

Habe hier mal eine Platinenvorlage bereitgestellt
Autor: nummernschalter (Gast)
Datum:
Angehängte Dateien:

Funktioniert natürlich. Hier in Verbindung mit einem RS232-TTL-Wandler
von Pollin.
Autor: Thomas Kalmeier (Gast)
Datum:

Hallo ...

Datei  .lay    wie soll man das lesen????

Gruß Thomas
Autor: Christian Berger (casandro)
Datum:

PhilW wrote:
> Hallo Jan!
>
> Tolles Projekt! Gibt es eine Möglichkeit anstatt eines PAL-Signals ein
> NTSC-Signal zu erzeugen?
> Ich denke man muss 'nur' etwas am Timing spielen. Aber wo?
>
> Gruß, Phil


Die Zeilenfrequenz ist ähnlich genug dass das laufen sollte. Du musst im
Prinzip nur die Anzahl der Zeilen um 50 reduzieren und es sollte laufen.
Autor: nummernschalter (Gast)
Datum:

Hallo,

die Vorlage wurde mit Sprint Layout 5 der Firma Abacom erstellt. Auf
deren Seite gibt auch einen kostenfreien Betrachter.
Autor: Herr Mann (Gast)
Datum:

>mit Sprint Layout 5 der Firma Abacom

Hey, prima. Endlich mal einer hier, der das auch mal benutzt .. !
Autor: nummerschalter (Gast)
Datum:

>Hey, prima. Endlich mal einer hier, der das auch mal benutzt .. !

Für nur eine Hand voll Euronen keinerlei Einschränkungen in Lagen, Pins,
Platinengröße - da kann man nicht meckern.

Bin aber gerade dabei mich in KiCad einzuarbeiten, das läuft dann auch
unter Linux und ist zudem ein "Opensource" Projekt.
Autor: Herr Mann (Gast)
Datum:

Ich habe es auch mal versucht mit KiCad. Leider war es nicht so von
Erfolg gekrönt und noch etwas Buggy. Daher bleibe ich noch weiterhin bei
Sprint.
Aber vielleicht wirds ja was mit den nächsten Versionen von KiCad
Autor: Browncoat (Gast)
Datum:

Hallo, sorry, wenn ich diesen Thread mal wieder exhumiere... Hab die
Schaltung auf lochraster nachgebaut, und nen MAX232 mit integriert.
Leider erhalte ich mit der hier beschriebenen Beschaltung kein Bild, nur
ein paar Streifen flitschen über den Bildschirm. Wenn ich aber PIN 12
mit PIN 15 und PIN 16 verbinde dann gehts manchmal.

Kurioserweise scheint die Anwesenheit des MAX auch eine Rolle zuspielen,
ist der draussen gehts nicht, der MAX ist nur mit RXD, GND und +5V
verbunden

Klingt irgendwie alles nach Verdrahtungsfehler... hab aber alles schon
mehrfach überprüft. Es läuft dit 64-er version auf dem ATMega 8. Achso,
ist es egal welche der Quarz-Optionen ich wähle, hauptsache extern und
16 MHz?

MfG BC
Autor: Thomas H. (pcexperte) Benutzerseite
Datum:

@JanB

Finde das Projekt echt super kannst du dich mal bitte per Mail
bei mir melden hätte da einen Vorschlag zu machen ;)

Mail: thomas [at] heldt-web [punkt] de

Gruß
Thomas
Autor: Browncoat (Gast)
Datum:

Habs jetzt nochmal durchgetestet und bei mir muss PIN12 mit PIN 17
verbunden werden. Der 560 Ohm Widerstand ist komplett weg, nur dann hab
ich ein Bild. Die Diode ist auch gebrückt. Hat wer ne Erklärung dafür?

MfG BC
Autor: SDFS (Gast)
Datum:

>
> Tolles Projekt! Gibt es eine Möglichkeit anstatt eines PAL-Signals ein
> NTSC-Signal zu erzeugen?
> Ich denke man muss 'nur' etwas am Timing spielen. Aber wo?
Autor: Malte B (Gast)
Datum:

so erst ma mein dank und respekt :):) top sache.

ich hab mich ma an das verstehen des codes gemacht und ihn etwas
erweitert und geändert. das ganze läuft jetzt erst ma auf nem ATMega32
so konnte ich den inputbuffer vergrößern und die register entlasten und
ich hab das ganze noch auf ne bus-schnittstelle umgeschreiben also 8 bit
datenbus und so is aber in den dokumenten beschrieben (wer lieber uart
haben will kann einfach den passenden teil im hsync aus dem original
nehmen, die initialiesireung kopieren und die funktionen mit
rückgabewert im term anpassen, aber das klingt nur nach viel arbeit).
mit dem bus lassen sich maximal 15KB pro sec übertragen (liegt am
interrupt) aber nach 256 Byte is halt der buffer voll.

Das ganze läuft stabil bis auf die erste pixel-zeile, die is ein bischen
verschwommen bzw schief.

wenn noch irgendwas unklar is könnt ihr mich ja anschreiben:
maltebrunn@web.de

mfg
Malte Brunn
Autor: Malte B (Gast)
Datum:
Angehängte Dateien:

oh datei vergessen :):)
Autor: Niels Keller (niels-k)
Datum:
Angehängte Dateien:

Hallo. Auch wenn es bereits ein alter Thread ist: Ein tolles Ding.

Fand ich so gut, dass ich heute morgen die Version von Malte mit der
Version von Jan kombiniert habe. Dadurch kann auch beim Atmega32 die
serielle Schnittstelle verwendet werden.

Das Ergebnis ist im Anhang zusammen mit ein paar Bildern und dem
Quelltext. Das HEX-File kann direkt auf den Atmega32 gezogen werden. Die
Beschaltung ist die von Malte.

Grüße
Autor: WernerC (Gast)
Datum:

Hallo,

gab es irgendwo die neuere Version von Jan mit verbessertem Scrollen ?
Soweit ich die verfuegbaren Quellen durchsehe sind diese noch auf dem
alten Stand.
Insgesamt ein super Projekt, lehrreich in Bezug auf Effizienz und
Optimierung.


Gruss

Werner
Autor: Thorsten (Gast)
Datum:

Ich habe diese Schaltung  mal nachgebaut, und bin von deren Einfachheit
begeistert. Leider funktioniert das ganze nicht so wie ich mir das
vorstelle. Es reicht doch, einfach den gewünschten Text mit der
eingestellten Baudrate zu senden? Bei mir kommt kein Text, dafür jede
Menge Buchstabensalat und Leerzeichen. Ich verwende hterm + MAX232. Der
Starttext wird übrigens korrekt angezeigt. Kann mir jemand weiterhelfen?


Gruß,

Thorsten
Autor: Niels Keller (niels-k)
Datum:

Hallo Thorsten,

Frage: verwendest Du meine ATmega32 Adaption oder die Atmega8 Version?

Beim 32-er kann ich bestätigen, dass es mit einem Max232 (inkl.
Kondensatoren) korrekt funktioniert (vg. Screenshot). Wenn der Starttext
korrekt angezeigt wird, kann ich darauf schließen, dass Du Deine
Hardware (zumindest bis auf den Pegelwandler (weil es ja dort Probleme
geben könnte)) korrekt angeschlossen hast.

Grüße Niels
Autor: Basti (Gast)
Datum:

Was hast du in HTERM eingestellt? (ASC,DEC etc)
Ich erinnere mich, das das bei der aktuellen Version von HTERM ned so
richtig ging, desahlb verwende ich 0.65, versuchs mal damit..
Autor: Thorsten (Gast)
Datum:

Als Modus habe ich ASC verwendet. Hterm 0.65 werde ich mal versuchen,
sobald ich zu Hause bin.
Autor: Thorsten (Gast)
Datum:

PS: Es ist die Atmega-8 Version, mit Nr. 64 der Software
Autor: Thorsten (Gast)
Datum:

So ich hab mal das andere Terminal probiert, es brachte keine Besserung.
Auch das Auswechseln von AVR und MAX232 nützte nichts.
Autor: Thorsten (Gast)
Datum:

Ich probierte nun mal die anderen Versionen der Software, leider
ebenfalls ohne Erfolg.
Autor: Niels Keller (niels-k)
Datum:

Ich selbst habe - zugegeben nie die 8er Version in der Realität
ausprobiert. Sollte gar nichts funktionieren, dann kopiere aus meiner
32-Version den Teil des UARTS raus und setze diesen an geigneter Stelle
im 8er Text ein. Oder: Nimm einen 32er und ziehe das HEX-File auf den
Chip und probiere es dann noch mal.
Autor: Max (Gast)
Datum:

Schade das der "optimierte" Code hier nie eingestellt wurde, hätte sowas
(einfaches) nämlich gern in meiner Haussteuerung, das ganze würde
nämlich einen extra PC zur Anzeige von Infos (Anruflisten, Alarme,
Temperatur etc pp) auf dem TV einsparen (der ja deutlich mehr Strom
braucht als ein Mega8).

Wär es ansonsten technisch möglich die Software so umzuschreiben das man
auf V/H-Sync von "aussen" reagiert (bzw. synchronisiert) und so zB. ins
laufende TV-Bild Text einblenden kann?  Solche IC die soetwas per
Hardware erledigen sind leider endweder sehr schwer zu beschaffen (und
teuer) oder die verarbeiten nur reine RGB-Signale.
Autor: micha (Gast)
Datum:

google mal nach AVR+OSD
Autor: Timo (Gast)
Datum:

Schau einfach mal bei Uli vorbei, Stichwort "Videotext"
http://www.ulrichradig.de/
Autor: Johan R. (Gast)
Datum:

Ich habe das mal nachebaut, und hänge momentan beim selben Problem wie
Thorsten fest. Irgendwie habe ich das Gefühl, dass die Baudrate nicht
stimmt, obwohl ich im Terminalprogramm die eingestellt habe, die per
Jumper gesetzt ist und auch angezeigt wird. Eventuell, liegt es auch am
Interrupt zur Bilderzeugung, das der dem AVR die Ressourcen nimmt, und
somit keine Zeit zu Verarbeitung der UART-Daten hat. Ich programmiere in
C und habe daher kaum Assembler-Kentnisse. Wäre es möglich, dass sich
jemand mal den UART- und Interrupt-Teil ansieht?


Der UART:
;Init USART
;Baudratenjumper einlesen und auswerten
;  und Baudrate anzeigen
        ;IO-Port lesen,
        ;Baudratenwerte aus Tabelle holen 
        in mpa,PIND
        andi mpa,0b00011100  ;nur die Bits 2-4 interessieren
        lsl mpa              ;Tabellenzeile ist 8 Bytes lang
        ldi ZH,HIGH(Baudtab<<1) ;auf Anfang der Tabelle
        ldi ZL, LOW(Baudtab<<1)
        add ZL,mpa           ;Baudratennr. mal acht dazu
        adc ZH,zero
        lpm mpa,Z+           ;Baudratenwerte f¸r USART holen
        lpm mpb,Z+
        ;USART Baudrate setzen
        out UBRRH,mpb
        out UBRRL,mpa
        ;Baudrate auf Screen anzeigen
        ldi XH,HIGH(Charbuf+cpl*2);Position auf Bildschirm
        ldi XL, LOW(Charbuf+cpl*2)
        ldi mpb,6            ;6 Zeichen
baudl:  lpm mpa,Z+           ;  holen
        st X+,mpa            ;  und im Charbuffer speichern
        dec mpb
        brne baudl           
        ;USART einstellen und starten
baud2:  ldi mpa,0x10         ;Receiver enable
        out UCSRB,mpa
        ldi mpa,0x86         ;8-Bit, 1 Stopbit, no Parity
        out UCSRC,mpa



Der Interrupt:

 nop                ;Laufzeitausgleich     
          synclo             ;Syncsignal Lo setzen
          out tcnt0,t0rlv 
          in ssreg,SREG      ;Statusreg retten
          mov xhsi,XH        ;X retten
          mov xlsi,XL

          ldi mpb,24         ;normale Hsynczeit
          in mpa,UCSRA       ;USART Status
          andi mpa,0x80      ;Neuer Char da ?
          breq hsync1        ;Nee
          in mpa,UDR         ;USART Data holen
          ldi XH,HIGH(inbuf) ;X auf Start Input Buffer
          ldi XL, LOW(inbuf) 
          add XL,ibupw       ;Write-Pointer dazu
          adc XH,zero
          st X,mpa           ;neuen Char ablegen
          inc ibupw          ;Pointer weitersetzen
          ldi mpa,InBufSize-1;Pointer wraparound
          and ibupw,mpa
          subi mpb,4         ;Zeitausgleich f¸r Hsync 
          nop                ;  falls neuer Char da war
          nop
hsync1:   mov XH,xhsi        ;Restore X
          mov XL,xlsi
hsync2:   dec mpb            ;Restliche HSync-Zeit vertrˆdeln
          brne hsync2
          ijmp               ;Ende Hsync


;Leerzeilen mit den Ausgleichsimpulsen
preq:   synchi                ;Syncsignal wieder auf HI
        ldi mpa,144           ;1/2 Zeile abwarten
preqb:  dec mpa 
        brne preqb
        ;Hsync Impuls auf 1/2 Zeile
        cbi portd,6          ;Sync auf LO
        ldi mpa,24
preqc:  dec mpa
        brne preqc          
        sbi portd,6          ;Sync zu¸ck auf HI

        dec zz               ;noch mehr Zeilen ?
        brne preqd           ;ja
        ldi ZH,HIGH(vsync)   ;danach kommt Vsync
        ldi ZL,LOW(vsync)
        ldi zz,vsyncl        ;Anzahl setzen
preqd:  endint               ;das wars



;Vertical Sync
;damit f‰ngt jedes Bild an
vsync: ;1/2 Zeile minus HSync-Zeit abwarten, Sync bleibt noch LO
        ldi mpa,120 
vs1a:   dec mpa
        brne vs1a
        ;inv. Hsync-Impuls auf 1/2 Vsync-Zeile
        sbi portd,6         ;Sync auf HI
        ldi mpa,24          ;4,75us
vs1b:   dec mpa
        brne vs1b
        synclo              ;Sync auf LO
        ldi mpa,142         ;  f¸r den Rest der Zeile
vs1c:   dec mpa
        brne vs1c
        synchi              ;Sync zur¸ck auf HI
        dec zz              ;noch mehr Vsync-Zeilen ?
        brne vs1d           ;  ja
        ldi ZH,HIGH(poeq)   ;danach kommen die
        ldi ZL,LOW(poeq)    ;  hinteren Ausgleichs-Zeilen
        ldi zz,poeql        ;Anzahl setzen
vs1d:   endint            


;Leerzeilen mit den Ausgleichsimpulsen
poeq:   synchi              ;Syncsignal wieder auf HI
        ldi mpa,144         ;1/2 Zeile abwarten
poeqb:  dec mpa 
        brne poeqb
        ;Hsync Impuls auf 1/2 Zeile
        synclo              ;Sync auf LO
        ldi mpa,24
poeqc:  dec mpa
        brne poeqc          
        synchi              ;Sync zu¸ck auf HI

        dec zz              ;noch mehr Zeilen ?
        brne poeqd          ; ja
        ldi ZH,HIGH(leero)  ;danach kommen Leerzeilen
        ldi ZL,LOW(leero)
        ldi zz,ubll         ;Anzahl setzen
poeqd:  endint              ;das wars




;Obere Leerzeilen
;Hier ist der Terminalprogrammteil mit
;untergebracht, weil hier viel Zeit ¸brig ist
leero:  synchi               ;Syncsignal wieder auf HI
        rcall term           ;Terminalteil ausf¸hren 

leeroa: dec zz               ;noch mehr Leerzeilen ?
        brne leerob          ;  ja
        ldi ZH,HIGH(dline)   ;als n‰chstes kommen 
        ldi ZL, LOW(dline)   ;  Display Lines   
        ldi zz,lpc           ;Zeilen pro Zeichen
        ldi fz,vidl          ;Anzahl Video-Zeilen
        ldi YH,HIGH(Charbuf) ;Init Character-Bufferpointer
        ldi YL, LOW(Charbuf)
        ldi cgp,High(chargenx<<1)
leerob: endint               




;Hier ist die eigentliche Video-Darstellung
dline:  synchi        ;Syncsignal wieder auf HI
        ;Schwarzschulter abwarten
        ldi mpa,ssv 
dlineb: dec mpa
        brne dlineb
        ;Pixeldaten f¸r 40 Chars rausschieben
        mov XH,YH
        mov XL,YL
        mov ZH,cgp
        inc cgp
        ldi mpc,cpl

Autor: 6512,5 (Gast)
Datum:

brne preqb
den befehl gibt es nicht. wer soen prog schrebt kann ncht mehr alle
haben.
Autor: Ernst (Gast)
Datum:

6512,5 schrieb:
> brne preqb
> den befehl gibt es nicht. wer soen prog schrebt kann ncht mehr alle
> haben.
wer so eine käse schreibt auch nicht.

"branch not equal" und das "label".
Kann sein, das es das beim 6512 nicht gibt.

Was mir dagegen noch unklar ist, warum sind Pin 15 und 17
zusammengeschalten?

Ernst
Autor: Niels (Gast)
Datum:

Wenn ich mich richtig entsinne, dann war das Low-Level bei 0,7Volt und
das Highlevel bei 1.0V. Beim Bildwechsel, dann wieder ein anderer Wert -
man ist das lange her - lege ich mich jetzt nich fest. Daher muss man
die Werte, jeweils über einen Widerstand geführt, zusammenlegen und
erhält das Gesamtsignal.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net