So hier ist mein code mit den Timern, wo sich der Prescalerwert nicht ändert! Der Compiler setzt alles ohne zu murren um, aber ab 29Hz kommt nur noch Mist heraus.
Code:'******************************************************************************* 'Frequenzgenerator 'Prozessor: Atmel Mega 32 'Programm: Test_Prescaler verändern '******************************************************************************* '$sim $regfile = "M32DEF.DAT" $crystal = 16000000 $baud = 9600 '-----------------------------Variablendeklaration-------------------------------- Dim Rel_flag As Bit Dim S As String * 10 '------------------------Variablen zur Frequenzberechnung------------------------- Dim F As Single Dim Fein As Single Dim Fcalc As Single Dim Check As Single Dim Calc As Single Dim Pre As Integer 'Prescaler Dim Presc As Integer 'Prescaler Uebergabewert Dim Vorteiler As Long 'Prescaler berechnet Dim Reload1 As Word Dim Count0 As Byte Dim Count1 As Byte Const Fosc = 16000000 'Frequenz µC Const Aufl = 65536 'Timeraufloesung Dim T As Single 'Periode Declare Sub Aus Declare Sub Neue_frequenz Declare Sub Reloadsub '-----------------------------Portkonfiguration----------------------------------- 'Der PortC wird als Ausgang programmiert Config Pinc.0 = Output Config Pinc.1 = Output Config Pinc.2 = Output Config Pinc.3 = Output Config Pinc.4 = Output Config Pinc.5 = Output Config Pinc.6 = Output Config Pinc.7 = Output Config Pina.7 = Output Config Pina.6 = Output Config Pina.5 = Output Config Pina.4 = Output 'Der Port B und D wird als Eingang programmiert Config Pinb.0 = Input Config Pinb.1 = Input Config Pinb.2 = Input ' Interrupt 2 für Zuendung Slave IN sync Config Pinb.3 = Input Config Pinb.4 = Input Config Pinb.5 = Input Config Pinb.6 = Input Config Pinb.7 = Input Config Pind.2 = Input ' Interrupt 0 für ON/OFF Config Pind.3 = Input 'Interrupt 1 Sammelinterrupt Stoerung Config Pind.4 = Input Config Pind.5 = Input Config Pind.6 = Input Config Pind.7 = Input 'Pullup einschalten nur bei PD3 noetig! Portd.3 = 1 'Hier geben wir der Definition einen schoeneren Namen _out Alias Portc.0 Sync Alias Portc.1 _rdy Alias Portc.2 Reserve_out Alias Portc.3 Stoerung_out Alias Portc.4 Outp Alias Portc.5 Led1 Alias Portc.6 Led2 Alias Portc.7 Led3 Alias Porta.7 Led4 Alias Porta.6 Ok Alias Porta.5 Relais Alias Porta.4 '-----------------------------Timerkonfiguration---------------------------------- 'Hier wird der Timer und der Teiler festgelegt Config Timer0 = Timer , Prescale = 64 Config Timer1 = Timer , Prescale = 8 'Hier wird das Unterprogramm festgelegt, das 'in dem eingestellten Intervall aufgerufen wird On Timer0 Timer0_irq 'Nosave On Timer1 Timer1_irq 'Nosave Const Reload0 = 6 Reload1 = 30534 'Hier werden die Timer aktiviert Enable Timer0 Enable Timer1 Enable Interrupts Call Aus Start Timer1 Do If Ischarwaiting() <> 0 Then Call Neue_frequenz nop Loop Timer0_irq: '1 Pausenteil 1ms Timer0 = Reload0 Outp = 0 'EIN Stop Timer0 Waitus 500 Outp = 1 'AUS Waitus 1000 '2.Pausenteil 1ms Led1 = 0 Start Timer1 Return Timer1_irq: 'lange Zeit 17,5ms Timer1 = Reload1 Led1 = 1 Stop Timer1 Start Timer0 Return '----------------------------Funktion Ausschalten--------------------------------- Sub Aus Portc = &HFF ' alle LEDs aus Led1 = 1 Led2 = 1 Led3 = 1 ' alle LEDs aus Led4 = 1 ' alle LEDs aus Ok = 1 Outp = 1 ' alle LEDs aus Waitms 200 If Rel_flag = 0 Then Relais = 1 ' alle LEDs aus End If End Sub '--------------------------Funktion Frequenzberechnung---------------------------- Sub Neue_frequenz Stop Timer0 Stop Timer1 Waitms 200 Call Aus S = Inkey() Print "Frequenz ohne dezimale eingeben, d.h 500 entspricht 50Hz" Eingabe: Input " neue Frequenz: " , Fein If Fein > 500 Then Print "Fequenz zu Gross!!!" Goto Eingabe End If F = Fein / 10 Check = Frac(f) 'nur Nachkommastelle If Check = 0.5 Or Check = 0 Then Print " neue Frequenz: " ; F ; "Hz" Else Print "falsche Eingabe! Nur 0,5Hz Schritte moeglich!" Goto Eingabe End If T = 1 / F T = T - 0.0025 Fcalc = 1 / T Vorteiler = T * Fosc Vorteiler = Vorteiler \ Aufl If Vorteiler <= 1 Then Pre = 1 Presc = Pre Call Reloadsub Reload1 = Round(calc) End If If Vorteiler > 1 And Vorteiler <= 8 Then Pre = 8 Presc = Pre Call Reloadsub Reload1 = Round(calc) End If If Vorteiler > 8 And Vorteiler <= 64 Then Pre = 64 Presc = Pre 'Prescaler Call Reloadsub Reload1 = Round(calc) End If If Vorteiler > 64 And Vorteiler <= 256 Then Pre = 256 Presc = Pre 'Prescaler Call Reloadsub Reload1 = Round(calc) End If If Vorteiler > 256 And Vorteiler <= 1024 Then Pre = 1024 Presc = Pre 'Prescaler Call Reloadsub Reload1 = Round(calc) End If Start Timer1 End Sub Sub Reloadsub 'Berechnung von Reload1 Calc = Fosc / Pre Calc = Calc / Fcalc Calc = Aufl - Calc Tccr1b = Tccr1b And &HF8 Tccr1b = Tccr1b Or Presc End Sub







Zitieren

Lesezeichen