-
Programm zu langsam?
Hallo,
Ich möchte einen Drehencoder auslesen, um klein anzufangen möchte ich ersteinmal alle die High/low zustände zählen.
ich hab ein Programm geschrieben, mit dem das auch theoretisch möglich ist. Aber leider nur wenn man der Encoder sehr langsam dreht... wenn man zu schnell dreht ändert sich der wert nicht mehr.
ich denke mein Programm ist villeicht etwas komisch aufgebaut, aber mir ist keine andere Lösung eingefallen (bin absoluter anfänger)
kann es daran leigen das der AVR mit dem zählen nicht mehr hinterher kommt?
Oder kann es auch am Schalttransistor liegen? BC337-40
Mfg Hübi
Code:
'Encoder test
'--------------------------------------------------------------
$regfile = "attiny2313.dat" 'ATTINY 2313
$crystal = 8000000 'TACKT 8Mhz
'******** Deklarationen ********
Dim Zaehlwert As Word
'******** Initialisierung ******** '
Ddrd = &B11100000
Portd = &B00000000
Zaehlwert = 1
'******** Hauptprogramm ********
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.0 , Rs = Portb.2 'LCD configurieren (datenleitung)
Dim A As Byte
Config Lcd = 16 * 2 ' 16*2 Zeilen
Main: 'hauptprogramm
Cls 'display löschen
Do
Locate 1 , 1 'cursor in Zeile 1, Reihe 1
Lcd Zaehlwert 'schreibe "Zählwert"
Cursor Off 'cursor off
If Pind.2 = 1 Then 'wenn taster gedrückt, dann
Zaehlwert = Zaehlwert + 1 'addiere 1 zu Zähltwert
Goto Unterprogramm 'gehe zu Unterprogramm
End If 'end if
Loop
'---------------------------------------------------------------------------------
Unterprogramm: 'Unterprogramm
Do
If Pind.2 = 0 Then 'wenn Taster losgelasse wird
Goto Main 'springe zurück ins Hauptprogramm
End If 'end if
Loop
-
Hallo Hübi
Wenn du das so Programmierst ist das wirklich alles zu langsam.
z.B in ein Lcd schreiben braucht viel Zeit , genau so wie ein Print befehl ...
sowas musst du mit einem Interrupt lösen sei es mit Interrupt an einem Pin z.B INT0 aber ich finde eine Timer Lösung besser.
Timerlösung = es wird immer in einen Timer gesprungen und dort die Tasterstellung abgefragt ....
Mfg Thomas
-
99 % Leistung wird am LCD verplempert.
und sehr unlogisch deine Goto.
Wenn LCD Ausgabe dann:
if Zaehlwert<>Zaehlwert_Alt then
Locate 1,1
LCD Zaehlwert
end if
dann kann man auch das LCD besser lesen.
Und da Du ja hochzahlst , muß das LCD nur beim Starten 1x Cls werden.
Gento
-
Die LCD-Abfrage braucht wahrscheinlich zu lang, probier doch mal, ob es geht, wenn du die nur alle 10 Änderungen oder so machst.
[EDIT]
OK, man sollte aktualisieren, bevor man antwortet ;)
[/EDIT]
-
Danke für eure Hilfe,
ich habe versucht möglichst alles richtig umzusetzten und hoffe ich habe es richtig gemacht/bzw. alles verstanden
wert <> wert then 'heißt doch wenn sich wert verändert, dann: oder?
leider klappt es immer noch nicht richtig... es ist sogar etwas schlechter geworden, aber vom Prinzip her funktioniert das Programm denk ich
Code:
'Encoder test
'--------------------------------------------------------------
$regfile = "attiny2313.dat" 'ATTINY 2313
$crystal = 8000000 'TACKT 8Mhz
'******** Deklarationen ********
Dim Zaehlwert As Word
'******** Initialisierung ******** '
Ddrd = &B11100000
Portd = &B00000000
Zaehlwert = 1
'******** Hauptprogramm ********
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.0 , Rs = Portb.2 'LCD configurieren (datenleitung)
Config Int0 = Falling 'INT0 = wenn taster gedrückt wurde
Enable Int0 ' erlaube INT0
Enable Interrupts ' erlaube Interrupts
On Int0 Unterprogramm ' gehe zu Unterprogramm
Dim A As Byte
Config Lcd = 16 * 2 ' 16*2 Zeilen
Cls 'display löschen
Main: 'hauptprogramm
Do
If Zaehlwert <> Zaehlwert Then 'wenn sich zählwert ändert
Locate 1 , 1 'cursor in Zeile 1, Reihe 1
Lcd Zaehlwert 'schreibe "Zählwert"
Cursor Off 'cursor off
End If 'end if
Loop
'---------------------------------------------------------------------------------
Unterprogramm: 'Unterprogramm
Do
Zaehlwert = Zaehlwert + 1 'addiere 1 zu Zähltwert
Return 'zurück zu Main
Loop
-
hallo hübi,
versuch mal folgenden code:
Code:
$regfile = "attiny2313.dat"
$crystal = 8000000
Dim Zaehlwert As Word
Dim Zaehlwert_old As Word
Zaehlwert_old = 65000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.0 , Rs = Portb.2
Initlcd
Cursor Off Noblink
Cls
Config Int0 = Falling
Enable Int0
On Int0 Isr_von_int0
Config Pind.2 = Input
Portd.2 = 1
Enable Interrupts
Locate 1 , 1
Lcd "Zaehlwert = "
Do
If Zaehlwert_old <> Zaehlwert Then
Locate 1 , 13
Lcd Zaehlwert
Zaehlwert_old = Zaehlwert
End If
Loop
End
Isr_von_int0:
Incr Zaehlwert
Return
wenn du fragen dazu hast, dann frag einfach ;-)
gruß
chris
-
Fünf Zeilen geändert und sollte jetzt gehen.
Gento
Code:
Dim Zaehlwert As Word
Dim Zaehlwert_alt AS Word
'******** Initialisierung ******** '
Ddrd = &B11100000
Portd = &B00000000
'******** Hauptprogramm ********
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.0 , Rs = Portb.2 'LCD configurieren (datenleitung)
Config Int0 = Falling 'INT0 = wenn taster gedrückt wurde
Enable Int0 ' erlaube INT0
Enable Interrupts ' erlaube Interrupts
On Int0 Unterprogramm ' gehe zu Unterprogramm
Dim A As Byte
Config Lcd = 16 * 2 ' 16*2 Zeilen
Cls 'display löschen
Zaehlwert=0
Zaehlwert_Alt=1000
Main: 'hauptprogramm
Do
If Zaehlwert <> Zaehlwert_Alt Then 'wenn sich zählwert ändert
Locate 1 , 1 'cursor in Zeile 1, Reihe 1
Lcd Zaehlwert 'schreibe "Zählwert"
Cursor Off 'cursor off
End If 'end if
Loop
'---------------------------------------------------------------------------------
Unterprogramm: 'Unterprogramm
Do
Zaehlwert_alt=Zaehlwert
Zaehlwert = Zaehlwert + 1 'addiere 1 zu Zähltwert
Return 'zurück zu Main
Loop
war einer scheller ;-)
-
Gebt doch bitte das "Cursor Off" aus der Schleife raus.
Was macht ein weiteres "Do" im Unterprogramm?
Grüße
Thomas
-
Und gleich nochmal ne Version! :)
Code:
'Encoder test
'--------------------------------------------------------------
$regfile = "attiny2313.dat" 'ATTINY 2313
$crystal = 8000000 'TACKT 8Mhz
'******** Deklarationen ********
Dim Zaehlwert As Integer
Dim Zaehlwert_alt As Integer
'******** Initialisierung ******** '
Ddrd = &B11100000
Portd = &B00000000
Zaehlwert = 1
'******** Hauptprogramm ********
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.0 , Rs = Portb.2 'LCD configurieren (datenleitung)
Config Int0 = Falling 'INT0 = wenn taster gedrückt wurde
Enable Int0 ' erlaube INT0
Enable Interrupts ' erlaube Interrupts
On Int0 Unterprogramm ' gehe zu Unterprogramm
Dim A As Byte
Config Lcd = 16 * 2 ' 16*2 Zeilen
Cls 'display löschen
Cursor Off
Do
If Zaehlwert > Zaehlwert_alt Then 'wenn sich zählwert ändert
Zaehlwert_alt = Zaehlwert
Locate 1 , 1 'cursor in Zeile 1, Reihe 1
Lcd Zaehlwert 'schreibe "Zählwert"
End If 'end if
Loop
'---------------------------------------------------------------------------------
Unterprogramm: 'Unterprogramm
Zaehlwert = Zaehlwert + 1 'addiere 1 zu Zähltwert
Return 'zurück zu Main
-
Jetzt nur noch der Schönheit wegen ein "End" nach "Return" einfügen, dann passts perfekt! ;)
Grüße
Thomas