Programm geschwindigkeit: Bascom

Gast #136423
Lesenswert?

hi,
wahrscheinlich liegt's an dir. bascom ist garnicht so langsam, es mag
sein, dass der compilierte code nicht so optimiert ist wie wenn du's
gleich in assembler schreibst, aber das, was in den prozessor geladen
wird ist ordinärer maschinencode. anders als in manch anderen systemen
wie basic-tiger oder c-control in denen ein interpreter werkelt,
gelangt in einen avr alles andere als basic-quellcode.
ergo dürfte es am programm selbst liegen, lass halt mal die ganzen
wait's weg, dann wird's schon hurtiger werden.
gruss und fröhliches proggen noch, harry
Gast #136425
Lesenswert?

also hab nen 8535 und nen szillator mit 4Mhz
die Funktion soll wie folgt reagieren:

Wenn ich den Taster nicht betätigt ist (also auf Low) soll kein
einziges LED leuchten.
Wenn ich jetzt den Taster gedrückt HALTE dann soll ein LED nach dem
anderen angehen ...... wenn er losgelassen wird sollen natürlich wieder
alle sofort ausgehen unabhängig davon wieviele LED gerade leuchten.

hatte schon versucht das ganze mit entprellung (auch entprellzeit wurde
geändert) und ohne zu versuchen hat aber auch nicht funktioniert.
wie gesagt die schaltung funktioniert ja auch nur reagiert sie extrem
langsam.
D.H. jetzt bin ich am taster das erste led geht an ich lasse los, und
noch bevor er wieder abschaltet, schafft ers noch das zweite led
einzuschalten (und es ist aber immer ne sek zwischen den
"einschalt"vorgängen .......

weiß jedenfalls nicht was so falsch am programm ist
Gast #136427
Lesenswert?

nagut hier mal der code. muss nur eines noch dazu sagen
habe die ports auf high gesetzt, weil ichs so wie im forum beschrieben
damals zusammengelötet habe, und da ist eben jetzt mein 1 signal (also
"high") auf "0"! und mein "low" signal ist "1"

$regfile = "8535def.dat"
$crystal = 4000000

Config Portb = Output
Config Portd = Input

Portd = &B11111111
Portb = &B11111111

Do

If Pind.0 = 1 Then
Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
End If

If Pind.0 = 0 Then
Portb.0 = 0
Wait 1
Portb.1 = 0
Wait 1
Portb.2 = 0
End If

Loop
Gast #136428
Lesenswert?

der schafft sogar alle 3 leds noch anzumachen aber die letze so kurz,
dass du es nicht mehr siehst. du prüfst nur am anfang einer blink
sequenz einmal den taster danach läuft die IMMER komplett durch. wenn
du das nicht mit ints machen willst (nch nicht kannst) füge vor jedem
portb.x = 0 eine if abfrage ein und schon klappts
Gast #136429
Lesenswert?

hast du so gemeint:

Do

If Pind.0 = 1 Then
Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
End If


If Pind.0 = 0 Then Portb.0 = 0

If Pind.0 = 0 Then
Wait 1
Portb.1 = 0
End If

If Pind.0 = 0 Then
Wait 2
Portb.2 = 0
End If

Loop

funktioniert auch nicht so schnell wie ichs mir erhoffe - möchte ja das
sofort aus ist sobald ich loslasse ....

was meinst du mit ints? - erklär mir das mal näher bitte -> fange ja
erst an mich mit bascom zu beschäftigen - lauflichter und normale
schaltungen hatte ich bis jetzt auch recht gut geschafft. mit dim x as
byte zb .....
Gast #136430
Lesenswert?

Hi ;)


"....(und es ist aber immer ne sek zwischen den
"einschalt"vorgängen .........."

und

"If Pind.0 = 0 Then
Wait 1
Portb.1 = 0
End If"

Was passt da nicht? :D

Schon klar, dass er eine Sekunde zwischen den Vorgängen wartet, wenn du
es auch so programmierst
Gast #136431
Lesenswert?

Das ist nicht die Lösung !
aber es baut auf deinen Code auf und sollte dir
neue Fehler in deinem Codeansatz aufzeigen......
(wenn ich dein Wunschverhalten richtig verstanden habe)
$regfile = "8535def.dat"
$crystal = 4000000

Config Portb = Output
Config Portd = Input

Portd = &B11111111
Portb = &B11111111

Dim I As Byte

Do

If Pind.0 = 0 Then
Portb.0 = 0
Gosub  Pause
Portb.1 = 0
Gosub Pause
Portb.2 = 0
Gosub Pause
End If

Loop

Pause:
For I = 0 To 100
 If Pind.0 = 1 Then
Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
End If
Waitms 10
Next I
Return

End
Gast #136432
Lesenswert?

naja ich "will" wenn ich den taster loslasse, dass sofort alles aus
ist ohne verzögerung - das tut es aber nicht sagen wir ich bin am
taster, das erste led geht an, ich gehe runter vom taster und erst nach
einiger zeit geht die led wieder aus .....
Gast #136436
Lesenswert?

??? wieso hab ich so programmiert? ich glaub zumindest g das ichs
programmiert hab das die nächste led nach ner sek angeht.
aber ich hab ja auch geproggt das alles aus ist wenn der taster
nichtmehr betätigt ist - aber ohne verzögerung .....
Gast #136437
Lesenswert?

Wieso ? Wo ist das Problem..

Hm. du meinst, wenn ich jetz Pind.1 drücke und dann loslasse, dauert es
immernoch eine Sekunde ? Hm, könnte wirklich passieren. Würde da auch
eher zu Interrupts greifen oder hab ich wirklich was überlesen? ;)
Gast #136440
Lesenswert?

ja genau mein "high" signal ist "0" also wenn gedrückt ist - ist
durch die verlötung passiert - muss selber immer bissi umdenken .....

g naja interrupts g wie gesagt bin "blutiger" anfänger
und im tut kappier ich auch nicht ganz was jetzt mit den interrupts
gemacht werden kann ..... :-(
Gast #136442
Lesenswert?

-->also außer mit interrupts


z.B. Nicht eine Lange sonder viele kurze Pausen
s.Oben

Pause:
For I = 0 To 100
 If Pind.0 = 1 Then
Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
End If
Waitms 10
Next I
Return
Beitrag #5975019 wurde von einem Moderator gelöscht.
Beitrag #5975021 wurde von einem Moderator gelöscht.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.