Nun wirds mal mächtig schwierig (für Mich)!
Ich möchte 2 Programme auf einen Chip zusammen führen.
Problem dabei ist, jedes Einzelprogramm benötigt eine andere Einstellung von Timer1. Dazu kommt noch dass beide Programme mit einer anderen Geschwindigleit arbeiten: 8 und 16 Mhz, das sollte aber das kleinste Problem sein ?!
Es geht um einen 5Ton Auswerter und Geber. Als Hauptprogramm soll der Auswerter laufen, und auf Tastendruck zum Geber gewechselt werden.
http://de.wikipedia.org/wiki/5-Ton-Folge
Ich würde das alles gern auf dem Mega8 unterbringen.
Hier der Auswerter:
Und der Geber:
Lässt sich Timer1 für die Subroutine "Geber" juste mal umstellen, oder wie kann man das Problem lösen?
Ich möchte 2 Programme auf einen Chip zusammen führen.
Problem dabei ist, jedes Einzelprogramm benötigt eine andere Einstellung von Timer1. Dazu kommt noch dass beide Programme mit einer anderen Geschwindigleit arbeiten: 8 und 16 Mhz, das sollte aber das kleinste Problem sein ?!
Es geht um einen 5Ton Auswerter und Geber. Als Hauptprogramm soll der Auswerter laufen, und auf Tastendruck zum Geber gewechselt werden.
http://de.wikipedia.org/wiki/5-Ton-Folge
Ich würde das alles gern auf dem Mega8 unterbringen.
Hier der Auswerter:
Code:
$regfile = "2313def.dat"
$crystal = 8000000
Ddrd = &B00010000
Portd.2 = 1
Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising , Noise Cancel = 1
Config Aci = On , Compare = On , Trigger = Rising
On Icp1 Oncapture
Enable Icp1
On Int0 Ontaster
Config Int0 = Falling
Enable Int0
Enable Interrupts
Dim Zaehler As Word
Dim Icr_neu As Word
Dim Icr_alt As Word
Dim Frequlong As Long
Dim Frequenz As Word
Dim A(5) As Word Dim Frequsumme As Word
Dim Adizaehler As Integer
Dim Durchschnitt As Word
Dim Grenzeo As Word
Dim Grenzeu As Word
Dim Ton As String * 1
Dim Tonalt As String * 1
Dim Folge As String * 5
Dim Timeout As Word
Main:
Waitms 2
Frequlong = 8000000 / Icr_neu
Icr_neu = 1
Frequenz = Frequlong
Incr Timeout
If Timeout > 40 Then
Folge = ""
Tonalt = ""
Timeout = 0
End If
A(5) = A(4)
A(4) = A(3)
A(3) = A(2)
A(2) = A(1)
A(1) = Frequenz
Frequsumme = 0
For Adizaehler = 1 To 5
Frequsumme = Frequsumme + A(adizaehler)
Next
Durchschnitt = Frequsumme / 5
Grenzeo = A(1) + 10
Grenzeu = A(1) - 10
If Durchschnitt > Grenzeu And Durchschnitt < Grenzeo Then
Select Case Durchschnitt
Case 1050 To 1070 : Ton = "1"
Case 1150 To 1170 : Ton = "2"
Case 1260 To 1280 : Ton = "3"
Case 1390 To 1410 : Ton = "4"
Case 1520 To 1540 : Ton = "5"
Case 1660 To 1680 : Ton = "6"
Case 1820 To 1840 : Ton = "7"
Case 1990 To 2010 : Ton = "8"
Case 2190 To 2210 : Ton = "9"
Case 2390 To 2410 : Ton = "0"
Case 2590 To 2610 : Ton = "w"
Case Else : Goto Main
End Select
Else : Goto Main
End If
If Ton = Tonalt Then Goto Main
Tonalt = Ton
Folge = Folge + Ton
Timeout = 0
If Len(folge) = 5 Then
Print Folge
If Folge = "2910w" Then
Portd.4 = 1
End If
Folge = ""
End If
Goto Main
Ontaster:
Portd.4 = 0
Return
Oncapture:
Zaehler = Timer1
Icr_neu = Zaehler - Icr_alt
Icr_alt = Zaehler
Return
Und der Geber:
Code:
$regfile = "M8def.dat"
$crystal = 16000000
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim E As Byte
Dim Ton1 As Word
Dim Ton2 As Word
Dim Ton3 As Word
Dim Ton4 As Word
Dim Ton5 As Word
Config Portb.1 = Output
Config Portd = Output 'OC1A
Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
Stop Timer1
Declare Sub Frequency_set(byval Frequency As Word)
Declare Sub Frequency_output_on()
Declare Sub Frequency_output_off()
A = 1
B = 3
C = 5
D = 7
E = 9
Main:
Ton1 = Lookup(a , Freq)
Ton2 = Lookup(b , Freq)
Ton3 = Lookup(c , Freq)
Ton4 = Lookup(d , Freq)
Ton5 = Lookup(e , Freq)
Ausgabe:
Portd.7 = 1
Waitms 700
Call Frequency_set(ton1)
Call Frequency_output_on()
Waitms 70
Call Frequency_set(ton2)
Waitms 70
Call Frequency_set(ton3)
Waitms 70
Call Frequency_set(ton4)
Waitms 70
Call Frequency_set(ton5)
Waitms 70
Call Frequency_output_off()
Waitms 300
Portd.7 = 0
Wait 3
Return
End
Sub Frequency_set(byval Frequency As Word)
Local Tmp_single As Single
Local Tmp_word As Word
Tmp_single = Frequency * 2
Tmp_single = 16000000 / Tmp_single
Tmp_word = Tmp_single
Compare1a = Tmp_word
End Sub
Sub Frequency_output_on()
Start Timer1
End Sub
Sub Frequency_output_off()
Stop Timer1
End Sub
End
Freq:
Data 2400% , 1060% , 1160% , 1270% , 1400% , 1530% , 1670% , 1830% , 2000% , 2200% , 2400% , 2600%
Lässt sich Timer1 für die Subroutine "Geber" juste mal umstellen, oder wie kann man das Problem lösen?