liebes Forum,
ich wollte spaßeshalber ein BAS-Videosignal auf meinem Attiny2313
erzeugen.
Da ein Bild aus 625 Zeilen besteht ist der Counter für die
Zeilenschleife mehr als 8 Bit groß. Deshalb muss ich wohl mit 16 bit
rechnen was ich im nachfolgenden codeschnipsel wohl versucht habe.
Das Problem ist nun das nur das Bildsynchronsignal ausgegeben wird
(messung mit Oszilloskop). Ich denke das der Fehler in meiner 16bit
rechnerei liegt, weis aber nicht woran genau.
danke schonmal für schlaue Antworten :-)
M. M. schrieb:> ldi Temp1, 0b01110001 ; Prüfe ob schon 625. Zeile> ldi Temp2, 0b00000010
Findest Du es sinnvoll, hier binäre Konstanten zu verwenden? Oder ist
das ein Obfuskationsversuch?
Hi
> Deshalb muss ich wohl mit 16 bit>rechnen was ich im nachfolgenden codeschnipsel wohl versucht habe.
Aber warum so kompliziert? Wenn du zum Zählen Registerpaare ab r24
benutzt können AVRs auch direkt 16Bit zählen
1
ldi r24,Low(625)
2
ldi r25,High(625)
3
4
Zeilenschleife:
5
6
......
7
8
brlo HinSwSchleife
9
10
sbiw r25:r24,1
11
brne Zeilenschleife
12
13
clr BildSync
Und mit rückwärts Zählen ersparst du die die ganzen Vergleiche.
MfG Spess
Oh mir ist aufgefallen das das wohl der falsche Port war XD jetzt funzt
es zumindest softwaremäßig
und danke für die hinweise, wie mit 16bit zahlen umgegangen wird.
sind die register 24 und 25 die einzigen 16bittigen?
Hi
>sind die register 24 und 25 die einzigen 16bittigen?
Nein. adiw/sbiw lassen sich auch mit r27:r26 (X), r29:r28 (Y) und
r31:r30 verwenden.
MfG Spess
Das hier übliche Composite-Video-Signal (BAS mit PAL-Timing) hat zwar
625 Bildzeilen, die aber nur mit Interlace, also effektiv 312 Zeilen bei
50 Hz.
Berücksichtigst Du das?
@ Spess 53:
eines versteh ich allerdings nicht, sbiw zieht von r25,r24 immer 1 ab.
Aber es wird nicht mit 0 verglichen. Woher weis dann brne welche
register oder konstanten "not equal" sind?
" sbiw r25:r24,1
brne Zeilenschleife"
@ R. T. Firefly:
ein ganzes bild teilt sich ja in 2 halbbilder auf um das flimmern zu
reduzieren > 1.halbbild jede gerade Zeile, 2.halbbild (vom gleichen
bild) jede ungerade Zeile.
aber bevor ich das programmiere muss ich noch an meiner hardware
basteln. ich hab da so meine probleme mit der kapazität von den
dioden...
Hi
>Woher weis dann brne welche register oder konstanten "not equal" sind?
sbiw setzt das Z-Flag wenn das Ergebnis Null wird. Und das wird von brne
ausgewertet.
MfG Spess
ich hab jezt geschafft ein sauberes bildsignal zu erzeugen (schwarz
weiße streifen). Jetzt überleg ich gerade wie ich ein richtiges Bild,
gespeichert in einem array, erzeugen kann. Der attiny2313 mit 20MHz ist
dazu zu langsam. Selbst wenn er schnell genug wäre, wäre er komplett
damit beschäftigt das videosignal zu erzeugen. Eigentlich soll dieser ja
auch nur das Bild bearbeiten (Rechtecke oder Buchstaben zeichnen). Das
Videosignal soll hardwaremäßig gemacht werden: Oszillator >
inkrementiert Zähler > setzt die adressleitung von externem Speicher >
Ausgang ist das signal.
Das Problem ist nun: Wie soll das Bild vom Mikrocontroller in den
externen Speicher kommen, ohne das die Videosignalerzeugung unterbrochen
wird.
ich bräuchte quasi einen Speicher (4kbyte) der gleichzeitig beschrieben
und gelesen werden kann. Mit einem Ausgang und einem Eingang und jeweils
die Adresseingänge. Gibt es sowas, oder hat noch wer eine andere idee?
@M. M. (blackcow)
>weiße streifen). Jetzt überleg ich gerade wie ich ein richtiges Bild,>gespeichert in einem array, erzeugen kann.
So wie die Leute, die das vor dir getan haben.
> Der attiny2313 mit 20MHz ist>dazu zu langsam.
Nein.
> Selbst wenn er schnell genug wäre, wäre er komplett>damit beschäftigt das videosignal zu erzeugen.
Fast.
>Das Problem ist nun: Wie soll das Bild vom Mikrocontroller in den>externen Speicher kommen, ohne das die Videosignalerzeugung unterbrochen>wird.Beitrag "AVR ASCII Video Terminal - 40 x 25 - BAS Signal"
Und wenn du mal RICHTIG blass werden willst, schua dir das an. DER
HAMMER!!!
http://www.linusakesson.net/scene/craft/
M. M. schrieb:> Der attiny2313 mit 20MHz ist> dazu zu langsam.
Naja, die längste Zeit wartet der ja grad nur.
Wenn du die Schulter über einen Timer laufen lässt, kannst du da sehr
viel zwischendurch rechnen.
wenn ich aber ein videosignal in ein array einlesen will, dann dieses
"bild" bearbeiten und dann wieder ausgeben will brauch ich ja einen
externen speicher!
kann man programmieren das der 16-bit timer 1 bei OCR1A einen Interrupt
auslöst, weiterzählt, bei OCR1B einen Interrupt auslöst und hier erst
zurücksetzt?
Hi
>kann man programmieren das der 16-bit timer 1 bei OCR1A einen Interrupt>auslöst, weiterzählt, bei OCR1B einen Interrupt auslöst und hier erst>zurücksetzt?
Umgedreht ginge es einfacher.
MfG Spess
wie umgedreht? also ich will nach einer Zeit(Zählerstand) einen
Interrupt haben, und nach einem noch höheren Zählerstand wieder einen.
Ich lese grade das datenblatt und glaube das hierfür irgendein pwm-modus
geeignet wäre, aber welcher, und wie funktioniert er?
Hi
>kann man einen Timer einfach löschen bzw. rücksetzen?
Ja. TCNT auf Null setzen. Bei CTC geht das aber automatisch beim
Erreichen von OCR1A.
MfG Spess
Ich komme einfach nicht weiter! das folgende programm soll ein
videosignal aus dem im SRAM gespeichertem bild erzeugen. Aber an PORTB
kommt nur schwachsinn raus! Ein Schwachsinnsgenerator! auch PORTB, Bit 4
ist manchmal Angesteuert, obwohl das laut dem folgendem Code gar nicht
sein kann, weil ich noch kein Bild in den SRAM gespeichert hab!
Kann mal bitte, bitte wer den code anschauen?
1
.include "tn2313def.inc" ; Definitionsdatei für Attiny2313 Einbinden
2
3
; Interruptvektoren setzen
4
.org 0x000 ; > bei Reset
5
rjmp Reset
6
.org OC1Aaddr ; > bei Timercompare 1A
7
rjmp Verteiler
8
.org OC1Baddr ; > bei Timercompare 1B
9
rjmp Vergleichswert_B
10
11
Reset: ; Start bei Reset
12
13
.def rTemp1 = r16 ; Variablen festlegen
14
.def rTemp2 = r17
15
.def rTemp3 = r18
16
.def rTemp4 = r19
17
.def rPhase1Lo = r24
18
.def rPhase1Hi = r25
19
.def rPhaseHalbbild = r21
20
21
.dseg
22
Bildspeicher: .BYTE 120 ; Bildspeicher deklarieren und reservieren
23
.cseg
24
25
ldi YL, LOW(Bildspeicher) ; Low-Byte der Adresse erster Bildpunkt in Y-Pointer
26
ldi YH, HIGH(Bildspeicher) ; High-Byte der Adresse erster Bildpunkt in Y-Pointer
Hi
>Ich habe da so ein gefühl...>Ist diese vorgehensweise richtig?:
Kommt darauf, was du bezwecken willst. Dein Code zählt bis r25:r24
gleich 280 ist.
MfG Spess
M. M. schrieb:> a ein Bild aus 625 Zeilen besteht ist der Counter für die> Zeilenschleife mehr als 8 Bit groß. Deshalb muss ich wohl mit 16 bit> rechnen was ich im nachfolgenden codeschnipsel wohl versucht habe.
Nicht zwingend. Du kannst auch die 8-Bit Counter Überläufe zählen.
Inwieweit das Sinn ergibt, ist eine andere Frage.
Ok ich hab jetzt den fehler:
der interne rc-oszillator ist einfach so dermaßen besch*ssen, das ich
genausogut ein taktrelais dranbauen hätte können!
8MHz Quarz rein, gefused, und schon hab ich ein glasklares Bild!
**freu**