Kurze Aktualisierung...
Nach 15 Stunden hab ich es auf 1 Minute und 5 Sekunden Gangfehler geschafft.
Die Variable D wurde hinzugefügt, um jede Minute einen anderen Zählwert einzusetzen. Ist mit sicherheit keine elegante Methode. Vorallem kann ich mir vorstellen das es besser wäre, schon innerhalb einer Minute zu mitteln. Und das ganze nicht über mehrere Minuten zu ziehen. Warscheinlich hätte man mit etwas Mathematikverständnis den richtigen Mittelwert auch direkt errechnen können. Da ich ein sollches Verständnis nicht besitze, lief es über try and error
Hier ist der aktuelle Code:
Code:
$regfile = "attiny45.dat"
'### 2 MHz Quarz, Fusebit für 1/8 Systemtakt gesetzt ###
$crystal = 250000
$hwstack = 36
$swstack = 4
$framesize = 4
'### Bit zum minütlichen Wechsel des Ausgangsports ###
Dim B As Bit
'### Zählvariable wird beim Timerüberlauf inkrementiert ###
Dim C As Word
'### Zählkonstante für Mittelung
Dim K As Word
Dim D As Byte
'### Ausgänge für beide Brückenzweige ###
Config Portb.0 = Output
Config Portb.1 = Output
'### Timer0 konfigurieren. 0,25 MHz (Systemtakt) / 64 (Prescaler) = 3906,25 / 256 (8-Bit Timer) * 60 (Sekunden) = 915,527 ###
Config Timer0 = Timer , Prescale = 64
'### Timerüberlauf ###
On Ovf0 On_ovf0
Enable Ovf0
Enable Interrupts
Start Timer0
C = 0
D = 0
Do
Select Case D
Case 0 : K = 915
Case 1 : K = 916
Case 2 : K = 915
Case 3 : K = 915
Case 4 : K = 916
Case 5 : K = 916
Case 6 : K = 916
Case 7 : K = 916
Case 8 : K = 915
End Select
If D = 8 Then
D = 0
End If
Incr D
If C = K Then
C = 0
Toggle B
If B = 0 Then
Portb.1 = 1
Waitms 400
Portb.1 = 0
Else
Portb.0 = 1
Waitms 400
Portb.0 = 0
End If
End If
Loop
End
'### Routine bei Timerüberlauf ###
On_ovf0:
Incr C
Return
Lesezeichen