Forum: Mikrocontroller und Digitale Elektronik Grafisches Display und analoge Uhr


von Simon K. (simon) Benutzerseite


Lesenswert?

Hi Leute,

2 Fragen, wozu ich Info oder Links bräuchte (In der Suche war nicht so
das dabei, was ich brauche).

1. Wie könnte ich auf einem grafischen Display eine "analoge" Uhr
realisieren? Ich dachte da bisher an ein Bild im Speicher, wo der Kreis
drauf ist (Der braucht dann nicht mehr gezeichnet werden). Anschließend
muss ich irgndwie über eine Lookup-Table die Position der Linie auf dem
Display über die Sekunden/Stundenzahl herausfinden und anschließend dort
zeichnen. Würde mir gerne aber mal andere (einfachere?) Realisierungen
ansehen.

2. Ich bräuchte eine einfache Routine um eine Zahl durch 8 zu teilen,
und gleichzeitig den Rest, der überbleibt herauszukriegen. Das teilen
ansich ist ja durch ein paar Schiebebefehle zu erreichen, aber was ist
mit dem Rest? Kann ich den irgndwie durch shiften des Carrybits in ein
zweites Register berechnen?

Ich danke euch schonmal.

von Thorsten F. (thorsten)


Lesenswert?

zu 2.

in c oder asm?

gruß

von Karl H. (kbuchegg)


Lesenswert?

> Würde mir gerne aber mal andere (einfachere?) Realisierungen
> ansehen.

Wobei hast du Schwierigkeiten?
Eine Lookup Tabelle, die dir für Zahlen von 0 bis 59
die jeweiligen Endpunkte der Linie angibt, sollte doch
kein Problem sein.

> aber was ist mit dem Rest?

Den Rest kriegst du indem du mit 0x07 eine UND-Verknüpfung
machst. Geht aber nur deshalb, da 8 eine 2-er Potenz ist.

von Karl H. (kbuchegg)


Lesenswert?

Zur Uhr:
ansonsten ist das eine simple Anwendung von Trigonometrie
in einem rechtwinkeligen Dreieck.

  x = center.x + cos(alpha) * radius;
  y = center.y + sin(alpha) * radius;

Die Linie wird dann von center.x/center.y nach x/y gezogen.

Das ist das Grundprinzip von Radiusvektoren die von einem
Punkt aus in einem bestimmten Winkel weggehen.
An den Details muss man natürlich arbeiten:
* die Winkelfunktionen laufen gegen den Uhrzeiger
  -> irgendwo muss es einen Vorzeichenumkehr geben
* die Uhr hat ihren 'Nullpunkt' 'oben', wohingegen die
  Winkelfunktionen ihren 'Nullpunkt' 'rechts' haben.
  Einfach mal ein bischen tüfteln. Ist nicht so schwer zu
  lösen.
* Und dann brauchst du natürlich Winkelfunktionen.

von Ralf (Gast)


Lesenswert?

Du könntest wie bereits erwähnt mit LookUp-Tables für die Position der
Endpunkte der Linie arbeiten.
Wenn du den Bresenham-Algorithmus für Linien verwendest, brauchst du
nix mit Winkelfunktionen (ausser auf dem Papier für die Endpunkte).

Ralf

von Simon K. (simon) Benutzerseite


Lesenswert?

Hallo,

Das Projekt ist in Assembler schon halbfertig.

Ok, dann war meine Idee mit der Endpunkte-Tabelle doch nicht so
schlecht grüübel. Einen passenenden Algorithmus zum Linien zeichnen
werde ich schon finden (Karl Heinz Buchegger's oder Ralf's
Bresenham). Bei Karl Heinz's Algo bräuchte ich noch ne Cosinus/Sinus
Tabelle... Aber Bresenham sagt mir da mehr zu.



>>Den Rest kriegst du indem du mit 0x07 eine UND-Verknüpfung
machst. Geht aber nur deshalb, da 8 eine 2-er Potenz ist.

Danke. Jep, habe mir schon gedacht, dass es bei 2er Potenzen einfacher
ist. Aber mehr brauche ich halt nicht.

von Karl H. (kbuchegg)


Lesenswert?

> Linien zeichnen werde ich schon finden (Karl Heinz Buchegger's
> oder Ralf's Bresenham)

Du hast mich missverstanden:
Ich gehe genaso davon aus, dass du eine Linienzeichnen-
Funktion bereits zur Verfügung hast. Mit den sin/cos berechnest
du lediglich wo die Linie enden soll. Gewissermassen ersetzt
du damit die Tabelle durch eine Formel.

Dein neues erstes Ziel muss also lauten:
Linien zeichnen. Und dazu nimmt man nun mal sein Urzeiten
(also seit den 60-er Jahren :-) den 'Bresenham'

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.