PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Simulation dauert extrem lang! wiso?



hunni
05.10.2008, 17:30
Hallo,

ich habe ein kleines Basicprog geschrieben, wo er mir einfach nur über LCD den Timerwert anzeigen soll. Der Timer soll nicht geteilt werden, da es sich später um ganz genaue werte handeln soll. Ich wollte damit ein PWM Signal eines Fernsteuerungsempfängers auswerten. nun wollte ich das erstmal simulieren. doch er bleibt immer 2 Minuten bei $regfile"m8def.dat" stehen und geht erst dann weiter.

Wenn ich das auf den Atmel übertrage, dann will er garnich etwas anzeigen.
Wiso ist das so. Ich habe die schaltung schon vorher mit einem Testprogramm überprüft, da lief noch alles.

Kann mir jemand sagen was ich falsch mache?



$regfile "m8def.dat"
$crystal = 8000000

Config Timer1 = Timer , Prescale = 1
Config Int0 = Rising
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.1 , Rs = Portd.0
Enable Interrupts
Enable Int0
On Int0 Sprung:
Config Lcd = 16 * 2

Config Portd.1 = Output
Config Portd.7 = Output
Config Portd.6 = Output
Config Portd.5 = Output
Config Portd.4 = Output




Cls
Do

Start Timer1
Loop



Sprung:
Stop Timer1
Cls
Locate 1 , 1
Lcd Timer1
Timer1 = 0
Return


hunni

Jaecko
05.10.2008, 17:57
Dass der Bascom-Simulator langsam ist, ist normal. Die komplette Hardware eines AVR wird dort in Software nachgebildet, also jedes Register, jede Speicherstelle etc, was eben unheimlich viel Rechenzeit frisst.
Du kannst oben bei den Direktiven noch $SIM dazuschreiben, hier werden alle Timer und alle anderen zeitabhängigen Vorgänge "vereinfacht", d.h. die Wartezeit wird rausgeworfen.

Was an dem Programm nicht sonderlich gut gemacht ist, ist, dass der Timer in der Do:Loop ständig neu gestartet wird und in der ISR (Sprung) wieder gestoppt wird. Hat das nen bestimmten Grund?

Zumal wurde der Timer vorher auch nie aktiviert (ENABLE Timer1)... evtl ist das der Grund, dass nichts passiert.

hunni
05.10.2008, 18:03
ja das is einfach nur ein kleines programm um zu sehen, welchen wert der timer hat. ich weiss nich besonders toll gelöst, ich werd es etwas umschreiben. moment

hunni
05.10.2008, 18:05
cool geht ja viel schneller



$regfile "m8def.dat"
$crystal = 8000000
$sim
Config Timer1 = Timer , Prescale = 1
Config Int0 = Rising
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.1 , Rs = Portd.0
Enable Interrupts
Enable Int0
On Int0 Sprung:
Config Lcd = 16 * 2

Config Portd.1 = Output
Config Portd.7 = Output
Config Portd.6 = Output
Config Portd.5 = Output
Config Portd.4 = Output




Cls

Do
Loop



Sprung:
Lcd Timer1
Timer1 = 0
Return

Jaecko
05.10.2008, 18:05
Nachtrag: Der Timer kommt (wenn er kommt) in dem Programm auch zu schnell; d.h. er löst schneller aus, als der Controller die Daten zum Display schicken kann.

Im Grunde sieht das Programm schon besser aus, nur der "Enable Timer1" fehlt immer noch, da der Timer-interrupt damit erst eingeschaltet wird.

hunni
05.10.2008, 18:06
mhh, stimmt merk ich auch gerade, was kann man da machen, einfach ein
waitms 100 einfügen?

Jaecko
05.10.2008, 18:08
Naja ein Wait bringt auch nix, da der Interrupt trotzdem kommt.
Besser wär es, den Timer einfach auf einen sinnvollen Wert zu konfigurieren... Je nach dem wie oft was angezeigt werden soll so 1-2x pro Sekunde.

hunni
05.10.2008, 18:10
wie soll ich das denn machen? weis gerad nich wie du das meinst



$regfile "m8def.dat"
$crystal = 8000000
$sim
Config Timer1 = Timer , Prescale = 1
Config Int0 = Rising
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.1 , Rs = Portd.0
Enable Timer1
Enable Interrupts
Enable Int0
On Int0 Sprung:
Config Lcd = 16 * 2

Config Portd.1 = Output
Config Portd.7 = Output
Config Portd.6 = Output
Config Portd.5 = Output
Config Portd.4 = Output




Cls
Start Timer1
Do
Loop



Sprung:
Stop Timer1
Lcd Timer1
Start Timer1
Timer1 = 0
Return

Jaecko
05.10.2008, 18:12
Ahh... sorry, jetz seh ich ja erst, dass "Sprung" nicht durch den Timer ausgelöst wird sondern durch den Ext. Interrupt. Da ist dann natürlich kein Enable Timer1 nötig.

Da sollte dann was passieren, wenn der INT0 ne steigende Flanke kriegt.
Damit ist dann auch "egal", wie schnell der Timer läuft.

hunni
05.10.2008, 18:15
ja ich kriege trotzdem nur eine zahl auf den LCD Display

Jaecko
05.10.2008, 18:18
probier mal statt


LCD Timer1

das hier zu schreiben:


LCD STR(Timer1)


Kann evtl sein, dass er bei LCD den Timerwert als Ascii-Code interpretiert und dazu das Zeichen ausgibt. Mit dem STR wird der Wert so wie er ist als String ausgegeben. Wenn dass nicht geht, müsste der Umweg über


text = STR(Timer1)
LCD text

laufen. Wobei text natürlich ne Stringvariable mit ausreichender Länge sein muss. (Bascom tut sich oft schwer, mehrere Schritte auf einmal zu machen)

hunni
05.10.2008, 18:23
geht ebenfalls nich.
Ich habe es mit integer und word probiert. geht trotzdem nich



$regfile "m8def.dat"
$crystal = 7000000
$sim
Config Timer1 = Timer , Prescale = 1
Config Int0 = Rising
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.1 , Rs = Portd.0

Enable Interrupts
Enable Int0
On Int0 Sprung:
Config Lcd = 16 * 2

Config Portd.1 = Output
Config Portd.7 = Output
Config Portd.6 = Output
Config Portd.5 = Output
Config Portd.4 = Output

Dim Text As Word
Text = Timer1


Cls
Start Timer1
Do
Loop



Sprung:

LCD text

Timer1 = 0
Return

Jaecko
05.10.2008, 18:27
Naja die Zuweisung Text = Timer1 muss auch unmittelbar vor der Ausgabe erfolgen, sonst ändert der Wert sich nie.
Falls du das Programm direkt auf nem AVR testest und nicht im Simulator, muss die $sim wieder raus.

hunni
05.10.2008, 18:35
also jetzt weis ich gar nich mehr weiter!!

Zuerst ging es und dann kommen 5 zahlen, dann vier drei, zwei, eins null und dann gar nich mehr. ich weis nich was jetzt schon wieder los is.



$regfile "m8def.dat"
$crystal = 7000000
$sim
Config Timer1 = Timer , Prescale = 1
Config Int0 = Rising
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.1 , Rs = Portd.0

Enable Interrupts
Enable Int0
On Int0 Sprung:
Config Lcd = 16 * 2

Config Portd.1 = Output
Config Portd.7 = Output
Config Portd.6 = Output
Config Portd.5 = Output
Config Portd.4 = Output
Dim Text As Word




Cls
Start Timer1
Do
Loop



Sprung:
Cls
Text = Timer1
Lcd Text

Timer1 = 0

Return

hunni
05.10.2008, 18:44
komisch auf einmal läuft es wieder mit dem Grundprog. Vielen Dank für die tolle Hilfe


$regfile "m8def.dat"
$crystal = 7000000
$sim
Config Timer1 = Timer , Prescale = 1
Config Int0 = Rising
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.1 , Rs = Portd.0
Enable Timer1
Enable Interrupts
Enable Int0
On Int0 Sprung:
Config Lcd = 16 * 2

Config Portd.1 = Output
Config Portd.7 = Output
Config Portd.6 = Output
Config Portd.5 = Output
Config Portd.4 = Output





Start Timer1
Cls
Do
Loop



Sprung:
Cls


Lcd Timer1
Timer1 = 0

Return

Jaecko
05.10.2008, 18:47
Bewegen sich diese Zahlen im Bereich von 0 - 65535?
Ist Crystal wirklich 7MHz? Vorher warens noch 8.
Hinter "On Int0 Sprung:" ist der Doppelpunkt zu viel.

Hm also rein von der Programmlogik her sollt es doch so sein, dass das Display die Zeit zwischen 2 Tastendrücken anzeigt.
Und von der Programmierung her sollts auch gehen.

Wo jetzt noch das Problem liegen kann, wäre beim Taster/Schalter. Wie sieht denn die Beschaltung aus? Hab da den Verdacht, dass der Taster nicht entprellt ist. D.h. du drückst drauf, der Kontakt prellt und löst damit mehrere Interrupts hintereinander aus. Da müsste man das ganze also noch entprellen. Das könnte man per Hardware (ergibt aber ne Verzögerung) oder per Software lösen, was aber eine Art "Refraktärzeit" nach sich zieht, also einen Zeitraum nach einer Auslösung, wo keine erneute Auslösung erkannt wird.

Du kannst ja mal ein zweites Programm so bauen, dass "Sprung" eine Variable hochzählt und die Variable mal anzeigen lassen. Wenn du 1x auf den Taster drückst, dürfte die Variable auch nur um 1 hochzählen.

Jaecko
05.10.2008, 18:48
Na dann passts ja *g*
Also wenns doch noch Probleme gibt, einfach melden.

hunni
05.10.2008, 20:06
ich mache das nich mit n taster, sondern greife ein pwm signal vom empfänger eines Empfängers vom Modellbau ab. Deswegen brauche ich einen so hohen timer



$regfile "m8def.dat"
$crystal = 8000000


Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.1 , Rs = Portd.0
Config Lcd = 16 * 2
Config Lcdbus = 4

Config Timer1 = Timer , Prescale = 1

Config Int0 = Rising
Enable Interrupts
Enable Int0
On Int0 Sprung:

Config Portd.1 = Output
Config Portd.7 = Output
Config Portd.6 = Output
Config Portd.5 = Output
Config Portd.4 = Output





Start Timer1
Cls
Do
Loop



Sprung:
Cls


Lcd Timer1
Timer1 = 0

Return