Hab ich eingebaut allerdings noch ohne Sleep. Die Led spinnt trotzdem irgendwie. In unregelmäßigen Abständen Toggelt die Led nicht. Ich kann da kein System hinter feststellen. Es passiert einfach nicht immer.
Woran kann das noch liegen? Naja ich teste jetzt mal wieder die genauigkeit der Uhr. Ich hatte noch einen fehler in der Software, sodass die Sekundenvariable nicht von 0 bis 59 gezählt hat sondern von 1 bis 59 und somit immer eine Sekunde zuwenig pro Minute gezählt wurde.
Hier der Übersichtlichkeit halber nochmal der neue Code:
Code:$regfile = "m8def.dat" $crystal = 8000000 'Ports einstellen Config Portb.0 = Output 'SRData Config Portb.3 = Output 'PWM Config Portd.7 = Output 'SCK Config Portd.6 = Output 'RCK Config Portd.5 = Output 'Reset Config Portd.2 = Output 'LED Config Pinc.3 = Input 'Taster1 Config Pinc.4 = Input 'Taster2 Config Pinc.5 = Input 'Taster3 'Alias definieren Rck Alias Portd.6 Sck Alias Portd.7 Datasr Alias Portb.0 Resetsr Alias Portd.5 Led Alias Portd.2 Pwm Alias Portb.3 Taster1 Alias Pinc.3 Taster2 Alias Pinc.4 Taster3 Alias Pinc.5 'Portpegel setzen Rck = 0 Sck = 0 Datasr = 0 Resetsr = 1 Led = 0 Pwm = 1 Taster1 = 1 Taster2 = 1 Taster3 = 1 'Timer konfigurieren Config Timer1 = Timer , Prescale = 256 Enable Timer1 On Timer1 Sekundentakt Enable Interrupts Timer1 = 34285 'Config Timer2 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1 'Variablen definieren Dim Sek_flag As Bit Dim Sekunden As Integer Dim Minuten As Byte Dim Stunden As Byte Sekunden = 0 Minuten = 0 Stunden = 12 'Bitmuster erstellen und Array befüllen Dim Stundenarray(12) As Word Dim Minutenarray(12) As Byte Dim I As Byte Dim Stdpos As Byte Dim Minpos As Byte Minutenarray(1) = &B00000000 'Voll Minutenarray(2) = &B10000001 'Fünf nach Minutenarray(3) = &B10000010 'Zehn nach Minutenarray(4) = &B00010001 'Viertel nach Minutenarray(5) = &B00100110 'Zehn vor Halb Minutenarray(6) = &B00100101 'Fünf vor Halb Minutenarray(7) = &B00100000 'Halb Minutenarray(8) = &B00101001 'Fünf nach Halb Minutenarray(9) = &B00101010 'Zehn nach Halb Minutenarray(10) = &B01010000 'Viertel vor Minutenarray(11) = &B01000010 'Zehn vor Minutenarray(12) = &B01000001 'Fünf vor Stundenarray(1) = &B0000000100000000 'Eins Stundenarray(2) = &B0000001000000000 'Zwei Stundenarray(3) = &B0000010000000000 'Drei Stundenarray(4) = &B0000100000000000 'Vier Stundenarray(5) = &B0001000000000000 'Fünf Stundenarray(6) = &B0010000000000000 'Sechs Stundenarray(7) = &B0100000000000000 'Sieben Stundenarray(8) = &B1000000000000000 'Acht Stundenarray(9) = &B0000000000010000 'Neun Stundenarray(10) = &B0000000000100000 'Zehn Stundenarray(11) = &B0000000001000000 'Elf Stundenarray(12) = &B0000000010000000 'Zwölf 'Hauptschleife Do If Sek_flag = 1 Then If Sekunden < 59 Then Sekunden = Sekunden + 1 Else Sekunden = 0 Minuten = Minuten + 1 End If If Minuten >= 59 Then Minuten = 0 Stunden = Stunden + 1 End If If Stunden > 12 Then Stunden = 1 Minuten = 0 End If Sek_flag = 0 End If 'Arrayposition berechnen Bsp: Minuten = 3 ===> Arrayposition 1 muss ausgegeben werden Minpos = Minuten / 5 Minpos = Minpos + 1 'Überprüfen ob die Stunde + 1 ausgegeben werden muss. Bsp: 05:31 ===> Halb Sechs Stdpos = Stunden If Minuten >= 5 Then Stdpos = Stdpos + 1 End If 'Stundenarray an der Position "Stunden" in die Schieberegister takten For I = 0 To 15 Step 1 Datasr = Stundenarray(Stunden).I Toggle Sck Toggle Sck Next A 'Minutenarray an der Position "Minpos" in die Schieberegister takten For I = 0 To 7 Step 1 Datasr = Minutenarray(Minpos).I Sck = 1 Sck = 0 Next A 'Latch der Schieberegister auf Ausgänge schalten Rck = 1 Rck = 0 'In Idle Mode wechseln zum strom sparen und um unnötiges beschreiben der Schieberegister 'zu vermeiden. Geweckt wird im Sekundentakt des Timers. 'POWER IDLE Loop End 'Interrupt Routine für den Timer1. Läuft Sekündlich über. Sekundentakt: Timer1 = 34285 Toggle Led Sek_flag = 1 Return







Zitieren

Lesezeichen