Forum: Mikrocontroller und Digitale Elektronik Programm geschwindigkeit: Bascom


von Ralf (Gast)


Lesenswert?

Hi,

mal ne Frage an alle Bascom Kenner:
Warum ist Bascom so langsam????

Hab ein Programm geschrieben, welches eigentlich auch recht gut
funktioniert - eiziges problem ist nur es reagiert so extrem langsam
......

Woran liegt das?

: Gesperrt durch Moderator
von harry (Gast)


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

von HansHans (Gast)


Lesenswert?

Bascom ist nicht so langsam.....
meist hängt es am Programmierer
Rennt dein AVR überhaupt mit der Frequenz
wo du denkst ?
vielleicht sind deine Fusses falsch gesetzt ...

Gruß HansHans

von Ralf (Gast)


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

von Erik (Gast)


Lesenswert?

Poste mal den Code... Können ja nicht hellsehen :-)

von Ralf (Gast)


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

von Tobi (Gast)


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

von Ralf (Gast)


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 .....

von Simon Küppers (Gast)


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

von HansHans (Gast)


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

von Ralf (Gast)


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 .....

von Simon Küppers (Gast)


Lesenswert?

Momentchen, wie wärs denn damit?


i = 0

Do

If Pind.0 = 0 Then Portb = 0

If Pind.0 = 1 Then
Portb.i = 1
i = i + 1
if i = 8 then i = 0
wait 1
End If

Loop

von Simon Küppers (Gast)


Lesenswert?

hm ups, hatte was vergessen:


i = 0

Do

If Pind.0 = 0 Then
Portb = 0
i = 0
End if

If Pind.0 = 1 Then
Portb.i = 1
i = i + 1
if i = 8 then i = 0
wait 1
End If

Loop

von HansHans (Gast)


Lesenswert?

-->und erst nach einiger zeit geht die led wieder aus .....

Logo, hast du ja so Programiert.....
das hat nix damit zu tun das Bascom „zu langsam“ ist

@Simon... Willst du Ralf ärgern ?

von Ralf (Gast)


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 .....

von Simon Küppers (Gast)


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? ;)

von Simon Küppers (Gast)


Lesenswert?

Jetzt versteh ich erstmal. 0 ist bei dir, wenn der Taster gedrückt ist
?

Hm, in der Hinsicht ist mein Programm wirklich Müll. Wie gesagt,
Interrupts helfen da abhilfe

von HansHans (Gast)


Lesenswert?

Ralf:
Wenn du Wait 1 einsetzt dann macht der AVR in der Sekunde nix,
 außer  Warten, soll heißen er schaltet auch keine LED aus

Simon:
Genau das meinte ich ....

Gute Nacht

von Ralf (Gast)


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 ..... :-(

von Ralf (Gast)


Lesenswert?

aha .... und wie schaffe ich´s sonst nen zeitintervall rein zu kriegen
aber das er am taster sofort reagiert ????
also außer mit interrupts - weil das tut versteh ich nicht ganz

von HansHans (Gast)


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

von Ralf (Gast)


Lesenswert?

hm .... ja was soll das eigentlich bewirken: For I = 0 To 100


und wozu Next I ? ich will ja nicht das es die leds durchschaltet ...
oder hab ich das jetzt falsch verstanden?

von HansHans (Gast)


Lesenswert?

Ohne Worte........

1. Bascom Hilfe: For I oder Next
2. 100 x 10ms sind 1000ms und das ist 1 Seckunde
3. Ich schlafe schon ..

von Thomas O. (Gast)


Lesenswert?

Hallo,

du musst einfach in jeder 2te Programmzeile die Taste überprüfen, damit
das gleich reagiert

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.