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
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
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
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
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
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
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 .....
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
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
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 .....
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
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
-->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 ?
??? 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 .....
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? ;)
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
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
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 ..... :-(
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
-->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
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?
Ohne Worte........ 1. Bascom Hilfe: For I oder Next 2. 100 x 10ms sind 1000ms und das ist 1 Seckunde 3. Ich schlafe schon ..
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.