bascom probem - schleife

  • hi leute.


    ich bin grade dabei mir einen uC zu programmieren der mehrere unterprogramme enthält wie fader ect und per RC5 stuerbar ist.


    funktionieren tut vieles schon soweit. RC5 und fader laufen gut. auch stroboskop klappt schon.


    nur jetzt wollt ich so eine Blop wie beim chromo programmieren wo eine farbe hoch dimmt und danach wieder runter dimmt.


    dies wollt ich über eine For schleife lösen. (erstmal nur das hochfahren)


    Code
    For A = 0 To Wert
    Led1 = A
    Waitms 10
    Next


    nun hab ich aber das problem, das solange er die farbe hochdimmt, kein RC5 signal angenommen wird. ist ja auch logisch.


    ich hab versucht die RC5 routine in ein sub programm auszulagern und dann bei jedem durchlaufen der schleife zu prüfen ob was gedrückt wurde.
    dabei kommt aber nur murks raus.


    Code
    For A = 0 To Wert
     Led1 = A
     Waitms 10
    
    
    sub_check
    
    
     Next



    was mach ich falsch. wie löst man das am geschicktesten ??


    danke für ratschläge
    mfg Flipp

  • Hi. Ich hatte genau das gleiche Prob. Habs aber gelöst... Hab bloß gerade keine Zeit...
    -> Ich hab nen Controller (4-Kanal) mit RC5 per Bascom programmiert...
    Ich meld mich heut Abend... Nicht dass du zu frustriert bist weil keiner schreibt...

  • Hab jetzt noch nix mit RC5 gemacht, aber den Empfang kann man doch sicherlich in einen Interrupt packen?
    Der unterbricht dann das laufende Fade/wasauchimmer-Programm und kümmert sich erstmal um den Empfang der Daten. Wenn das fertig ist, gehts an der gleichen Stelle im Programm weiter.


    Ist auch effizienter als das ständige Nachfragen ("Polling") ob was am RC5 ansteht...


    Stichwort "Externer Interrupt"

  • Hi,


    das geht ganz einfach. Den RC5 Empfang packst in einen Interrupt, am einfachsten missbrauchst da nen Timerinterrupt der schon für die PWM benutzt wird, das funktioniert gut.
    Und dann frägst vor jedem Wait in Deinen Blob ein Flag ab ob dieses Blog Programm überhaupt noch weiter fortgeführt werden soll......fertig. So habe ich das gelöst und das funktioniert sehr gut.


    Gruß, Benny.

  • Ich vermute das Problem liegt an waitms. Jenachdem wie es umgesetzt ist wird es einen Timer missbrauchen und solange einfach Noops machen wie der Timer die 10ms nicht überschritten hat. Damit wird dann auch deine RC5 nicht ausgeführt, wenn sie nicht in einem Interrupt steckt. Das Problem bei den Mikroprozessoren ist halt, dass die Logik nicht ist "in 10ms komm nochmal hierhin und mach dann weiter" sondern "du bleibst jetzt einfach stehen und stierst 10ms auf die Uhr". Er macht also effektiv in diesen 10ms GARNIX, es sei denn er wird durch einen Interrupt dabei unterbrochen auf die Uhr zu starren.

  • Die eleganteste Variante ist sicherlich ALLES in Subs zu packen und dann im Mainloop nur noch Flags abzufragen.
    Der große Vorteil ist hier, dass der µC alles stur durchrattert und so auch immer alles "gleichzeitig" passiert.
    Man muss dan aber etwas umdenken - und WAITMS ist dann völlig tabu.
    Ein Timer gibt den Takt an und wird per if then abgefragt - wenn es "Zeit" ist, dann ändert man die LEDs, wenn nicht, dann läuft alles weiter.
    Allerdings ergeben sich dadurch auch unterschiedliche Laufzeiten, ja nach Komplexität der Subs (also Programm 1 fadet nur doof, währen Programm 2 z.B. bei jedem Schritt noch mal was kompliziertes rechnen muss). Aber das fällt sicher nicht weiter auf, liegt ja alles im µs-Bereich.


    Den IR-Empfang könntest du zusätzlich noch in nen Interrupt packen, da weiß ich aber nicht, wie tollerant die Bascom-eigene Routine ist.
    Also z.B. einen PinChange-Interrupt wenn der TSOP anfängt zu senden und dann darin direkt den INT erstmal aus, dann Signal empfangen, abspeichern + Flag setzen für die Main und dann INT wieder an.


    Das kann knifflig sein, aber es geht.

  • danke für die antworten aber bekomm es leider immer noch nicht hin :(


    hab es versucht über ein interrupt zu lösen.
    das erste problem war, auf dem INT0 liegt der RC5 empfang.
    wenn ich die auswertung des signals direkt in eine schleife für den INT0 lege, klappt es nicht.
    dann hab ich irgendwo gelesen ich solle ein flag im interrupt setzten und dann im hauptprogramm die rc5 auswertung machen.
    ist ein flag einfach eine variable die gesetzt wird ??
    so hab ich es nämlich jetzt probiert. in der interrupt schleife wird var_int = 1 gesetzt und im hauptprogramm wird die rc5 routine nur ausgeführt wenn var_int = 1 ist.
    funktioniert ansich. allerdings auch nicht, wenn eine FOR schleife hochzählt, was ja eigentlich mein ziel war :(


    was mach ich falsch. jemand ideen ??
    oder benkley hast du nicht mal einen entscheidenden code schnipsel für mich ;)


    mfg

  • oder benkley hast du nicht mal einen entscheidenden code schnipsel für mich ;)

    Hi,


    naja, direkten Codeschnipsel nicht, aber nen Tip. Den Timerinterrupt der für die RC5 verwendet wird, kannst nicht verwenden, das steht aber auch in der Bascom-Hilfe. Nimm einen anderen Timerinterrupt, am besten einen von den Timern die Du für die PWM Erzeugung benutzt, dann sollte es gehen. Und vor Wait in Deinem Blob Ding setzt eine IF Abfrage nach der Art:
    Wenn Blob weiter ausgeführt werden soll dann wait......ansonsten weiter im Hauptprogramm....


    Gruß, Benny.

  • hm ok. so halb hab ichs verstanden.
    denke aber, ich würde das dann alles in sub programme legen, da man aus denen leicht mit End Sub wieder ins hauptprogramm kommt.
    um aus einer If bedingung wieder ins hauptmenü zu kommen weiß ich keinen befehl.


    das einzige was sich mir noch nicht erschließt ist, wie verbinde ich die ankunft eines rc5 signals mit dem timer1 oder timer2 ??
    über

    Code
    On Int0 Interrupt_schleife


    würde ich das rc5 signal mit dem Int0 verbinden, da es ja am PinD.2 anliegt, für den Int0 zuständig ist.



    aber ich kann ja jetzt nicht einfach

    Code
    On Timer1 Interrupt_schleife


    machen, da ja überhaupt kein rc5 signal am Timer1 anliegt.


    sorry für die noob fragen. arbeite noch nicht so lange mit bascom :love:
    danke für eure hilfe



    oder halt. was mir grade so auffällt. der timer interrupt wird dauernd ausgeführt oder ?
    also würde er dauern prüfen ob ein rc5 signal anliegt.
    kann das sein ?? :D
    also würde es so klappen wie im zweiten ansatz ?? (bin grad in der Uni und kann deshalb nicht selber testen)


    Mfg

  • Hi,


    schau mal in die Bascom Hilfe zum Thema RC5. Wenn das RC5 am Anfang vom Code eingebunden hast, dann läuft das von alleine. Dann kannst überall mit Get RC5 abfragen ob was angekommen ist.


    Aso, es gibt auch noch ein gutes Bascom Forum auf deutsch, da werden nur Bascom Sachen behandelt, das wäre für Dich vielleicht gar nicht so schlecht...


    Gruß, Benny.

  • ach mist mensch.
    theoretisch hat ich es jetzt hinbekommen. hab die rc5 abfrage in eine sub programm gepackt und dann in der schleife das sub programm abgefragt und falls sich was geändert hat, wird die schleife nicht fortgeführt.


    zu meinem entsetzten musste ich grade feststellen, das sich bennys fader modus mit der getrc5 funktion behindert.
    irgendwie verschluckt es sich dauernd.


    habe ich nur bennys fade funktion in meiner hauptfunktion, fadet er alle leds genau so wie er soll.


    sobald ich aber nur die zeile Getrc5(address , Command) in das hauptprogramm schreibe (also die kommentarstriche entferne), fängt er zwar an zu faden, aber nach 2-3 durchläufen springt er plötzlich auf eine farbe und fadet dann weiter. das springen tritt dann immer wieder auf. bisher konnt ich auch irgendwie kein muster dahinter erkennen.


    hapt ihr dafür eine erklärung ?
    ich bin völlig ratlos.


    was mir noch zusätzlich aufgefallen ist, ist das sobal getrc5 mit drinnen steht, dauert der fade-vorgang viel länger.
    das kann ich mir aber noch damit erklären, das die funktion halt eine gewisse zeit braucht um ausgeführt zu werden.
    aber dieses plötzliche farbspringen verstehe ich garnicht.


    hast du das auch gehabt benny ??