Hallo!
Hier nochmal mein Code zu deinem Beispiel, so hatte ich es übrigens auch schonmal und funktioniert bei meinem 8515 wunderbar!
Habe es eben extra nochmal durch den Simulator gejagt. Da kann man schön sehen, daß die Berechnungen richtig sind und sogar das Register korrekt gesetzt wird. Aber in Realität passiert eben genau das nicht!
Anbei nochmal mein Code
Mich würde es brennend interessieren, warum das nicht klappt??? Vielleicht packt mal jemand das programm auf seinen Chip.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 Byte '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 Call Reloadsub Disable Timer1 Config Timer1 = Timer , Prescale = 1 Reload1 = Round(calc) Enable Timer1 End If If Vorteiler > 1 And Vorteiler <= 8 Then Pre = 8 Call Reloadsub Disable Timer1 Config Timer1 = Timer , Prescale = 8 Reload1 = Round(calc) Enable Timer1 End If If Vorteiler > 8 And Vorteiler <= 64 Then Pre = 64 Call Reloadsub Disable Timer1 Config Timer1 = Timer , Prescale = 64 Reload1 = Round(calc) Enable Timer1 End If If Vorteiler > 64 And Vorteiler <= 256 Then Pre = 256 Call Reloadsub Disable Timer1 Config Timer1 = Timer , Prescale = 256 Reload1 = Round(calc) Enable Timer1 End If If Vorteiler > 256 And Vorteiler <= 1024 Then Pre = 1024 Call Reloadsub Disable Timer1 Config Timer1 = Timer , Prescale = 1024 Reload1 = Round(calc) Enable Timer1 End If 'Start Timer1 End Sub Sub Reloadsub 'Berechnung von Reload1 Calc = Fosc / Pre Calc = Calc / Fcalc Calc = Aufl - Calc End Sub
Gruß
Sven







Zitieren

Lesezeichen