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
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?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.