PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD-Fehler?



x-ryder
16.11.2004, 21:19
Hi Leutz,

ich hab da mal son Problem ich hab nen Display 16*2.

Nun hab ich mal erst was mit Timern ausprobiert und dann zeigt das Display auf einmal nur noch "?" an.

Quelltext:

$regfile = "m128def.dat"
$crystal = 4000000

Dim Millisekunden As Long
Dim K As Long

Config Lcd = 16 * 2
Config Lcdpin = Pin , E = Portc.2 , Rs = Portc.0 , Db7 = Portc.7 , Db6 = Portc.6 , Db5 = Portc.5 , Db4 = Portc.4 'Belegung am MEGA8
Config Lcdbus = 4 '4-Bit Bus
Config Lcdmode = Port

Config Portc = Output

Portc.1 = 0

Cls
Const Reload = 192
Config Timer0 = Timer , Prescale = 64

On Timer0 Timer0_isr
Enable Interrupts
Enable Timer0

Do
Locate 1 , 1
Lcd Millisekunden
Print Millisekunden
Loop


Timer0_isr:
Load Timer0 , Reload
Incr Millisekunden
Return


Denn postet mal alle fröhlich :cheesy:

Martin

Bomberman
19.11.2004, 18:24
Hallo x-ryder,

ich programmiere fast nur in Assembler, daher kommt mir Dein Quelltext etwas "einfach" vor. Vielleicht führt Dein Compiler folgendes ja von alleine durch:
1) Du arbeiterst mit Timer0 und nutzt dessen Interrupt bei Überlauf. Das bedeutet, Du mußt eine Einsprungmarke für die ISR setzen - ich sehe da nur die ISR mit Marke als solche, aber irqs haben auf dem µC feste physikalische Einsprungadressen
2) Du scheinst einen Auto-Reload-Modus fahren zu wollen - Ich vermisse die Moduseinstellung

Mehr fällt mir vorerst nicht ein - wie schon gesagt, es kann sein, daß man auf diese Kleinigkeiten nur im Asseembler achten muß.

Viel Erfolg noch

Ciao

Patrick

19.11.2004, 22:07
Hallo Ciao,
x-ryder hat netterweise für mich diese Fragestellugn oben angeführt. Mit der Einsprungadresse könntest du recht haben. Ich denke das das Programm nicht an der korrekten Adresse im Speicher beginnt.
Wie kann ich die Anfangsadresse deklarieren bzw initialisieren ?

Danke

Martin

schmic20
20.11.2004, 21:57
Hallo x-ryder,

ich werde Dein Programm morgen mal auf mein Testboard legen und mal schaun was sich machen lässt.
Aber soviel vorab:
- Ich nehme an Du Programmierst so wie ich mit BASCOM. Bascom deklariert die Interrupteinsprungsadresse beim Kompilieren automatisch, d.h. Du brauchst Dich darum nicht zu kümmern.
- Ich vermisse eine Zuweisung an die Variable "Millisekunden". In der Interruptroutine inkrementierts Du die Variable. Wo ist aber der Startwert. Irgendwo vor dem "Do" müsste zumindest stehen: Millisekunden = 0.

Alles weitere, denke ich, müsste funktionieren. Ich habe kürzlich ein ahnliches Prüfprogramm für einen ATmega16 geschrieben. Und das hat wunderbar funktioniert. Allerdings habe ich mein Display über die Compiler-Optionen eingestellt und nicht im Programm integriert.
Ich kann im Moment auch mit der Zeile "Config Lcdmode = Port" nichts anfangen, weil Du das Display im Pin-Mode betreibst. Ich werde das aber morgen testen und Dir hier posten.

Viele Grüße
Michael

21.11.2004, 10:57
Hallo x-ryder,

ich habe Dein Programm auf mein Testboard geladen. Allerdings habe ich die Zeile mit dem Config LCDpin angepasst, weil mein Display auf PortB liegt.

Dein Programm funktioniert bei mir, obwohl die Variable Millisekunden nicht definiert vorbelegt ist. Ich würde Variablen immer vorbelegen, damit nicht irgendwann doch noch Schrott drinsteht.

Das mit dem "LCDmode = Port" habe ich nachgelesen in der BASCOM Hilfe, das ist richtig (man lernt nie aus)

Hat das Display bei Dir am Port C schon funktioniert und ist der Fehler erst jetzt aufgetreten?
Wenn ja:
- Display evtl. defekt?
- Leitung zum Display unterbrochen?
Wenn nein:
- Leitungen zum Display richtig angeschlossen?
- Der ATmega128 kann lt. Datenblatt den Port C nur dann als Output verwenden wenn er im Kompatibilitätsmode läuft (wenn ich das Datenblatt richtig verstehe). Ist der Kompatibilitätsmode abgeschaltet, hat Port C eine andere Funktion. Ist der Chip noch im Kompatibilitätsmode?

Ich habe leider keinen ATmega128 und habe es auf einem ATmega16 probiert. Sonst könnte ich Dir evtl. genaueres posten.
Ich hoffe Du hast wenigstens ein paar Denkanstösse bekommen.

Viele Grüße
Michael

schmic20
21.11.2004, 11:00
Verdammter Login,

die letzte Antwort habe ich natürlich geschrieben.
Wieso fliegt man eigentlich immer raus wenn man eine Antwort erstellt?
Schreibe ich zu langsam?

Viele Grüße
Michael

tobimc
21.11.2004, 11:09
Hi x-ryder!

Probier's mal mit lcd str(millisekunden).
ich weis jetzt nicht genau, was das Problem ist, aber so eine LCD-Anwendung (lcd "Hallo") verbraucht schon so siene Zeit.

Hat das Display einen R/W Eingang? -> LOW = SCHREIBEN

Überprüf' mal deine Kabel.

Du hast geschrieben:


Config Lcdpin = Pin , E = Portc.2 , Rs = Portc.0 , Db7 = Portc.7 , Db6 = Portc.6 , Db5 = Portc.5 , Db4 = Portc.4 'Belegung am MEGA8
aber

$regfile = "m128def.dat"

Wenn es ein MEGA8 ist, müsstest du schreiben:


$regfile = "m8def.dat"


Was macht das Hexapod :?:

Viele liebe Grüße,
Tobi

x-ryder
21.11.2004, 11:17
also

1. VIELEN DANK @ all die geschrieben haben und ich habs wieder hinbekommen es hing mit einem anderen programmteil zusammen die sich irgendwie nicht miteinander vereinbaren konnten wer jetzt welchen teil des speichers belegen darf.

2. beim hexapod läuft im moment zwar wenig aber es läuft, ich bin dabei ne spracherkennung zu installieren (voice direct 364 von www.sensoryinc.com)

Martin