Forum: Mikrocontroller und Digitale Elektronik Timer auf externes Event syncen


von Lars (Gast)


Lesenswert?

Hi,

ich lese über den Adress-/Datenbus von einem STM32F103 Prozessor ein 
Interrupt-Register von einem anderen IC aus. Dieses Register wird mit 
einer bestimmten Frequenz immer wieder gesetzt und nach dem Lesen 
gecleart.

Wie ist es möglich, dass ich im STM32F103 Prozessor einen Timer 
Interrupt erstelle, der genau auf diese Frequenz, die unterschiedlich 
sein kann, gesynct ist?

Gruß
Lars

von Oliver J. (skriptkiddy)


Lesenswert?

Lars schrieb:
> ich lese über den Adress-/Datenbus von einem STM32F103 Prozessor ein
> Interrupt-Register von einem anderen IC aus. Dieses Register wird mit
> einer bestimmten Frequenz immer wieder gesetzt und nach dem Lesen
> gecleart.
Es wäre eventuell von Bedeutung, um welchen externen IC es sich handelt. 
Da könnte man sich mal ein Gesamtbild machen. Du nutzt das External Bus 
Interface. Richtig?

Gruß Oliver

von Lars (Gast)


Lesenswert?

Oliver J. schrieb:
> Es wäre eventuell von Bedeutung, um welchen externen IC es sich handelt.
> Da könnte man sich mal ein Gesamtbild machen. Du nutzt das External Bus
> Interface. Richtig?

Bei dem externen IC handelt es sich um den ICS2008B von IDT. Bei diesem 
IC gibt es ein Interruptregister, welches ich über das External Bus 
Interface auslese und daraus ersehe ob ein neues Pkt z.B. beim VITC 
Timecode beim ICS2008B angekommen ist oder nicht.

von Lars (Gast)


Lesenswert?

Lars schrieb:
> Wie ist es möglich, dass ich im STM32F103 Prozessor einen Timer
> Interrupt erstelle, der genau auf diese Frequenz, die unterschiedlich
> sein kann, gesynct ist?

hat jmd von euch noch ne Idee hierzu?

von Sascha W. (sascha-w)


Lesenswert?

du kannst nur syncronisieren, wenn der ICS ein Signal an einem Pin 
ausgibt wenn sich die Daten im Interruptregister ändern (evl. der 
INTR-Pin ?)!
Dann kannst du mit diesem am STM einen INT auslösen, in welchem du dann 
das Register des ICS ausliest - einen Timer brauchst du dann nicht.

Sascha

von Lars (Gast)


Lesenswert?

Sascha Weber schrieb:
> du kannst nur syncronisieren, wenn der ICS ein Signal an einem Pin
> ausgibt wenn sich die Daten im Interruptregister ändern (evl. der
> INTR-Pin ?)!

das trifft leider beim Receiven vom Midi Timecode nicht zu. Hier kann 
ich lediglich das entsprechende Register auslesen und überprüfen ob das 
Received-Bit gesetzt ist oder nicht.

Mit einem 1kHz-Timer oder höher bekomm ich zwar alle Midi Timecode 
Pakete allerdings weiß ich dann nicht wie ich diese synchron per LTC 
Timecode wieder absenden kann.

von Sascha W. (sascha-w)


Lesenswert?

also empfängst du zum einen die Pakete und willst sie in korrekter 
Zeitlicher Abfolge wieder versenden - verstehe ich das so richtig?

In den Timecodepaketen steht doch demzufolge ein Timecode drin, damit 
sollte sich doch der Zeitpunkt wann das Paket raus muss berechnen 
lassen. Wie hoch ist Auflösung der Timecodes?

Sascha

von Lars (Gast)


Lesenswert?

Sascha Weber schrieb:
> also empfängst du zum einen die Pakete und willst sie in korrekter
> Zeitlicher Abfolge wieder versenden - verstehe ich das so richtig?

genau, im Prinzip soll der Midi Timecode umgewandelt werden in LTC 
Timecode.

Sascha Weber schrieb:
> In den Timecodepaketen steht doch demzufolge ein Timecode drin, damit
> sollte sich doch der Zeitpunkt wann das Paket raus muss berechnen
> lassen. Wie hoch ist Auflösung der Timecodes?

Beide Timecodes sind framebasierend. Beim LTC wird jedes Frame in einem 
einzigen Paket gesendet -> mit 30fps z.B..
Beim Midi Timecode wird nur jedes zweite Frame gesendet, weil es länger 
dauert die Zeitinformation zu übertragen. Für die Zeitinformation werden 
insgesamt 8x Pakete mit 2x Bytes benötigt.

Hab das mal ohne Timer probiert und polle das Statusregister vom ICS 
(STATUS_MTC) bis der NEW_MTCBYTE_RCVD gesetzt wird, welches anzeigt das 
ein neues Midi Datenwort vorhanden ist und abgeholt werden kann.

Sobald das erste Mal ein vollständiger Midi Timecode empfangen wurde 
(alle 8x Pkt) dann initialsiiere ich den Timer anhand der empfangenen 
Framerate für den LTC Timecode. Beim zweiten vollständigen Midi Timecode 
starte ich dann den Timer.

Nach ein paar Sekunden ist der Fehler zwischen Midi Timecode received 
und dem Timer-Interrupt jedoch relativ groß. Man kann zwar ständig den 
Prescaler auf Null setzen, aber dadurch variiert die Periode vom Timer2 
Interrupt so stark, dass ich keinen validen LTC Timecode senden kann.

Ich bräuchte eine Routine mit der ich den Timer2 exakt auf die Midi Pkte 
triggern könnte, so dass die Abweichung nicht ständig größer wird.
1
volatile unsigned char phasen = 0x00; 
2
3
void RcvMidiTimecode(void)
4
{
5
   unsigned char status, tmrvalue; 
6
7
   status = STATUS_MTC; /* status midi register auslesen */
8
   if(status & NEW_MTCBYTE_RCVD)
9
   {   /* neues midi timecode pkt angekommen */
10
       
11
       if(MidiRcvMessage())
12
       {  /* noch nicht alle 8x pkt empfangen */
13
          return; 
14
       }
15
       else
16
       {  /* ein komplettes mtc pkt empfangen */
17
          
18
          if(!phasen)
19
          { /* init phase */
20
21
            /* man kennt die Framerate aus dem ersten rcvd midi pkt 
22
            -> daraus timer initialisieren (so dass timer jedes komplett
23
            empfangene Midi Timecode Pkt triggert) */
24
            Timer2_Init(MIDI_FRAMERATE);  /* MIDI_FRAMERATE z.B. = 30fps */
25
            phasen++; 
26
          }
27
          else if(phasen == 1)
28
          {  /* start timer mit diesem pkt */
29
             Timer2_Start(); 
30
             phasen  = 2; 
31
          }
32
          else
33
          {
34
             /* aktueller Zählerwert vom Timer */
35
             tmrvalue = TIM2->CNT;
36
            
37
             if((tmrvalue >= 50) && (tmrvalue < (CNTR_VALUE - 50))
38
             { /* abweichung vom Timer2 zum rcvd midi tc pkt ist
39
               größer als -/+ 0.5ms */
40
                
41
               /* CNTR_VALUE = eingestellter Counterwert vom Timer */
42
             }
43
          }
44
       }
45
   }
46
}

von Sascha W. (sascha-w)


Lesenswert?

was du suchst ist eine Software-PLL!
Jedoch sehe ich das Problem, das du durch das pollen des Statusregisters 
den genauen Punkt an dem der Frame eingegangen ist nicht ermitteln 
kannst und somit immer ein wechselnder Offset entsteht.

Kann die Framerate jeden beliebigen Wert annehmen, oder gibt es nur 
bestimmte Raten, auf die man "einrasten" könnte?

Sascha

von Lars (Gast)


Lesenswert?

Sascha Weber schrieb:
> Kann die Framerate jeden beliebigen Wert annehmen, oder gibt es nur
> bestimmte Raten, auf die man "einrasten" könnte?

Insgesamt gibt es vier verschiedene Raten 24Hz, 25Hz, 29,97Hz und 30Hz.

Sascha Weber schrieb:
> was du suchst ist eine Software-PLL!

wie würde das prinzipiell mit einer Software-PLL funktionieren? Wie wird 
hier zu Beginn die genauen Nulldurchgänge ausbalanciert?

von Sascha W. (sascha-w)


Lesenswert?

Lars schrieb:
> Sascha Weber schrieb:
>> Kann die Framerate jeden beliebigen Wert annehmen, oder gibt es nur
>> bestimmte Raten, auf die man "einrasten" könnte?
>
> Insgesamt gibt es vier verschiedene Raten 24Hz, 25Hz, 29,97Hz und 30Hz.
hmm... bei dem geringen Abstand wird das nichts mit festen Werten

> Sascha Weber schrieb:
>> was du suchst ist eine Software-PLL!
>
> wie würde das prinzipiell mit einer Software-PLL funktionieren?
nicht das ich schon mal sowas programmiert hätte, aber schau mal im Netz 
da gibt's schon Beschreibungen

> Wie wird hier zu Beginn die genauen Nulldurchgänge ausbalanciert?
wie gesagt - genaue "Nulldurchgänge" deiner Sollfrequenz hast du ja 
durch das Polling nicht - wie sich das auf die Reglung auswirkt kannst 
du nur probieren.

Sascha

von chick (Gast)


Lesenswert?

Hast Du keinen Studio-Takt irgendwo anders zum Abgreifen? Z.B. 
Video-Signal oder BB oder Wordclock?

Wenn Du nichts dergleichen hast, ist eine Software-PLL durchaus 
sinnvoll. Sollte so schwer nicht sein. Sind ja nur enige 
Ausgabefrequenzen, die in Frage kommen.

Arbeitet der TC echt noch mit Drop-Frame?

von Harald B. (haraldb)


Lesenswert?

Hallo Lars,

ich habe zwar gesehen, dass Du nur als Gast gelistet bist, aber 
vielleicht schaust Du ja noch einmal hier herein.
Ich arbeite auch an einem Gerät mit dem ICS2008B und bin nun beim Midi 
Timecode.
Wenn Du Interesse hast könnten wir ja schon gemachte Erfahrungen und 
Code für den Chip austauschen.
Diese Anfrage gilt natürlich auch für alle anderen, die mit diesem Chip 
arbeiten.

Gruß Harald

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.