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
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
Mich würde es brennend interessieren, warum das nicht klappt??? Vielleicht packt mal jemand das programm auf seinen Chip.
Gruß
Sven
Lesezeichen