PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD-Befehl zu schnell



Lord_Vader
04.10.2013, 00:29
Guten Tag,

arbeite gerade mit einem ATMega 32 und einem DogM 162. Weil ich eine große Samplingrate brauche fahre ich den AVR über dem vorgegebenen Takt.

Dieser funktioniert auch einwandfrei bei der frequenz. Jedoch kommt das DogM nicht hinterher, da die Pulse zu kurz sind.

Ich betreibe das DogM in 4-Bit mode:


'LCD Config
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.6
Config Lcd = 16x2 , Chipset = Dogm162v5

Initlcd

Display On , Nocursor

Cls

Gibt es eine möglichkeit die Pulslänge zu vergrößern?

MfG Vader

Thomas E.
04.10.2013, 18:31
arbeite gerade mit einem ATMega 32 und einem DogM 162. Weil ich eine große Samplingrate brauche fahre ich den AVR über dem vorgegebenen Takt.
Und wie ist der vorgegebene Takt?


Jedoch kommt das DogM nicht hinterher, da die Pulse zu kurz sind.
Wie äußert sich das "nicht hinterher kommen"? Welche Pulse sind gemeint?

Schaltplan? Ganzer Code?

Lord_Vader
04.10.2013, 20:11
Atmega laut datenblatt 16mhz.

mit pulsen meine ich clock enable und die vier datenbits...


sind standard bascom lxd befehle

Thomas E.
04.10.2013, 20:30
Atmega laut datenblatt 16mhz.

mit pulsen meine ich clock enable und die vier datenbits...


sind standard bascom lxd befehle
Die Bascom-Standard-Befehle errechnen aus der Taktfrequenz die notwendigen Pausen zwischen den von dir genannten "Pulsen". Ist die Taktfrequenz dem Compiler richtig mitgeteilt worden? Wenn nicht, dann kann dies zu diesem Verhalten führen.

Ich habe oben nicht umsonst um den ganzen Code gefragt. Also, bitte den ganzen Code und wenn möglich auch den Schaltplan hier einstellen, sonst müssen wir dir alles aus der Nase ziehen.

Lord_Vader
04.10.2013, 22:26
$regfile = "m32def.dat"
$crystal = 48000000
$baud = 1200


'Timer config
Config Timer0 = Timer , Prescale = 8
Config Timer1 = Timer , Prescale = 1024
Enable Timer0
Enable Timer1

On Timer0 Readout:

On Timer1 Counts:

'Variablen
Dim Ainput As Integer
Dim Inpvolt As Integer

Dim Tint(2) As Byte
Dim Rest As Byte

Dim Temp As Integer

Dim Cnt As Byte 'Counter for Loops and so on

Dim Tvolt As Integer
Dim Setvolt As Integer

Dim Times As Dword


'ADC Config
Config Adc = Free , Prescaler = 64 , Reference = Aref
Start Adc



Enable Interrupts

'Functions
Declare Sub Writedac(byval Volt As Integer)


'Buttons
Config Pind.0 = Input
Config Pind.1 = Input
Config Pind.2 = Input
Config Pind.3 = Input


Bu Alias Pind.0
Bl Alias Pind.1
Bd Alias Pind.2
Br Alias Pind.3

'DAC Ausgänge
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output

Cs Alias Portb.2
Sck Alias Portb.1
Sdi Alias Portb.0

Ldac Alias Portb.3

Config Spi = Soft , Dout = Sdi , Ss = Cs , Clock = Sck
Spiinit

Ldac = 0


'R / W Pin Von Lcd
Config Pinc.5 = Output
Rw Alias Pinc.5
Rw = 0

'LCD Config
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.6
Config Lcd = 16x2 , Chipset = Dogm162v5

Initlcd

Display On , Nocursor

Cls


Do



'Inpvolt=ainput-511

Setvolt = Ainput * 4


Call Writedac(setvolt)

Loop



'Timer0 interrupt
Readout:

Ainput = Getadc(0)

Timer0 = 142

Return

'TIMER1 interrupt

Counts:

Timer1 = 18661

Locate 1 , 1
Lcd "ATMega at 48MHz"

Incr Times

Locate 2 , 1
Lcd Str(times)

Return


Sub Writedac(byval Volt As Integer)


Tint(2) = Volt
Temp = Volt
Shift Temp , Right , 8

Tint(1) = Temp Or &B01110000

Spiout Tint(1) , 2


End Sub

Das ist der Code. Ich muss dazusagen auf dem Oszilloskop sieht man das die Pulse eigentlich zu kurz sind. Laut datenblatt des controllers 25ns welche wahrscheinlich schon unterschritten sind.
Die änderung von $crystal bewirkt nichts.

Habe leider keinen Schaltplan gemacht aber das Dog M 162 ist in 4-Bit 5V Modus wie im Datenblatt angegeben angeschlossen.

MfG Vader

Lord_Vader
05.10.2013, 10:09
Läuft mit 48Mhz...

Thomas E.
05.10.2013, 11:04
Was jetzt, 16 oder 48 Mhz? Der Mega32 ist für 48 Mhz nicht spezifiziert!
Welche Taktquelle verwendest du?

Lord_Vader
05.10.2013, 11:09
Er läuft mit 48Mhz über einen Quarzoszillator. Und das auch recht gut. Der DAC über SPI funktioniert einwandfrei und der ADC auch. Bei 36 Mhz funktioniert auch noch das LCD...

Thomas E.
05.10.2013, 11:17
Aktualisiere das Display mal etwas langsamer, vielleicht wirst du zu schnell - das mögen die KS0108 übrigens auch überhaupt nicht.

Lord_Vader
05.10.2013, 11:21
Was heisst etwas langsamer? Es aktualisiert sich etwa jede sekunde. Ausserdem ist es kein KS0108 es ist ein ST7036 controller im DOG M 162

Die eigentliche frage wird langsam wieder ausser acht gelassen. Gibt es eine möglichkeit die übertragungsrate zum lcd, das heisst quasi die Pulslänge zu ändern?

Thomas E.
05.10.2013, 11:37
Was heisst etwas langsamer? Es aktualisiert sich etwa jede sekunde. Ausserdem ist es kein KS0108 es ist ein ST7036 controller im DOG M 162
Liest du eigentlich meine Antworten durch?



Die eigentliche frage wird langsam wieder ausser acht gelassen. Gibt es eine möglichkeit die übertragungsrate zum lcd, das heisst quasi die Pulslänge zu ändern?
Ja, die gibt es. Schreibe deine eigene Lib für das Display.

Lord_Vader
05.10.2013, 11:40
Ok ne eigene Lib also. Ich werd mal schauen

for_ro
05.10.2013, 11:49
Suche mal auf der MCS Seite nach genus. Damit wird ein kleines Delay in die Ausführung eingebaut.
Mark hat da schon erklärt, wie man damit die Geschwindigkeit drosseln kann, wenn es dem LCD zu schnell geht.
In den Libs siehst du das als @genus(1) Befehl. Bevor du also eine neue Lib schreibst ist es vielleicht einfacher, dir eine Kopie der verwendeten Lib anzulegen und dann einen höheren Wert bei genus einzutragen.

Lord_Vader
05.10.2013, 12:16
Ok. Und wie sag ich dem compiler das er statt der (ich denke mal lcd4.lib) die kopierte lib nehmen soll?