mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Laufschrift Problem beim Laufeffekt


Autor: Benedikt K. (pille1990)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <util/delay.h>
#define ADRESS  PORTA  
#define DATA  PORTB  
#define PSEL  0    //wird künftig auf 2 gelegt
#define CTRL  PORTC
#define WRDP  1    //wird künftig auf 3 gelegt
#define COLUMNNUMBER  168        //spaltenanzahl

int main()
{

uint8_t display_buffer[512] = {};

uint8_t display_write[COLUMNNUMBER] = {};


DDRA = 0xff;
DDRB = 0xff;
DDRC = 0x03;

CTRL |= (1 << WRDP);
CTRL &= ~(1 << PSEL);



while(1)
{
  for(uint8_t j = 0; j < COLUMNNUMBER; j++)    //Schreibt ein komplettes Bild auf das Display
  {
  ADRESS = j;
  DATA = display_write[j];

  CTRL &= ~(1 << WRDP); 
  _delay_us(5);
  CTRL |= (1 << WRDP);
  _delay_us(5);
    
  }
  CTRL ^= (1 << PSEL);

}
}


Autor: Sohn von Gosar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Benedikt K. (pille1990)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sohn von Gosar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie sieht denn die Hardware aus, werden die Spalten einfach per 
Schieberegister angesteuert?

Autor: Sohn von Gosar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Benedikt K. (pille1990)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sohn von Gosar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, du hast eine Anzeige mit 168 Spalten. Du hast ein Array mit momentan 
512 bytes.
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.

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.