PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mega8 arbeitet sehr langsam (Gelöst)



m3Sa
26.06.2007, 19:51
Hallo,

ich habe ein kleines Problem bei meinem Code.
Und zwar arbeitet der Mega8 sehr langsam bei einer Frequenz von 4MHz.
Selbst bei einem Wait von "1" braucht er mehrere Sekunden um fortzufahren. wenn kein Wait eingefügt rennt er wie verrückt.
Der Code stellt Blinkende bzw. laufende LEDs dar.

zugleich könntet ihr mir veraten wie ich zu einer variable +1 rechne ;)

Danke im Voraus

Carsten



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

Enable Interrupts 'einschalten Der Interrupts
Enable Int0 'einschalten Von Interrupt Int0
Config Int0 = Low Level 'configuriere Int0 Auf Low Level
On Int0 Keypress 'springe zu Keypress


Dim Up As Bit
Dim Count As Byte
Dim Action As Byte

Config Portc = Input
Config Portb = Output
Portb = &B111111111


Do
If Action = 1 Then

If Up = 0 Then
Rotate Portb , Left
Wait 1
End If

If Up = 1 Then
Rotate Portb , Right
Wait 1
End If

If Count = 1 Then
Up = 0
End If

If Count = 0 Then
Up = 1
End If

End If

If Action = 2 Then
Rotate Portb , Left
Wait 1
End If

Loop


Keypress:
If Pinc.0 = 0 Then
Action = 1
Count = 1
Up = 0
Portb = &B1111110
Elseif Pinc.1 = 0 Then
Action = 2
Portb = &B1010101
Elseif Pinc.2 = 0 Then
Action = 3
End If

Return

Torsten_G
26.06.2007, 19:55
Hast Du die Fusebits denn auch auf 4Mhz eingestellt?

Nur die $Crystal-Direktive alleine reicht nicht!

Und 1 addieren: Entweder Variable=Variable+1 oder INCR Variable...

Grüße

Torsten

Pyro-Mike
26.06.2007, 19:58
zugleich könntet ihr mir veraten wie ich zu einer variable +1 rechne Zwinkern

Variable = Variable + 1

Lunarman
26.06.2007, 20:51
Wie TorstenG schon angedeutet hat - guck mal wieviele Sekunden. Wenns 4 sind, ist die Antwort einfach - BAscom nehmen, F4 drücken und losfusen. Okay, das war ein Scherz, da muss man höllisch aufpassen. Du musst den Crystal auf 4Mhz Internal OScillator oder so in der Art umstellen.

m3Sa
26.06.2007, 20:58
hmm komisch :-P
Zaehler=Zaehler+1
geht nun, vorher wollt des irgendwie net ;)

Joar Fulse hab ich jetzt auf 4MHz hoch.
Is zwar noch immer was langsam mit Wait 1 aber nagut reicht grad so.

Noch mal danke
Mfg Carsten

Lunarman
26.06.2007, 21:06
Die internen haben schonmal einige Ungenauigkeiten, aber nix, was so auffallen dürfte. Was heißt denn geht grad so? Das er mit wait 1 ne Sekudne wartet ist logggisch, oder?

m3Sa
26.06.2007, 21:28
Allerdings weiß ich das :),

aber wie ich des seh kann ma net kürzer warten lassen als 1ms

Carsten

Lunarman
26.06.2007, 21:54
Da musst du hingehen und dir selbst nen Timer basteln. doch, es geht! Wenn ich mir angucke, das bei einem tatsächlichem Quarz von 1Mhz und eingestelltem Quarz von 4Mhz die länge aller Wartezeiten 4 mal so groß ist, müsste man mit 4Mhz reality und 1 Mhz gecodet ein Viertel aller zeiten erreichen können. Das heißt, du kannst im Minimum 1/16 Millisekunde warten.

Lordcyber
26.06.2007, 21:56
Mach doch
waitms XXX
Dann ist das schneller.

m3Sa
26.06.2007, 22:20
OK, danke!

Werd ich mal probieren.

peterfido
26.06.2007, 22:20
Pause von 1 Mikrosekunde: waitus 1

Lunarman
27.06.2007, 10:37
Was im übrigen ziemlich genau ein Takt bei 1Mhz ist... \:D/

Lordcyber
27.06.2007, 12:20
Jetzt mal eine DUmme frage.
Ich dachte immer eine ms ist ein ms egal wie schnell ich den Arbeiten lasse??
Das sind doch Zeiten oder täusch ich mich da.

Lunarman
27.06.2007, 12:37
jaja, aber woher weiß der µC denn, was eine ms ist? er wartet einige Takte. Wieviele Takte, das errechnet BASCOM aus der bei $crystal angegeben frequenz. Zum Beispiel, wenn du schreibst 4Mhz, lässt Bascom nach einer wahrscheinlich etwas komplizierteren Berechnung so und so viele Takte warten. in dem Fall bei einer sekunde 4 Millionen Takte. Wenn aber der Quarz in Wirklichkeit 1Mhz hat, wartet Bascom ja trotzdem 4 Millionen Takte. Die schafft der Quarz aber gar nicht in einer Sekunde, sondern dafür braucht er vier Takte.

Lordcyber
27.06.2007, 12:48
Ah jetzt.
Also ist es wenn ich im Bascom Prgge egal was ich eingebe 10ms sind immer 10ms nur wie Der das in der Hex ändert kommt auf den Verwendeten crystal an.
Bsp:
Also wenn ich aus versehen 1Mhz im Code stehen habe da wait 8 also 8 Sekunden aber ein 8 eingebaut habe dann berechnet er das beim kodieren falsch und Und anstatt 8 Sekunden ist das dann nur 1 Sekunde oder??

Vitis
27.06.2007, 13:17
wait 1 ist aber "warte 1 SEKUNDE", nicht eine ms.
für 1 ms währs dann: waitms 1

m3Sa
27.06.2007, 17:15
Sehr interessant!

Jetzt weiß ich endlich wie Wait und Waitms wirklich funktioniert ;)

Vielen Dank an euch alle!

Carsten