- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 7 von 7

Thema: Mikrocontroller ADuC812, uVision2, LCD ansteuern

  1. #1
    AM
    Gast

    Mikrocontroller ADuC812, uVision2, LCD ansteuern

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich programmiere seit 2 Tagen Mikrocontroller in C (uVision2) und habe daher noch nicht die Erfahrung! Derzeit versuche ich ein LCD (AV1624) anzusteuern. Ich hab das Datenblatt des Displays durchgearbeitet und danach meinen C-Code geschrieben (siehe unten!). Ich hab keine Ahnung was ich da falsch gemacht habe (kenn mich ja noch nicht besonders aus). Vielleicht kann mir jemand einen Tip geben.


    Mein LCD-File:


    #include <stdio.h>
    #include <ADUC812.H>
    #include "LCD.h"


    #define COMMAND 0x30
    // 0011 0000 (ist das Initialisierungskommando => aus Datenblatt)
    #define BUSY 0x80 // Bit 7 (von Port 0.7 ist gesetzt, wenn Display für den Empfang
    // weiterer Daten noch nicht bereit ist!)

    #define WAIT_WHILE_BUSY { while (ReadBusyFlag() & BUSY); }


    // LCD-Datenpins liegen auf Port 0 (0.0-0.7)
    //
    // E RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    //
    // P2.2 P2.1 P2.0 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0
    //

    // um die Portpins einzeln ansprechen zu können:
    sbit RS = I2CCON^1; // Register Select: RS = 1: Daten werden gesendet!
    // RS = 0: Kommando wird gesendet!
    sbit RW = I2CCON^0; // Read/Write-Pin: Read = 1 / Write = 0
    sbit Enable = I2CCON^2; // bei fallender Flanke (1->0) werden die Werte der Daten- und
    // Steuerleitungen vom Display eingelesen!


    void InitLCD() // Initialisierungsschleife aus Datenblatt
    {
    Wait(300);

    RS = 0;
    // dem Display anzeigen, dass ein Kommando gesendet werden soll
    RW = 0; // Schreiben!
    P0 = COMMAND;
    Enable = 1; // Daten werden bei fallender Flanke (1->0) übernommen
    Wait(500); // kurz warten
    Enable = 0;

    Wait(300);
    RS = 0; RW = 0;
    P0 = COMMAND;
    Enable = 1;
    Wait(300);
    // kurz warten
    Enable = 0;


    Wait(300); // 100 us warten

    RS = 0;
    RW = 0;
    P0 = COMMAND;
    Enable = 1;
    Wait(300);
    // kurz warten
    Enable = 0;

    Wait(300);
    // 100 us warten

    // Display-Mode festlegen
    RS = 0;
    RW = 0;
    P0 = 0x38;
    // 00111000
    Enable = 1; // |||
    Wait(300); // || \- Zeichenfont 5x7
    Enable = 0; // | \-- 2 Zeilen
    // \--- 8-Bit Mode
    Wait(300);// ab hier kann das Busy-Flag abgefragt werden!
    // Display einschalten
    RS = 0;
    RW = 0;
    P0 = 0x3c;
    // 00111100
    Enable = 1; // |||
    Wait(300); // || \- Zeichen unter dem Cursor blinkt nicht
    Enable = 0; // | \-- Cursor sichtbar
    // \--- Display einschalten
    Wait(300);//WAIT_WHILE_BUSY; // warten, bis Busy-Flag vom Displaycontroller gelöscht wird

    // Display löschen
    RS = 0;
    RW = 0;
    P0 = 0x01;
    // Kommando "Display löschen"
    Enable = 1;
    Wait(300); Enable = 0;

    Wait(300);
    //WAIT_WHILE_BUSY;

    // Entry Mode Set
    RS = 0;
    RW = 0;
    P0 = 0x06;
    // 00000110
    Enable = 1; // ||
    Wait(300); // | \- Displayinhalt nicht schieben
    Enable = 0; // \-- Adresspointer inkrementieren

    Wait(300);
    }


    unsigned char ReadBusyFlag()
    {
    RS = 0;
    RW = 1;
    Enable = 1;
    Wait(300);
    Enable = 0;

    return P0;
    }


    void WriteChar (unsigned char Data)
    {
    WAIT_WHILE_BUSY;

    RS = 1;
    // signalisieren, dass Daten gesendet werden
    RW = 0; // will schreiben

    P0 = Data; // Daten an den Port legen!

    Enable = 1;
    Wait(300);
    Enable = 0;
    Wait(300);
    }


    void WriteText (char *Data)
    {
    while (*Data)
    {
    WriteChar (*Data++);
    }
    }


    void Wait(unsigned int i)
    {
    for (; i >= 0; i--);
    }




    Mein"Main"-File:

    #include <stdio.h>
    #include <ADUC812.H>
    #include "LCD.h"


    void main (void)
    {
    InitLCD();

    WriteChar('T');

    while (1);
    // WriteText ("Test");
    }


    Ich hab die Files auch noch mal im Anhang beigefügt!


    Danke!!! \/ [/b]
    Angehängte Dateien Angehängte Dateien
    • Dateityp: c main_113.c (197 Bytes, 100x aufgerufen)
    • Dateityp: h lcd.h (181 Bytes, 126x aufgerufen)
    • Dateityp: c lcd.c (3,9 KB, 120x aufgerufen)

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    09.08.2004
    Alter
    46
    Beiträge
    77
    also ich hab zwar programmier kenntnisse von c aber ich weiss trotzdem nich obs stimmt
    also das was ich glaube ist, das du vergessen hast im main file die ganzen sachen wieder zurück zu bringen die bei return stehen

    du hast ja öfters return stehen und beim normalen windows c muss man diese wieder im main prog einfügen also das ist das was ich glaube es muss nich richtig sein aber versuchen kann mans
    ---

  3. #3
    Gast
    Danke, werd ich versuchen

  4. #4
    Gast
    Ich weiß zwar nicht was du meinst D.Stolarek, aber es hört sich falsch an was du erzählst

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    09.08.2004
    Alter
    46
    Beiträge
    77
    also beim normalen c ists so das man die werte wieder zurück ins prog bringen muss um diese dann weiter zu benutzen in z.b. anderen progs für andere funktionen

    er arbeitet halt nich mit pointern wenn er das täte könnte er auf den richtigen wert zeigen und den dann benutzen

    den man kann da nich dem hauptprog sagen mach mal das ohne das er irgendwelche werte hat

    also ist das meiner meinung nach richtig, denn der soll die sachen dann ja zum beispiel auf 1 setzen können

    ich glaube da ist aber auch nen anderer fehler den er hat einen wert bei p0 drin in unsigned char ReadBusyFlag() den er dann wieder zurück gibt

    und in dem prog darunter schreibt er in p0 nen anderen wert rein nämlich data

    also ich meine da ist was falsch
    ---

  6. #6
    AM
    Gast

    Neues Problem

    Das mit dem "return" war nicht das Problem!
    Ich habe in der wait-Funktion einen Fehler gefunden!

    for (; i > 0; i--); statt for (; i >= 0; i--);

    D.h. das Display meldet sich schon! Ich kann jetzt zwar Text auf dem
    LCD ausgeben, jedoch schreibt mir das Display den Text über den
    Displayrand hinaus und ich hab keine Ahnung wie ich das ändere.

    Ich möchte nämlich eine Funktion schreiben, bei der ich ein bestimmtes Zeichen im Display ansteuern und verändern kann (z. B.: Zeichen 3 in Zeile 2).


    Kann mir da jemand weiterhelfen?


    Danke!!!

  7. #7
    Gast
    Zitat Zitat von Anonymous
    Das mit dem "return" war nicht das Problem!
    Ich habe in der wait-Funktion einen Fehler gefunden!

    for (; i > 0; i--); statt for (; i >= 0; i--);

    D.h. das Display meldet sich schon! Ich kann jetzt zwar Text auf dem
    LCD ausgeben, jedoch schreibt mir das Display den Text über den
    Displayrand hinaus und ich hab keine Ahnung wie ich das ändere.

    Ich möchte nämlich eine Funktion schreiben, bei der ich ein bestimmtes Zeichen im Display ansteuern und verändern kann (z. B.: Zeichen 3 in Zeile 2).


    Kann mir da jemand weiterhelfen?


    Danke!!!
    kann jemand sagen, wo man uVision 2 kostengünstig herbekommt.

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests