Hi,
ich habe noch mal weiterversucht und ein Display angehängt was mir direkt den Wert von compare1a ausgibt.
Ich habe den Eingang mit einer sich alle 100ms verändernden Frequenz beaufschlagt, und konnte beobachten, dass sich der compare1a-Wert auch ganz brav alle 100ms mitverändert (variiert zwischen 10 und 45)
@ Stefan: ich habe meine 5 sekunden schätzung noch mal genau ermittelt, und folgendes ergebnis bekommen:
4 sekunden Frequenzausgabe, 18 sekunden low signal, 2,5 sekunden Frequenzausgabe, 20 sekunden hi signal, 40 sekunden Frequenzausgabe, 14 sekunden hi signal.... usw.
Es lässt sich also absolut keine regelmäßigkeit erkennen, sowohl die Unterbrechungsdauer scheint zufällig, als auch das Unterbrechungssignal (hi oder lo). (P.S.: Es liegt definitiv kein Wackelkontakt vor)
Watchdog ist nicht an. Overflow einer Variable sollte es auch nicht sein. Ob ich die Timer richtig eingestellt habe weiß ich nicht (siehe code). Globale Variablen in den Interrupts mit volatile deklarieren? Ich weiß leider nicht was das bedeutet...
Code:
$regfile = "m8def.dat"
$crystal = 1000000 'Quarz: 1,000 MHz Intern
'---------------------------------------------------------
Tccr1a = &B01000000
Tccr1b = &B00001100
Dim Pulsbreite As Long
Dim Faktor As Word
Dim ___lcdno As Bit
Config Lcdpin = Pin , E = Portc.3 , E2 = Portd.7 , Rs = Portc.2 , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5
Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdbus = 4
Config Pind.6 = Output 'RW=0
Portd.6 = 0
Config Pind.7 = Output
Portd.7 = 1 'LCD Licht ein
Initlcd
Cursor Off
Cls
Config Pinc.0 = Input
Config Pinb.1 = Output
Config Pinb.0 = Input
Portb.0 = 1
Enable Interrupts
Do
Pulsein Pulsbreite , Pinb , 0 , 0
Pulsbreite = Pulsbreite * 255 'Umrechnungsfaktor 2,55
Pulsbreite = Pulsbreite / 400
Pulsbreite = Pulsbreite * 512
Faktor = 490
Pulsbreite = Pulsbreite / Faktor
If Pulsbreite = 0 Then
Pulsbreite = 65535
End If
Compare1a = Pulsbreite
Waitms 100
Locate 1 , 3
lcd " "
Locate 1 , 1
Lcd "c=" ; Compare1a
Loop
End
Lesezeichen