Bascom BASCOM ; Erste Schritte zum Ausprobieren

Dim Value As Word und dann hab ich das

CodeBox BascomAVR
Ontimer1:
   Incr Value
   If Timer1 = 65535 Then
      Timer1 = 0
   End If
   ' -- kommt später
Return

Für die Ausgabe beide Werte (Zähler und Timerwert) multiplizieren*.
  • Aber wo kommt die Multiplikationsaufgabe hin
  • Was kann ich am Ende sehen
 
Aber diese Frequenzen (über 64 kHz) müssen irgendwo erzeugt werden, also kann ich sie jetzt noch nicht im Terminal erfassen.
 
Ohne Frequenzgenerator wird's schwieriger, aber nicht unmöglich.
Die AVR's haben ja interne Clock. Und die kann man auch ausgeben, auch in Teilfrequenzen.
 
Habe ich die Aufgabe jetzt gelöst #601 "ohne Timer1=0" ?
Wenn ja, woher kann ich wissen ob es richtig ist? Bascom zeigt zu mindestens keinen Fehler an.
Und wie geht es weiter. Ich würde gern bis Freitag (wegen Urlaub), wenn es möglich ist, noch ein Erfolgserlebnis sehen.
 
Also. Wie funktioniert ein Timer/Counter? (irrelevant welcher)
Timer und Counter sind prinzipiell das Selbe. Beides sind Zähler. Typischerweise wird ein Timer durch eine Clock (CPU oder externe Frequenz) erhöht um Zeitabstände zu generieren, ggf. auch PWM etc) getaktet. Ein Counter zählt einfach nur bestimmte Events. Was im Endeffekt ja fast das Selbe ist.

Angenommen du hast jetzt einen 2 Bit Counter (gibt es nicht, nur damit es kürzer ist).
Der Controller startet. Wert (binär) 00.
Dann kommt ein Event. Wert 01.
Und das Nächste. Wert = 10
Und das Nächste. Wert = 11
Aber was passiert jetzt? Der Counter ist mit seinen 2 Bits auf Maximum.
Nächstes Event. Wert: 00 - und: wenn gesetzt wird der Overflow Interrupt ausgelöst.

Du siehst, der Counter hat gar keine andere Wahl als überzulaufen, also sich wieder selbst zu nullen.
Hätte er mehr Bits zur Verfügung, dann würde er das 3. Bit setzen. Hat er aber nicht.

Daher brauchst du ihn im Overflow auch nicht zu resetten, das macht er von alleine.

Und, es sollte so gehen. Auch wenn die PWM Frequenz jetzt deutlich unter 64kHz liegt, du könntest ja auch mal die vom Flackercode messen ;)
Ich glaube das war irgendwas 250Hz?

Wie es weiter geht... Dein Frequenzzähler ist jetzt quasi fertig.
Man könnte ihn jetzt detaillierter machen für niedrigere Frequenzen, beispielsweise auf 0,1Hz Auflösung.
Oder man könnte ihn umschaltbar machen und als reinen Zähler (ohne Frequenz) nutzen. Das wäre für Frequenzen im extrem niedrigen Bereich sinnvoll.
Ich würde beides machen, aber als Option per Schalter (oder auf'm Breadboard Steckbrücke, wie auch immer).

Letzteres würde am schnellsten gehen. Musst du wissen.
Das müsstest du auch selbst hin bekommen.
 
Da fällt mir gerade ein, dass ich am Anfang mal gefragt hatte, etwas mit nem LCD zu machen. Die Frequenzen könnte man doch auch da anzeigen lassen.
Ich habe ein LCD 20x2, 24x4 und ein LCD I2C 20x4, mit dem ich allerdings Probleme bei Bascom habe. Das I2C finktioniert auf dem Arduino-Board aber nicht auf dem Steckbrett über Bascom. Das Problem würde ich gern mal gelöst bekommen.
Könntest Du mir da behilflich sein (eventuell auch @Dirk oder @LotadaC ).
 
Kann man auch. Abgesehen vom I2C Modell ist es auch recht einfach, da Bascom schon sämtliche Routinen dafür onboard hat.
Beispiele lassen sich zahllos im Netz finden, z.B. hier:
Es ist hierbei egal, welches Signal an welchem Pin liegt, kannst du frei selbst definieren. Vorsicht ist nur beim Vorwiederstand der Beleuchtung geboten. Der ändert sich, je nach Displayfarbe.
Nur die Beispiele auf dieser Seite sind recht irreführend.
Ist aber im Endeffekt nichts anderes als was wir schon haben. Config, ein Init Befehl, und dann statt Print LCD.
 
Anders herum.

Als Counter kann er, wenn er extern ausgelöst wird, nur maximal die CPU Frequenz /2,5 messen.
Der braucht ja etwas Zeit um die Flankenänderung zu erkennen und zu verarbeiten.

Als Timer kann er mit maximaler CPU Frequenz laufen, oder auch langsamer (Prescaler). Je nach Bitbreite von 0..255 bzw. 0..65535. Oder im Fall von CTC bis zu einem angegeben Wert innerhalb des Bereiches. So lassen sich halt Zeiten einstellen.

Wie auch immer, steht der Timer/Counter auf Maximum (255, 65535 oder CTC Wert) und bekommt noch einen Impuls, setzt er sich selber wieder auf 0 zurück.
 
Ich probiere gerade den Timer0, wie Timer2 zu konfigurieren. Leider klappt das mit dem

CodeBox BascomAVR
Config Timer2 = Ctc , Prescale = 256 , Clear_timer = 1
   Ocr2 = 249                           ' Setze Maximalwert für Timer 2 (CTC)
nicht so richtig. Im Datenblatt blicke ich nicht durch, finde einfach nichts mit CTC.
Ich wollte nur mal testen, ob ich zusätzlich eine zweite LED im Sekundentakt blinken lassen kann. Leider kann ich es nicht. :close_tema:
 
Liegt beides daran weil der Timer0 kein CTC unterstützt.
Das kann nur 1 und 2 (zumindest bei diesem Chip).

Du könntest aber natürlich in der ISR wo du Grün toggelst eben diese Zeile doppeln, dass du Gruen und Rot toggelst. Im Endeffekt würde es aufs Selbe hinaus kommen, die Timer würden ja auch gleichzeitig starten und mit dem gleichen Takt und Überlauf arbeiten (hätte 0 CTC). Könntest ja auch im Initbereich Rot 1x toggeln, dann würden sie abwechselnd blinken.

Oder du könntest das so machen wie du dachtest, aber auf genauen Sekundentakt wirst du nicht kommen.
 
Oder du könntest das so machen wie du dachtest, aber auf genauen Sekundentakt wirst du nicht kommen.
Genau das habe ich schon hin bekommen. Das der CTC Modus bei Timer0 nicht unterstützt wird ist doch schon ein Erfolg :yahoo:, denn dann konnte ich auch nichts finden. Irgendwie habe ich jetzt zwei blinkende LED's (Grün und Blau) und alle drei Timer laufen.
 
Gratuliere :)
Vielleicht schaffst du es ja vorm Urlaub noch mit dem LCD ;)
 
Ieks, und das vorm Urlaub. Gute Besserung!
 
Danke!
Ich habe nach Deiner Empfehlung Einfaches "Hallo Welt"-Beispiel getestet -> alles Gut.
Das "Hallo Welt"-Beispiel mit Zähler -> kam nur Mist raus und es hat nicht einmal, beim aufspielen des Programms, das Display gelöscht.
Kannst Du bitte mal nachschauen, was bei dem Code nicht stimmt.
Bei weiteren suchen ist mir aufgefallen, dass die Datenleitungen, einmal an Port.D mal an Poet.B und irgendwo mal an Port.C angeschlossen werden.
Wer soll da noch durchblicken und das alles mit dem LCD-Controller HD44780.
 
Die Datenleitungen kannst du da anschließen wo du möchtest. Ideal wäre natürlich wenn D4..D7 (wobei hier das D für Datenleitung, nicht für Portname steht) vom Display auch am IC "nebeneinander" liegen. Welcher Pin vom Display wo am Controller angeschlossen ist, das definierst du ja mit dem Config Befehl.
Etwas ordentlicher:


CodeBox BascomAVR
Config Lcdpin = Pin , _
   Db4 = Portd.4 , _
   Db5 = Portd.5 , _
   Db6 = Portd.6 , _
   Db7 = Portd.7 , _
   E = Portd.3 , _
   Rs = Portd.2
Config Lcd = 20 * 2
InitLcd ' LCD initialisieren
Cls ' LCD löschen (bin mir nicht sicher ob Init das nicht eh schon macht, zur Sicherheit)

Das gehört in dein Init Teil rein. Musst du nur noch anpassen, wo du dein LCD angeschlossen hast.

Jetzt ist das Display eigentlich fertig. Aber... Diese Displays fangen immer bei Cursor Position 1, 1 an, also oben links, und schreiben dann automatisch weiter.
Sprich, wenn du den Cursor nicht setzt, oder das Display nicht löschst, irgendwann ist das Display zu Ende.
Wobei überschreiben bedeutend besser ist als löschen.
Also zum Beschreiben (ex Print):


CodeBox BascomAVR
Print xyz ' ersetze xyz mit dem was du hast und funktionierte
Locate 1, 1
Lcd xyz


Lass dich nicht verwirren wegen der Schreibweise. Bei Basic kann man, sollte einem eine Zeile zu lang werden, diese mit Leerzeichen + Unterstrich abschließen, dann kann man in der nächsten Zeile weiter schreiben. Im Endeffekt wird es als eine Zeile gewertet. Wird gerne der Übersichtlichkeit verwendet.
 
Danke, das war's gewesen InitLCD.
Habe mein Grundgerüst für Frequenzen genutzt, ohne Taster und habe Timer1 bei (irgend einer Zahl) zurück setzen lassen.


CodeBox BascomAVR
[/B]
Print Timer1 ; " Hz"
   Locate 1 , 1
   Lcd Timer1 ; " Hz"
   'Timer1 zurücksetzen
   If Timer1 = 29 Then
      Timer1 = 0
      Cls
   End If
[B]
 
Zuletzt bearbeitet:
Warum die If?
Das Cls brauchst du nicht, du setzt ja den Cursor zurück auf die Position wo geschrieben werden soll, das Alte wird überschrieben.*

*) Nicht ganz, da nur das geschrieben wird was benötigt wird. Hattest du vorher 100 Hz, jetzt 0 Hz, wäre die Ausgabe "0 HzHz".
Soweit ich die Hilfe verstehe geht das in Bascom mit dem Format Befehl.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)