Programme zusammen fügen - Timer1

dg2ygq

Neues Mitglied
23. Juli 2007
239
0
0
Bielefeld
Sprachen
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:
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?
 
Hallo dg2!

Du kannst tatsächlich die Einstellungen des Timers innerhalb des Programmes in einer Subroutine ändern.

"Übertrieben" gesagt kannst du den Timer1 z.B. in der Sub_1 als Timer mit Overflow arbeiten lassen.... und auf "Tastendruck" in der Sub_2 zum PWM-Ausgang ändern.

DAS wäre also das kleinere Problem. ;)

Wie meinst du das aber mit den zwei "Geschwindigkeiten"?
Die MHz kannst du nicht mitten im Programm ändern.
Oder rechnest du die Zeitwerte für den 8MHz Betrieb dann auf den 16MHz um?

Schöne Grüße,
Cassio
 
Danke für deine schnelle Antwort, Cassio!

Ich kann also einfach in die Subrutine die Configzeile(n) für den Timer erneut setzen? Ich war der Meinung dass die Timergeschichte sich nicht mehr in der weiteren Software verändern ließe ?!

Muss ich den Timer1 erst ausschalten, resetten oder Ähnliches?

So ungefär ?
Code:
~
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 
~
~
~
~
Geber:
Stop Timer1
Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
Stop Timer1
~
~

Nein, dass ich nur eine Quarzfrequenz betreiben kann, ist schon klar.
Ich meinte das Anpassen des Timers an die Quarzfrequenz.
 
Hallo Dg2 !

Ja genau...

Du initialisierst den Timer jeweils in einer Sub...... die du dann entsprechend aufrufst.

Zum Beispiel:

Code:
' ################################################
Pwm_init:
' Timer1 als PWM

Disable Timer1

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1

Return


' ################################################
Timer_init:
' Timer1 mit OVFL

Config Timer1 = Timer , Prescale = 1

On Timer1 ISR_XY
Enable Timer1

Return


Sind die Beispiele soweit verständlich?

Gruß,
Cassio


PS: Der o.a. Code wird von mir schon lange eingesetzt und funktioniert einwandfrei! ;)
Musst ihn nur auf deine Bedürfnisse hin anpassen bzw. ändern!
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)