Hallo Teslanikola,
schick mal Deinen Code.
Ciao,
Werner
Druckbare Version
Hallo Teslanikola,
schick mal Deinen Code.
Ciao,
Werner
problem 1 gelöst: Irn realität springt er zu Test1!!!
Problem 2 ( neu ): Counter zählt nicht, hab die verschiedensten Signale eingespeist ( Rechteck, Sinus, Dreieck, Sägezahn ) nix geht, habs mit Taster probiert ( mit Pull-Down-Widerstand von 10k ), liegt woll am Prog.
HELP!!!
Code:$regfile = "2313def.dat"
Dim Var1 As Byte
Dim Var2 As Long
Dim Freq As Long
Config Portb = Output
Config Portd = Output
Enable Interrupts
Enable Timer0
Enable Timer1
Config Timer0 = Timer , Prescale = 1024
Config Timer1 = Counter , Edge = Rising
Config Pinb.5 = Input
Portb.5 = 0
On Timer0 Test1: ' Springe zu Test1 wenn Timer0 "voll"
On Timer1 Test2: ' Springe zu Test2 wenn Timer1 "voll"
Timer0 = 216 ' Constante zum erzeugen einer "Exacten" Sek.
Timer1 = 0
Start Timer0
Start Timer1 'Auf die Pins, Fertig, Messen!
Do ' Anzeige Schlaufe
Loop
Test1:
' Wenn Timer0 (Gatetimer) voll, dann Var1 + 1
Incr Var1
If Var1 = 39 Then 'Wenn Timer0 39 überlief (1 Sek) dann:
If Portd.5 = 0 Then Portd.5 = 1 Else Portd.5 = 0 ' Wenn Sek. vorbei schaltet LED an oder aus ( zur Kontrolle )
Freq = Timer1 ' Lese Timer1 aus ( Counter )
Freq = Freq + Var2 ' Addiere Timer1 und Anzahl der überlaufe von Timer1*256
Var1 = 0
Var2 = 0
Stop Timer0 ' Starte Messung erneut
Stop Timer1
Timer0 = 126
Timer1 = 0
Start Timer0
Start Timer1
Return
End If
Return
Test2: ' Wenn counter (Timer1) überlauft, dann addiere 65536
Var2 = Var2 + 65536
Return
servus Werner haste ICQ
Hallo Teslanikola
no, ich hab kein ICQ.
Also bei mir funktioniert Dein Code bis auf die immer noch eingebauten offensichtlichen Fehler. Die haben aber nichts mit der prinzipiellen Funktion zu tun.
Überlauf Timer0 springt nach test1: und erhöht Var1.
Wenn Var1 = 39, dann wird Freq berechnet und die Timer neu gestartet.
Anschließend verabschiedet sich der Controller ins Nirvana, was zwar nicht OK ist, aber bei dem 2. Return innerhalb der IF-Schleife normal seien dürfte.
Überlauf Timer1 springt nach Test2: und erhöht Var2 um 2^16.
Soweit alles OK.
Was nicht funktioniert ist das Zählen der externen Impulse mit Timer1.
Zum einen könnte das daran liegen, daß Du den Counter-Eingang von Timer1 nicht als Eingang definierst. Dann gehst Du hin und toggelst den Pin auch noch in Deiner Interrupt Routine. (Warum überhaupt?)
Wenn ich beides ändere, dann gehts aber trotzdem nicht. In der Zeile "config Timer1..." könnte noch der Eintrag zum Prescale fehlen. Ob BASCOM den zwingend braucht weiß ich aber nicht. Den eingesetzt ergibt aber auch keine Änderung. :-(
Sprich es sind mehrer Fehler drin und mindestens einen davon sehe oder verstehe ich im Moment auch nicht.
Ciao,
Werner
Hallo, der Counter geht, hatte nen wackelkontakt, aber wenn ich meinen anzeigecode einfüge zeigt er als freq immer nur 0 an. der müsste doch den counter auslesen und als freq speichern., wenn ich den counter aber in der Anzeigeschlaufe auslese ziegt er mir ne zahl an ( zählt schnell aufw. und wird nach ner sek. wieder auf 0 gesezt).wieso speichert er bei Test1 nicht den counter auf Freq?????????????????????????
Hallo Teslanikola,
tut er auch, das Problem tritt erst unmittelbar danach auf.Zitat:
Hallo, der Counter geht, hatte nen wackelkontakt, aber wenn ich meinen anzeigecode einfüge zeigt er als freq immer nur 0 an.
der müsste doch den counter auslesen und als freq speichern.
Lösch das 'Return' aus der IF-Abfrage in der Interrupt-Routine Test1:
dann müsste es funktionieren.Code:[Test1: [...]
Timer0 = 126 ' ???
Timer1 = 0
Start Timer0
Start Timer1
' Return
End If
Return
Wenn ich Deinen Code im Simulator teste, dann zählt Timer1 nicht. Schreibe ich aber ein Testprogramm, in dem nur der Counter und der Überlauf drin ist, dann gehts. Very Strange!
Du hast übrigens vergessen das Timer0=126 in der Interrupt-Routine zu ändern. Geändert hast Du es nur bei der Erstinitalisierung.
Wenn Du bestimmte Werte mehrfach in einem Programm brauchst, dann ist es sinnvol die im Quelltext als Konstanten zu definieren.
z.B. Const OvF_1s = 126
Im Programm schreibst Du anschließend überall wo Du die 126 haben willst einfach OvF_1s. Wenn Du die 126 in 226 ändern willst, dann brauchst Du nur noch an der einen Stelle den Wert zu ändern und mußt nichtmehr den Code durchsuchen wo Du überall 126 geschrieben hast..
Ciao,
Werner
OH HAPPY DAY, OH JESUS CHRIST!!!!!
Danke Werner du bist der GRÖÖÖÖÖÖÖÖÖÖÖÖSTE [schild=1 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]Thank you!!![/schild] , es funkt.
Eslag nur an dem sch*** RETURN :MistPC . Hab in der Praxis noch nen paar Probs mit der Anzeige ( nen paar Segmente leuchten nicht mehr [ schon wieder nen Wackelkontakt ] )
Werde die Schaltung und das Prog zu ner Anleitung zusammenstellen, ne Platine entwickle ich au noch, dann werde ich es hier Veröffentlichen ( darf ich deinen Namen nennen? Als Quellcodekontolleur? )
Echt noch mal fett Danke!!!!!
Hallo Teslanikola,
freut mich das es läuft.
Ich hoffe Du hast die anderen 'Fehler' auch noch ausgemerzt.
Meinen Namen darfst Du nennen, aber bitte nicht als Quellcodekontrolleur. Nachher denkt noch jemand ich hätte den Code abgesegnet. Dabei hätte ich ALLES ganz angers gemacht! ;-)
Kannst ja behaupten ich hätte mit 'nem Holzhammer hinter Dir gestanden und Dir bei jedem Fehler einen übergebraten. Den Vorschlaghammen, den es für eleganten Code benötigt hätte, den hatte ich leider nicht.
Hauptsache es läuft! :-)
Ciao,
Werner
Um genauigkeit zu verbessern könnte man auch ein 8MHz Quarz nehmen
mit ner Teilung von 8. Dann muss man der Timer bei 192 Starten und 3906 mal überlaufen lassen. Das gibt EXACT 1,0 Sek.
Oder ich nehme ein 10MHz Quartz mir ner Teilung von 8, dann bei 184 Starten und 4882 mal überlaufen lassen. Auch ned EXACTE Sek.