Forum: Mikrocontroller und Digitale Elektronik Laufschrift Problem beim Laufeffekt


von Benedikt K. (pille1990)


Lesenswert?

Hallo,

ich bin dabei eine Laufschrift zu Programmieren. Folgendes Problem habe 
ich dabei: Die Informationen werden Spaltenweise in den Variablen 
gespeichert. Dabei ist ein Byte immer eine Spalte.
Ich hab das Array „display_buffer“, darin wird der komplette Text 
gespeichert, der durchlaufen soll. In dem Array „display_write“ steht 
der Text, welcher aktuell auf dem Display ausgegeben wird. Dann muss 
sich ja der Text um eine Stelle verschieben, um den Laufeffekt zu 
bekommen. Nun ist das Problem wie ich die „display_write“_Variable mit 
neuen Werten aus der „display_buffer“ Variablen lade. Die for-Schleife 
gibt einmal die „display-write“ Variable aufs Display aus. Die 
Verschiebung macht man ja dann immer praktisch mit schnell 
aufeinanderfolgenden neuen Bildern. Die while-Schleife ist dafür 
gedacht. Aber wie ich die jetzt aufbaue, dazu hab ich noch keine Idee.

Die Frage ist jetzt wie bekomme ich den Schiebeeffekt hin?
Ich hoffe mir kann jemand dabei helfen.

Grüße
Pille

Quelltext:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#define ADRESS  PORTA  
4
#define DATA  PORTB  
5
#define PSEL  0    //wird künftig auf 2 gelegt
6
#define CTRL  PORTC
7
#define WRDP  1    //wird künftig auf 3 gelegt
8
#define COLUMNNUMBER  168        //spaltenanzahl
9
10
int main()
11
{
12
13
uint8_t display_buffer[512] = {};
14
15
uint8_t display_write[COLUMNNUMBER] = {};
16
17
18
DDRA = 0xff;
19
DDRB = 0xff;
20
DDRC = 0x03;
21
22
CTRL |= (1 << WRDP);
23
CTRL &= ~(1 << PSEL);
24
25
26
27
while(1)
28
{
29
  for(uint8_t j = 0; j < COLUMNNUMBER; j++)    //Schreibt ein komplettes Bild auf das Display
30
  {
31
  ADRESS = j;
32
  DATA = display_write[j];
33
34
  CTRL &= ~(1 << WRDP); 
35
  _delay_us(5);
36
  CTRL |= (1 << WRDP);
37
  _delay_us(5);
38
    
39
  }
40
  CTRL ^= (1 << PSEL);
41
42
}
43
}

von Sohn von Gosar (Gast)


Lesenswert?

nur zum besseren Verständnis: in den Arrays steht nicht der Text, 
sondern byteweise die Anteuerung der LedSpalten zu je 8 Leds. 4 oder 5 
Spalten ergeben dann jeweils einen Buchstaben usw. Soweit richtig?

von Benedikt K. (pille1990)


Lesenswert?

Richtig. Das hätt ich mir erwähnen müssen.
Übrigens: Die Hardware steht schon, ist von einem alten Projekt, das ich 
in der Ausbilung gemacht habe. Die Laufschrift läut mit nem Uralten 
80c537, da der aber nicht mehr lieferbar ist, will ich nun die 
Laufschrift auf nem AVR, warscheinlich atmega32 programmieren. Später 
soll Tastatureingabe, verschiedene Schrifteffekte usw dazukommen.

von Sohn von Gosar (Gast)


Lesenswert?

wie sieht denn die Hardware aus, werden die Spalten einfach per 
Schieberegister angesteuert?

von Sohn von Gosar (Gast)


Lesenswert?

sorry, war vorhin abgelenkt, hab mir den Code nochmals durchgelesen. 
Warum benutzt du 2 Arrays? Ist mit einem einfacher zu realisieren.
Zum Bleistift so:
[c]
  for(uint8_t j = 0; j < COLUMNNUMBER; j++)    //Schreibt ein komplettes 
Bild auf das Display
  {
  ADRESS = j;
  DATA = display_buffer[j+array_position];

[c]

nach jedem Schreibvorgang inkrementierst oder dekrementierst du 
array_position jeweils um 1. Natürlich kommen dann noch end of array 
Abrfragen dazu...

von Benedikt K. (pille1990)


Lesenswert?

das problem ist dann, dass der text nur maximal so lang sein kann wie 
die anzeige ist, oder verstehe ich da jetzt was falsch?

von Sohn von Gosar (Gast)


Lesenswert?

ok, du hast eine Anzeige mit 168 Spalten. Du hast ein Array mit momentan 
512 bytes.
1
DATA = display_buffer[j+array_position];

array_position ist zu Beginn =0. Beim ersten Beschreiben der Anzeige 
holst du so Byte 1 bis 168 aus dem Array und bildest es auf der Anzeige 
ab. Dann erhöhst du die Variable und liest so beim 2. Mal Byte 2 bis 169 
usw.

Wenn du die Variable stattdessen dekrementierst, veränderst du die 
Flussrichtung der Laufschrift. Wie erwähnt, die "end of array" bzw. 
"begin of array" Abfrage musst du noch einfügen.

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
Noch kein Account? Hier anmelden.