Bascom BASCOM ; Erste Schritte zum Ausprobieren

Na du solltest zumindest per UART pro Sekunde Werte bekommen.
 
Ich habe in#553 ab Zeile 63 so geändert
Tick_1s:
Toggle Gruen
Print Timer1 ; " Hz"
Return
Ontimer1:
Incr Timer1
If Key = 0 Then
Timer1 = Timer1 + 1
End If
Return
Init Zeile 10 und 11 unverändert, da es meiner Meinung richtig ist.
Terminal gibt im Sekundentakt (egal bei wie vielen Tastendrücken) 0 Hz aus.
 
So war es gemeint.
Ontimer1 ist noch unnötig, aber lass mal drin. Eigentlich sollte es so funktionieren.

Vielleicht fehlt noch was im Init. Irgendeiner der Bascom Experten? @LotadaC @Dirk @dino03
Problem kurz: Timer1 extern erhöhen (ICP1).
 
Moment... Probier statt Print Timer1 mal Print Capture1
 
Print Capture1 tut's auch nicht.
Ontimer1 ist noch unnötig, aber lass mal drin. Eigentlich sollte es so funktionieren.
Ohne Ontimer1: geht gar nichts, da dieses doch ein Unterprogramm oder so etwas ist.

CodeBox BascomAVR
Ontimer1:
   Incr Timer1
   If Key = 0 Then
      Timer1 = Timer1 + 1
   End If
Return
Jetzt ab Zeile 66
 
Vergiss die ISR vom Timer1, die wird eh nicht aufgerufen ;)
Er läuft ja als Counter. Du müsstest verdammt oft tippen damit da was passiert. So ungefähr 65k mal.

Aber warum er jetzt nicht zählt ist mir schleierhaft. Außer der Pegel am Pin ändert sich nicht, das hast du aber bestimmt getestet.
 
Hab keine Zeit, das alles durchzugehen...
Ihr versucht den Timer als Counter zu betreiben? (Auch im Config Timer=Counter oder so?)
Dann inkrementiert (bzw taktet) der Timer bei einer Flanke am Tn-Bein (n=Nummer der Timers - T1 für Timer1 wäre also D5 beim Mega8)
ICP1 hingegen löst eine Kopie des Zählerstandes in das Input-Capture Register aus (mein Beitrag mit der Rundenzeit irgendwo oben).

Natürlich könnte man auch von hinten durch die Brust ins Auge den Input Capture Interrupt (oder irgendeinen anderen IRQ) nutzen, und in der entsprechenden ISR den Zählerstand selbst inkrementieren - dann kann man aber auch gleich 'n Softwaretimer/counter basteln...
 
  • Like
Reaktionen: TommyB
Argh, da hab ich das Datenblatt wohl etwas zu schnell gelesen. Dann wäre es also Pin T1 (aka PD5).
Musst du eben umstöpseln.
Sorry und Danke @LotadaC :)
 
  • Die ISR vn Timer1 ist jetzt ganz raus
  • Der Taster (Alias Key in Zeile19) wird jetzt nur noch als Pind.5 aufgeführt
Keine Änderung
 
Software und Hardware geändert?
Sonst muss ich das selber mal aufbauen... Wird denn aber ein Mega aus der 48/88/168 Serie sein, da sind die Pins ggf. anders. Denk also dran dass meine DDRx, PORTx und PINx anders sind. Einen 8er habe ich nicht hier.
 
Ich verstehe diesen Beschaltungsplan nicht. Besser gesagt, der Aref ist nicht beschalten -> Fehler oder ?
AREF-wie beschalten.jpg
 
Ich habe es jetzt erst mal etwas aufgeräumt und kommentiert.
Den Countdown hab ich raus gelöscht, da hier nicht benötigt.


CodeBox BascomAVR
' Compiler konfiguration
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 19200

' Globale Variablen
Dim Zeichen As Byte
Dim Count As Byte

' Aliase
Rot Alias Portd.7
Gruen Alias Portc.3
Blau Alias Portd.6
Key Alias Pinb.0


' Initialisiere Hardware
Init:

   ' Hardware konfiguration
   Ddrb  = &B1111_1110
   Portb = &B0000_0001
   Ddrc  = &B__11_1111
   Portc = &B__00_0000
   Ddrd  = &B1111_0111
   Portd = &B0000_1000

   ' Konfiguration UART
   On Urxc Onuartrx
   Enable Urxc

   ' Konfiguration Timer 2 (CTC, 8MHz/256/249 = 8ms)
   Config Timer2 = Ctc , Prescale = 256 , Clear_timer = 1
   Ocr2 = 249                     ' Setze Maximalwert für Timer 2 (CTC)
   On Oc2 Onoc2              ' Setze ISR für Timer 2 Overflow Compare
   Enable Oc2                     ' Aktiviere Timer 2 Overflow Compare Int.

   ' Konfiguration Timer 1 (Counter)
   Config Timer1 = Counter , Edge = Rising
   On Timer1 Ontimer1             ' Setze ISR für Timer 1 Overflow
   Enable Timer1                  ' Aktiviere Timer 1 Overflow Interrupt

   ' Konfiguration Watchdog
   Config Watchdog = 2048         ' Setze Watchdog Timeout auf ~2sec
   Start Watchdog                 ' Aktiviere den Wachhund

   ' On Tick_1s ' -- ääähm... wtf???

   ' Aktiviere Interrupts (global)
   Enable Interrupts

' Goto Main ' -- nicht benötigt, Routine kommt eh als nächstes


' Haupt Anwendungsschleife
Main:

   ' Den Wachhund zurücksetzen
   Reset Watchdog

   ' Einschlafen (bis zum nächsten Interrupt)
   Config Powermode = Idle

Goto Main ' und zurück


' ISR wenn ein Byte empfangen wurde
Onuartrx:

   'If Ischarwaiting() = 1 Then ' -- nicht benötigt. Klar dass ein Zeichen da ist wenn der Interrupt gefeuert wird

   ' Das Byte abholen (Zeichen)
   Zeichen = Inkey()

   ' Eingabe auswerten
   If Zeichen = "1" Then
      Rot = 1
   Elseif Zeichen = "0" Then
      Rot = 0
   End If

   'End If

Return

' ISR wenn Timer 2 compare event eintritt (alle 8ms, bei aktueller Konfiguration)
Isr_oc2:

   ' Erhohe internen Zähler
   Incr Count

   ' Wenn Zähler einen gewissen Wert erreicht hat, auf 0 setzen und abzweigen
   If Count = 125 Then
      Count = 0
      Gosub Tick_1s
   End If

Return

' ISR wenn Timer 1 überläuft
Ontimer1:
   ' -- kommt später
Return


' Diese Routine wird jede Sekunde ausgeführt
Tick_1s:

   ' Den aktuellen Wert vom Timer1 ausgeben
   Print Timer1 ; " Hz"

   ' Die Grüne LED (Debug) toggeln
   Toggle Gruen

Return

Leider ist der Bascom Simulator ... Es besteht deutliches Optimierungspotential... und mein USB zu TTL Wandler ist scheinbar defekt.

Zum Schaltplan: ARef muss nicht angeschlossen werden wenn du den AD Wandler nicht nutzt. Sonst ist es zumindest stark angeraten den mindestens mit einem Kondensator zu GND zu beschalten.
 
Danke!
Das ist eine Ausführliche Beschreibung. Zeile 21 Init: habe ich nie aufgeführt, muss aber drin sei ???
Schreibfehler in Zeile 38 muss Isr_oc2 heißen oder Zeile 90 halt Onoc2:
Aber Terminal immer noch 0 Hz.
Etwas weiter ober war von LotadaC die Rede, deb Taster an Pind.5 zu hängen. Habe ich geändert -> je öfters ich drücke, desto höher die Frequenz.
Zum Schaltplan: ARef
Habe ich hier gefunden.
 
Ah, also zählt er doch hoch???
Ich hatte ja gesagt, dass er erst mal nur hoch zählen wird, nicht messen. Dann würde es ja soweit gehen.

Das mit Init: ist macht der Gewohnheit. Das Label (=Sprungmarke) besagt gar nichts, außer wenn sie durch ein Goto oder Gosub angesprungen werden soll. Die ist nur der Übersichtlichkeit drin.
Die muss auch nie angesprungen werden. Der Controller arbeitet das Programm immer von oben nach unten ab, außer du zwingst ihn mit Gosub, Goto (oder Interrupts) wo anders hin.
 
Ja, das war ein Fehler meinerseits. Früher hieß es ja noch Isr_Timer2. Das ist irreführend, daher umgeändert in oc2. nur nicht an beiden Seiten, sorry.

Ich meinte das Init:
Betonung auf den Doppelpunkt dahinter.
Das definiert nur Stellen im Quelltext an die hin gesprungen werden kann. Es ist kein wirklicher Quelltext, tritt in der Binär- oder Hexdatei die geflasht wird auch nicht auf. Ich grenze so nur einzelne Bereiche ab.

Ok, gut, es geht. Aber er zählt nur hoch. Das heißt, der Wert muss irgendwann auch wieder genullt werden um auf Hz zu kommen. Haste schon 'ne Idee?

Ist nur eine Zeile
 
Du gibst doch per Print den Wert von Timer1 aus. Das ist die Anzahl der Pegeländerungen, also das was er gezählt hat.
Wie kommst du jetzt von der Summe von Pegeländerungen auf Hz?
Du darfst nur pro Sekunde zählen
Timer1 kann man auch auf 0 zurück setzen
 

Ü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)