TWI ohne Interruptsperrung?

Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

TWI ohne Interruptsperrung?

 · 
Posted: 10.08.2020 - 18:19  ·  #1
Hallo,

ich habe eine Frage zum TWI Treiber:

Ich setze auf einem Xmega TWI ein um einen Portexpander einzusetzen.
Leider sperrt offenbar der Treiber bei jedem Zugriff auf den I2C-Bus die Interrupts für die Dauer des Timeouts , das hat bei mir leider sehr große Nachteile, da dann der Takt für ein Schrittmotor durcheinander gerät, der Motor blockiert dadurch.

Ich rufe einen ähnlichen Baustein per SPI ab, da wird der Interrupt nicht systemweit gesperrt.
Bei TWI offenbar schon, ich vermute wegen des Timeouts?.


In der Doku steht:

Quote

TWInoTimeOut
XMega Normalerweise bestimmt die Variable TWI_TimeOuttn den Timeout bei den TWI Operationen. Bei sehr schnellen Slaves kann auf den TimeOut im x-SysTick Bereich verzichtet werden. Mit diesem optionalen Define (true) wird das TimeOut auf ca. 4msec heruntergesetzt werden.


Wenn ich aber versuche TWInoTimeOut zu nutzen bekomme ich einen Compilerfehler, die Variable ist nicht bekannt. Auch als Define wird es nicht akzeptiert.

Kann ich den TWI irgendwie ohne Interruptsperrung verwenden? So kann ich das leider in manchen Fällen nicht nutzen, da selbst kleine Unterbrechungen da schon schädlich sind.
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: TWI ohne Interruptsperrung?

 · 
Posted: 10.08.2020 - 22:45  ·  #2
Hallo,
ich kenne den Assembler Code ein wenig.
Da werden keine Interrupts gesperrt, dies wäre sogar hinderlich für den timeout, da dieser im systick abläuft.

Gruß
Thomas

Hier der Beweis. Am Ende der Systick Implementierung wird der Twi timer _TWI_TO dekrementiert
Code

47688  869C            SYSTEM.$INTERRUPT_TIMER0:
47689  869C                                    .DEB      SYSTICKENTRY
47690  869C       93EF                         PUSH      _ACCCLO
47691  869D       93FF                         PUSH      _ACCCHI
47692  869E       930F                         PUSH      _ACCB
47693  869F       931F                         PUSH      _ACCA
47694  86A0       B71F                         IN        _ACCA, SREG
47695  86A1       931F                         PUSH      _ACCA
47696  86A2       B71C                         IN        _ACCA, EIND
47697  86A3       931F                         PUSH      _ACCA
47698  86A4   91100210                         LDS       _ACCA, SysTickTime
47699  86A6       B506                         IN        _ACCB, tcnt0
47700  86A7       0F10                         ADD       _ACCA, _ACCB
47701  86A8       BD16                         OUT       tcnt0, _ACCA
47702  86A9       E71F                         LDI       _ACCA, 0FEH ROLB IntFlag
47703  86AA       2271                         AND       Flags, _ACCA
47704  86AB   91000078                         LDS       _ACCB, adcl
47705  86AD   91100079                         LDS       _ACCA, adch
47706  86AF   91E00211                         LDS       _ACCCLO, _ADCBUFF
47707  86B1   91F00212                         LDS       _ACCCHI, _ADCBUFF+1
47708  86B3       0F0E                         ADD       _ACCB, _ACCCLO;
47709  86B4       1F1F                         ADC       _ACCA, _ACCCHI;
47710  86B5       9516                         LSR       _ACCA
47711  86B6       9507                         ROR       _ACCB
47712  86B7   93000211                         STS       _ADCBUFF, _ACCB
47713  86B9   93100212                         STS       _ADCBUFF+1, _ACCA
47714  86BB                                    ;
47715  86BB   91E00204                         LDS       _ACCCLO, SystemTime16
47716  86BD   91F00205                         LDS       _ACCCHI, SystemTime16+1
47717  86BF       9631                         ADIW      _ACCCLO, 1
47718  86C0   93F00205                         STS       SystemTime16+1, _ACCCHI
47719  86C2   93E00204                         STS       SystemTime16, _ACCCLO
47720  86C4   91000421                         LDS       _ACCB, _TWI_TO                
47721  86C6       2300                         TST       _ACCB
47722  86C7       F019                         BREQ      SYSTEM._L3437
47723  86C8       950A                         DEC       _ACCB
47724  86C9   93000421                         STS       _TWI_TO, _ACCB
Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

Re: TWI ohne Interruptsperrung?

 · 
Posted: 11.08.2020 - 07:20  ·  #3
Ok, danke.
Dennoch habe ich eine Unterbrechung des Programmablaufs wenn ich Daten per TWI abrufe.

Konkret läuft da ein Timer in dessen Overflow-Interrupt ein Ausgang geschaltet wird. Mit dem Takt steuere ich einen Schrittmotor an.
Bei einem Zugriff über TWI wird das unterbrochen. Sehr kurz, ich konnte es noch nicht messen, aber dennoch so lang dass der Motor aufgrund der kurz ausbleibenden Takte blockiert.

Es geht hier um einen Xmega.
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: TWI ohne Interruptsperrung?

 · 
Posted: 11.08.2020 - 19:38  ·  #4
schon den watchdog ausgeschlossen.
Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

Re: TWI ohne Interruptsperrung?

 · 
Posted: 13.08.2020 - 15:42  ·  #5
Es ist eine sehr eigenartige Sache die ich mir nicht erklären kann, im asm-file kann ich sehen dass da keine Interrupts gesperrt werden, dennoch hakt meine Timer interrupt-overflow routine immer dann wenn ich vom TWI lese. Timer habe ich versuchsweise auch schon gewechselt, ohne Erfolg.
Auch mit dem I2C-Treiber (Also software I2C) tritt das auf.
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: TWI ohne Interruptsperrung?

 · 
Posted: 15.08.2020 - 21:09  ·  #6
Bitte code mailen oder posten, falls Hilfe gewünscht.
Sonst ist das immer alles ein Ratespiel.

Vielleicht stört der systick interrupt deine Timer routine?
Welche Anforderungen hast du da? Kann man die timer nicht so verwenden, dass eine Motorsteuerung ohne interrupt routine funktioniert? Ich dachte das ist möglich per pwm oder so? Hab das noch nie gemacht.
Gruß
Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

Re: TWI ohne Interruptsperrung?

 · 
Posted: 16.08.2020 - 15:11  ·  #7
Da den Code zu veröffentlichen wird schwer, daher lasse ich das hier.
Ich habe einen Weg gefunden das zu umgehen, es trat nur in bestimmten Situationen auf, diese konnte ich anderweitig entschärfen.

Louis
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   126   140 · Page-Gen-Time: 0.072946s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI