Timer sind mein Problem

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Timer sind mein Problem

      Hallo,

      ich bin ja nicht unbedingt der Spezialist in Sachen Timer und also wäre ich euch dankbar, wenn ihr mir bei einem Problem behilflich sein könntet! Meine Bemühungen in Sachen Timer sind mal wieder an die Wand gefahren. Gut, ich versuche 2x2 LEDs unabhängig von einander blinken zu lassen, dazu benutze ich einen Tiny24 und Timer0 und Timer1. Bei Timer1 funktioniert alles so wie ich es möchte. Bei Timer0 oder warum auch immer bekomme ich beim Compilieren eine Fehlermeldung auf dem PC: Assignment error

      $regfile = "attiny24.dat"
      $crystal = 1000000 ' 1MHz int. Fuse Bits= High = 0xDF, Low = 0xE2
      $hwstack = 32
      $swstack = 10
      $framesize = 40
      Config Timer0 = Timer , Prescale = 8
      Enable Timer0
      On Timer0 Sec_2
      Config Timer1 = Timer , Prescale = 64
      Enable Timer1
      On Timer1 Sec_1
      Config Porta.7 = Output
      Led1 Alias Porta.7
      Config Porta.6 = Output
      Led2 Alias Porta.6
      Config Porta.5 = Output
      Led3 Alias Porta.5
      Config Porta.4 = Output
      Led4 Alias Porta.4
      Dim Mz_1 As Word
      Dim Mz_2 As Word
      Const T1_laden = 5 ' 65530
      Const T2_laden = 100 ' 156
      Enable Interrupts
      Do
      If Mz_1 >= 50 Then
      Led1 = 1
      Else
      Led1 = 0
      End If
      If Mz_1 <= 50 Then
      Led2 = 1
      Else
      Led2 = 0
      End If
      If Mz_2 >= 50 Then
      Led3 = 1
      Else
      Led3 = 0
      End If
      If Mz_2 <= 50 Then
      Led4 = 1
      Else
      Led4 = 0
      End If
      Waitms 10
      Loop
      End
      Sec_1:
      Timer1 = T1_laden
      Toggle Mz_1
      Return
      Sec_2:
      Timer0 = T2_laden ' Assignment error
      Toggle Mz_2
      Return


      Als ich aber eben das Prog auf mein Notebook geladen habe und versucht habe es zu compilieren, hat es ohne Fehler funktioniert! Nach dem Übertragen in den Tiny läuft es auch ohne Probleme. Woran kann das liegen? Auf meinem PC ist die neueste Demo Version drauf und auf dem Notebook eine etwas ältere!

      Gruß
      Klaus
    • Hallo Klaus,

      ich kann Dir zwar nicht sagen, weshalb Dein PC das Programm nicht richtig kompiliert - aber ein paar allgemeine Anmerkungen hätte ich doch:

      Timer 0 hat einen Prescaler von 8, das heißt, seine Taktfrequenz ist 1 MHz/8 = 125 kHz, und somit erhöht sich sein Wert alle 8µs. Wenn Du ihn in jeder ISR mit 100 vorlädst, braucht er jeweils 156 x 8µs bis zum nächsten Überlauf, also etwa 1,2 ms. Soll das denn so sein?

      Timer 1 ist da schon realistischer: Seine Taktfrequenz ist 1 MHz/64, also 15625 Hz, was einer Periodendauer von 64 µs entspricht. Wenn er mit 5 vorgeladen wird, läuft er also alle 65530 Schritte über, was in diesem Fall etwa 4,2 Sekunden sind. Dieses Blinken wäre also mit dem bloßen Auge erkennbar.

      Aber wieso hast Du Mz_1 und M2_2 als Words definiert, wenn Du sie ohnehin nur toggelst? Da diese Variablen nur zwischen &b0000000000000000 und &b1111111111111111 hin- und hergetoggelt werden, könntest Du doch auch ein Bit nehmen - das wäre einfacher!

      Und last but not least:

      Da Mz_1 und Mz_2 nie den Wert 50 annehmen sondern immer nur 0 oder 65535 (s.o.), ist diese Sequenz doppelt gemoppelt:

      Quellcode

      1. If Mz_1 >= 50 Then
      2. Led1 = 1
      3. Else
      4. Led1 = 0
      5. End If
      6. If Mz_1 <= 50 Then
      7. Led2 = 1
      8. Else
      9. Led2 = 0
      10. End If
      Da die zweite Abfrage (Mz_1 <= 50) genau das Gegenteil der ersten Abfrage (Mz_1 >= 50) ist, können die entsprechenden Befehle in der "Else"-Anweisung der jeweils anderen Abfrage untergebracht werden.

      Oder in Code ausgedrückt:


      Quellcode

      1. If Mz_1 >= 50 Then
      2. Led1 = 1
      3. Led2 = 0
      4. Else
      5. Led1 = 0
      6. Led2 = 1
      7. End If
      Oder verstehe ICH da irgendetwas falsch an Deinem Programm? :/
    • veryoldman schrieb:

      Nur auf dem großen Rechner kommt diese Fehlermeldung
      Lösch doch mal alle Dateien von dem Test-Programm außer der *.bas. Dann noch mal compillieren.
      Du kannst aber auch mal die "bascom-avr.xml" im Ordner "C:\Users\<DeinBenutzerName>\AppData\Roaming\MCS Electronics" löschen.
      Bascom neu starten und dann erneut probieren.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Du kannst mal noch zwei Dinge testen
      zum Einen

      BASCOM-Quellcode

      1. Sec_2:
      2. Timer0 = 100
      3. Toggle Mz_2
      4. Return
      mal die Zahl direkt hinschreiben und auch mal etwas variiren und
      zum Anderen mal die Zeile auskommentieren.
      Mich würde mal interessieren ob der Fehler dann immer noch da ist.

      Es gibt aber auch noch die Möglichkeit Bascom mal komplett neu zu installieren.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hallo djmsc,

      ich hab mir gestern abend noch die Bascom Demo runtergeladen und auch installiert! Resultat war, es erschienen nach dem Compilieren ebenfalls Fehlermeldungen. Auch bei bereits, eigentlich laufenden Progs, kamen Fehler! Deinen Vorschlag habe ich bereits probiert, das Ergebnis war das Selbige! Ich habe noch eine Demo Version, die bereits etwas älter ist, die werde ich Installieren! Wenn das auch nichts bringt, dann kann es doch nur noch an der neu Installation von Windows 10 liegen. Seitdem das geschehen ist, habe ich hier mit ziemlich eigenartigen Problemen zu kämpfen. Sachen die sehr zuverlässig liefen, machen nun Probleme. Wenn ich nicht schon so alt und krank wäre, würde ich wahrscheinlich auf Linux wechseln aber ich möchte jetzt nicht mehr Umsatteln.
      Gottseidank habe ich ja auch noch mein Notebook und darauf läuft alles Super! :)

      Klaus
    • Hallo djmsc,

      na. wie werd ich Bascom installiert haben, ganz normal und das hat eigentlichauch funktioniert! Nur jetzt nach der neu Installation compiliert Bascom das kleine Timer Progi ohne Probleme aber das MoBa Tacho Prog macht Schwierigkeiten. Da bekomm ich plötzlich dann die Fehlermeldung:

      Faktor = Faktor_n value doesn't fit into DWord (4444444444,44445)

      Kann man diese Probleme mit den Schreibrechten irgendwie beheben? ?(

      Klaus
    • veryoldman schrieb:

      Kann man diese Probleme mit den Schreibrechten irgendwie beheben?
      Ja klar. Zum Einen Bascom nicht in den Programme-Ordner installieren, also einen anderen Ordner auf C:\ oder so wählen und zum Anderen alles als Administrator installieren.
      Rechtsklick (Kontextmenü) auf der Setup.exe und dann "Als Administrator ausführen" auswählen.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • @veryoldman Das sieht aus, als wäre Faktor als DWORD dimensioniert und Faktor_n eine Konstante, die du irgendwie berechnet hast. Nur so kann der Compiler den Wert kennen.
      Damit du eine solche Berechnung einer ganzzahligen Variable zuweisen kannst, musst du einfach die INT() Funktion verwenden.
      Const Faktor_n = Int(40000000000/9) '->4444444444
      Allerdings ist selbst dieser Wert zu groß für ein DWORD.
    • Hey Leute,

      das Programm, bei dem diese Fehlermeldung kommt, das ist unter Modellbahn Tacho hier im Forum zu betrachten und von tschoeatsch geschrieben! Ich selber habe bis lang nichts daran geändert! Es gibt zwar eine zweite Version davon, bei dieser kommt aber eben genau dieselbe Fehlermeldung!

      Das worauf sich Faktor bezieht ist folgendes: Const Faktor_n = 1000000 * L / 3600 * 1000 * N :!:

      Auf meinem Notebook ist die gleiche Version des Bascom Compilers, da allerdings läuft alles ohne Fehler durch! Jetzt kommt ihr ?( !
      djmsc; Ich werd das probieren.

      Klaus

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von veryoldman ()