mikrocontroller.net

Forum: Compiler & IDEs LCD Userinterface


Autor: Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Dies ist mein erstes richtiges projekt mit einem µC und C als Sprache.
Es handelt sich um eine Stoppuhr mit Speicher für mehrere Runden/Werte 
und dabei habe ich auch kein Problem.
Eine Debounce Funktion habe ich mit Absicht noch nicht eingebaut.

Es können mehrere Betriebsmodi verwendet werden, welches Programm man 
nutzen möchte wird beim Start über ein Userinterface ausgewählt.
Ebenso können verschiedene Setup Werte über ein UI geändert werden.
Der "proof of concept" Code dafür ist fertig.

Ich habe nur das Gefühl das das ganze irgendwie suboptimal gelöst ist.
Es würde mich freuen wenn ich jemand mal den Codeschnipsel anschauen 
würd und mir sagen könnte ob es wirklich sehr krude gelöst ist.
Mir fällt leider keine andere Lösung ein.

Ich hab eine Zip mit dem Code und zwei Bildern der Ausgabe angehängt 
damit man sich vorstellen kann wie das ganze ausschaut.
Der Ablauf ist folgender:
Start -> UI zur Programmauswahl anzeigen -> Programm auswählen und 
starten.

Ich habe, um es besser lesbar zu machen alles aus dem Code rausgenommen 
was nichts damit zu tun hat und nach bestem Willen kommentiert.

Vielen Dank schon einmal!

Mfg,
Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter (Gast)

>Ich habe nur das Gefühl das das ganze irgendwie suboptimal gelöst ist.

Ja, so viele _delay_ms in einem Programm können nicht gut sein. Warum 
taktest du deinen uC nicht ei nfach mit 50 Hz Netzfrequenz?
Sowas macht man per Timer und Interrupt üer ein Flag.

>Es würde mich freuen wenn ich jemand mal den Codeschnipsel anschauen
>würd und mir sagen könnte ob es wirklich sehr krude gelöst ist.

Jain. es gibt wie immer Verbesserungsmöglichkeiten.

>    lcd_gotoxy(0,0);
>    lcd_puts("   Select Program");
>    lcd_gotoxy(1,1);
>    lcd_puts("FastDraw  Stopwatch");
>    lcd_gotoxy(1,2);
>    lcd_puts("IPSC      PPC");
>    lcd_gotoxy(1,3);
>    lcd_puts("Chrono    Duel");

Diese vielen konstanten String brauchen so doppelt Speicher, im Flash 
und im RAM. Mit der Funktion PSTR() un eine kleine Anpassung von 
lcd_puts() kann man die konstanten Strings in den Flash verschieben, 
siehe Doku der libc zum Themas sprintf().

>      lcd_gotoxy(0,1);
>      lcd_puts(">");
>      break;

Hier reicht es EINMAL ein lcd_puts(">"); NACH dem switch zu machen, 
spart Programmspeicher. Genauso in main.

  while (1) {

>    // wenn runter taste gedrückt auswahl erhöhen
>    if ( button_active(down) && active_programm < 5) {
>      active_programm++;
>      lcd_draw_ui(3);
>      _delay_ms(100);
>    }

MfG
Falk

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Falk:
> Ja, so viele _delay_ms in einem Programm können nicht gut sein. Warum
> taktest du deinen uC nicht ei nfach mit 50 Hz Netzfrequenz?
> Sowas macht man per Timer und Interrupt üer ein Flag.

Ja, ich weiss... theoretisch weiss ich auch wie das geht an der 
praktischen umsetzung hapert es nur noch.
Da ich gern ein repeat beim gedrückt halten und eine erkennung von zwei 
gleichzeitigen Tastendrücken als Metataste haben möchte.

> Falk:
> Hier reicht es EINMAL ein lcd_puts(">"); NACH dem switch zu machen,
> spart Programmspeicher. Genauso in main.

Oh, stimmt ja, das macht mehr Sinn, danke!

> Falk:
> Diese vielen konstanten String brauchen so doppelt Speicher, im Flash
> und im RAM. Mit der Funktion PSTR() un eine kleine Anpassung von
> lcd_puts() kann man die konstanten Strings in den Flash verschieben,
> siehe Doku der libc zum Themas sprintf().

Stimmt, daran hatte ich garnicht gedacht.
Danke für die Tips!

Mfg,
Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Peter (Gast)

>Da ich gern ein repeat beim gedrückt halten und eine erkennung von zwei
>gleichzeitigen Tastendrücken als Metataste haben möchte.

Lässt sich alles problemlos mit einem Timer machen.

MFG
Falk

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> @  Peter (Gast)
>
> > Da ich gern ein repeat beim gedrückt halten und eine erkennung von zwei
> > gleichzeitigen Tastendrücken als Metataste haben möchte.
>
> Lässt sich alles problemlos mit einem Timer machen.

Ja, ich weiss.
Ist nun auch eingebaut ;)

Mfg,
Peter

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.