Hallo Leute, 2008 hatte ich zum Fest aus kleinen Glühlampen+Diode eine 8x8 Matrix im Fenster und habe "Frohe Weihnachten" als Laufschrift durchlaufen lassen. Hatte ich mitm Bitmap-tool für LCDs erstellt, waren 8x76 Pixel und dort über "Text einfügen" als Byte Array abgespeichert. Sah tatsächlich ganz nett aus, wenn man denn den Kopf gehoben und hingesehen hat. Die SW war recht simpel, ich hatte einfach per Schleife "8 mal LPM" die Sache aus dem Flash geholt und dargestellt, in R0 stand eine Spalte. Ein zweiter Zähler hat dann die Startadresse hochgezählt, um den Laufschrifteffekt zu erziehlen. Dieses Jahr habe ich vor, die Sache zu erweitern (9 Tage noch Zeit, hihi). Die Zeilen sind jetzt über 7442 + NFET gemultiplext (zeile0==oben, zeile9==unten) und die Spalten werden nun als 2x8Bit parallel (von oben quasi) angesteuert. Holzrahmen, LEDs, Platine, Treiber usw. ist alles fertig. Blöd ist, das die Architektur jetzt genau andersrum ist, also quer sozusagen. Wenn ich die gleiche Softwarestruktur verwenden würde und auf die rechte Hälfte meiner Matrix verzichte, liefe die Schrift senkrecht und ist 90° gedreht. Zwei Byte sind jetzt meine oberste Zeile im "Bild" und nicht mehr die zwei ersten linken Spalten. Ich weiss im Moment wirklich nicht, wie mir einen vitruellen Screenbuffer odersowas hinbasteln soll, um die Informationen wieder spiegel-und rotationsrichitg darstellen zu können. Evtl. kann mir nen Tipp geben, danke. Axelr .- .-.
hab nochn verwackeltes Bild auf meinem Handy gefunden :) edit: ...wie ich mir... \/ >Ich weiss im Moment wirklich nicht, wie mir einen vitruellen >Screenbuffer odersowas hinbasteln soll, um die Informationen wieder >spiegel-und rotationsrichitg darstellen zu können. Evtl. kann mir nen >Tipp geben, danke.
Frohes Fest und danke an alle, die mir mit Tipps geholfen haben, meinen virtuellen Grafikspeicher für die LED Anzeige aufzubereiten. Axelr .- .-.
ich komme nochmals auf euch drauf zu: Eigentlich ist es zu spät, sich dieses Jhr nochmals darum zu kümmern, das Display nun doch quer am Balkon zu besfestigen, wenn die Software - bedingt durch die Einfachheit dieser - die Schrift nur hochkant darstellen kann. ich habe mir nun ein kleines Bitmap erstellt."Frohe Weihnachten" Also ein breiter Buchstabe und versuche nun, diesen durch mein Anzeigefenster zu schieben. An der Schaltung hat sich nichts geändert, PORTA und PORTC stellen die linke und rechte Hälfte des Dispalys dar. PORTD hat den Zeilendecoder (7442) und taktet die Zeilen von oben nach unten. Ich habe jetzt nochmal von vorne begonnen und mit WINAVR ein wenig herum gespielt. ich habe mir 20x8Byte Schattenspeicher eingerichtet und wollte per "pgm_read_byte" die Daten aus dem Flash reintakten. ich bin zu blöd, Leute. Die eigentlich Routine steht und ich wäre in der Lage ein Standbild anzeigen zu lassen. Aber wenn ich dann "rechts" rüberrücke im Flash, läuft mein Bild nicht, sondern springt um ganze Buchstaben. Ich muss das irghentwie schieben, rollen sonsterwie ... Habe ich auch probiert, komme abewr nicht zurecht. Evtl. hat jemand Lust, sich mal den Quelltext im Anhang anzusehen. Dann kan ich das heute abend noch quer am Balkon aufhängen. Danke Axelr. Ich weiss, das es 10 minuten vor der Angst ist, aber ich lag die letzte Woche im Bett |:)
im Archiv gefunden... Wie gesagt: Display senkrecht aufgehangen und direkt mit "pgm_read_byte" und einem linearen Zähler auf die Ports gegeben. Waagerecht betrieben bekomm ich das nicht hin - hmm.
eiei 8(ACHT) MB! kann man das hinstutzen?
:
Bearbeitet durch Moderator
Ich habs noch mal bearbeitet Dass mpg kann mein Safari jedenfalls nicht
jetzt gehts halbwegs :| ich hatte aus einer Grafik-LCD Routine in Erinnerung, wie man das reinschieben muss ;) einen Teil vom aktuellen Byte und einen Teil des nächsten... Ganz hundertprozentig funktioniert das trotzdem noch nicht. Immer dann, wenn mit Null geschoben wird, steht die Anzeige scheinbar für einen Moment, aktualisiert sich trotzdem. Ich werde das noch mal genauer untersuchen. Es entstehen dann alasing-Effekte, die sich besonders dann bemerkbar machen, wenn Pixel dicht beieinander liegen. Ich habe das Display mal eben ins Fenster gestellt und mache nochmal ein (kurzes) Video. Bis gleich ;))
1 | int main(void) |
2 | { |
3 | PORTD= 10; // zeilendecoder 74LS42 auf Bereich ausserhalb gültiger Zeilenummer (LEDs dunkeltasten) |
4 | PORTA= 0; // linke Spalte alles aus |
5 | PORTC= 0; // rechte Spalte alles aus |
6 | DDRD= 255; |
7 | DDRA= 255; |
8 | DDRC= 255; |
9 | |
10 | // Timer 0 konfigurieren |
11 | TCCR0 = (1<<WGM01); // CTC Modus |
12 | TCCR0|= (1<<CS01)|(1<<CS00); // Prescaler 64 |
13 | // ((7372800/64)/1000) = 115.2 gibt ca. 1ms |
14 | OCR0 = 115; |
15 | |
16 | // Compare Interrupt erlauben |
17 | TIMSK |= (1<<OCIE0); |
18 | // Global Interrupts aktivieren |
19 | sei(); |
20 | |
21 | while(1) |
22 | { |
23 | |
24 | if (frame_rate>8) { |
25 | |
26 | if (next_step>144) { |
27 | next_step = 0; // 16x8 |
28 | aufnahmeword=0; |
29 | } |
30 | |
31 | for (tmp= 0;tmp<20;tmp+=2) { |
32 | shadow_ram[tmp] = pgm_read_byte(&data_xmas_sw_128x12_BMP[(tmp*8)+(next_step/8)])<<((next_step) &0x07) | pgm_read_byte(&data_xmas_sw_128x12_BMP[(tmp*8)+1+(next_step/8)])>>(7-((next_step) & 0x07)); |
33 | shadow_ram[tmp+1] = pgm_read_byte(&data_xmas_sw_128x12_BMP[(tmp*8)+1+(next_step/8)])<<((next_step) &0x07) | pgm_read_byte(&data_xmas_sw_128x12_BMP[(tmp*8)+2+(next_step/8)])>>(7-((next_step) & 0x07)); |
34 | } |
35 | |
36 | next_step++; |
37 | frame_rate = 0; |
38 | |
39 | } |
40 | |
41 | } |
42 | } |
43 | |
44 | /* |
45 | Der Compare Interrupt Handler |
46 | wird aufgerufen, wenn |
47 | TCNT0 = OCR0A = 115-1 |
48 | ist (115.2 Schritte), d.h. ca. alle 1 ms |
49 | */ |
50 | ISR (TIMER0_COMP_vect) |
51 | { |
52 | |
53 | |
54 | PORTD = 10; // Zeile dunkeltasten ( gültiger Bereich von 0-9 74LS42 Zeilendecoder) |
55 | if (zeile>9) { // bei Bildanfang (oben) für die Main() Bescheid geben |
56 | zeile=0; |
57 | for (indx=0;indx<19;indx++) |
58 | sr[indx]= shadow_ram[indx]; |
59 | i= 0; |
60 | frame_rate++; |
61 | } |
62 | else { |
63 | |
64 | PORTC =sr[i++]; //Jetzt die Werte den Ports zuweisen |
65 | PORTA =sr[i++]; |
66 | PORTD = zeile++; // Jeweilige Zeile aktivieren |
67 | |
68 | } |
69 | |
70 | } |
Hoffe, man kann erkennen, wie ich das mit dem Stocken und der Aktualisierung meine.
ok, kann man nicht wirklich - egal ich beende mal meinen Monolog noch :) Ich habe schon versucht, den Schattenspeicher vor jedem Bildaufbau im Interrupt in eine andere Variable um zu kopieren, weil ich denke, das hier evtl. Probleme auftreten, wenn der eine gerade den Speicherbereich beschreibt und die Anzeige eben diseen aktualisieren will. Allen noch ein paar ruhige Feiertage. Bis dann Axelr. Achso(edit). Wer Lust hat, kann gern Hinweise geben, wie man das Richtig(er) machen könnte, Danke
Obgleich sich das Interesse und die Anteilnahme in Grenzen hält, schicke ich noch eine geschnittene Endgültige Version ins Rennen. Frohes neues Jahr denn ... Axelr.
ich habe meinen eigenen Quelltext wiedergefunden, juhuu :) EDIT_ (4 oder 16) Graustufen werde ich jetzt mit aufnehmen und dann: lese ich meinen USB-Maussensor aus und stelle ein Teelicht davor. DAS sieht bestimmt gut aus...
Ja, so´n Forum ist ein guter Cloud-Speicher ;-) Frohes Fest!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.