Forum: Mikrocontroller und Digitale Elektronik ATtiny1614 2 Interrupts heben sich auf?!


von Mr. AVR (Gast)


Lesenswert?

Hallo,

ich scheitere gerade am Tiny1614. Ich habe dort einen Pin-ISR mit einem 
dort anliegenden Signal von ca. 20 khz. Wird auf beide Flanken 
getriggert.

Dann habe ich einen weiteren ISR für den Systemtimer der liegt bei 20 
khz für Servo, PWM usw.

Jetzt habe ich folgenden Effekt:

1. Ich aktiviere den TCD-ISR

TCD0.CMPBCLR = 31;
  TCD0.INTCTRL = TCD_OVF_bm;
  TCD0.CTRLB = TCD_WGMODE_ONERAMP_gc;
  TCD0.CTRLA = (TCD_CLKSEL_20MHZ_gc | TCD_CNTPRES_DIV32_gc | 
TCD_SYNCPRES_DIV1_gc | TCD_ENABLE_bm);

er funktioniert.

Aktiviere ich nun noch den PORTA.ISR ist der TCD Timer deaktiv. Der 
Port-ISR hingegen funktioniert jetzt. Was ist das?!

von Mr. AVR (Gast)


Lesenswert?

So mache ich übrigends den Pin-ISR

PORTA.PIN7CTRL = (PORT_ISC_BOTHEDGES_gc | PORT_PULLUPEN_bm);

Außerdem, mit deaktiv meine ich das er dort nicht mehr reinspringt.

von MR. AVR (Gast)


Lesenswert?

Hat keiner eine Idee?

Ich verstehe das nicht. Ich habe es mit mehreren Timern jetzt getestet 
(TCB, TCD - TCA wird bereits verwendet ohne Interrupt zur ermittlung des 
Signals am PORTA7 Interrupt).

Warum geht kein Timer-Interrupt mehr, sobald man Pin-Interrupt 
anschaltet=?!

von Route_66 H. (route_66)


Lesenswert?

Hallo!
Die Glaskugel verzerrt deinen Quelltext so sehr, dass man keine richtige 
Antwort geben kann.
Vermutung: du überfährst deinen µC mit dem Flanken-INT an PortA alle 25 
µs.
Der Timer kommt nicht mehr zum Zuge.
Alles geraten!

von c-hater (Gast)


Lesenswert?

Route 6. schrieb:

> Vermutung: du überfährst deinen µC mit dem Flanken-INT an PortA alle 25
> µs.
> Der Timer kommt nicht mehr zum Zuge.
> Alles geraten!

Könnte auch ganz simpel an einer falschen Initialisierung des 
Interruptcontrollers liegen. Den entsprechenden Codeteil (namlich das 
Enablen des zweiten Interrupts) hat er uns aber auch vorenthalten, so 
dass auch hier die Glaskugel orakeln muss...

von Mr. AVR (Gast)


Lesenswert?

c-hater schrieb:
> Route 6. schrieb:
>
>> Vermutung: du überfährst deinen µC mit dem Flanken-INT an PortA alle 25
>> µs.
>> Der Timer kommt nicht mehr zum Zuge.
>> Alles geraten!
>
> Könnte auch ganz simpel an einer falschen Initialisierung des
> Interruptcontrollers liegen. Den entsprechenden Codeteil (namlich das
> Enablen des zweiten Interrupts) hat er uns aber auch vorenthalten, so
> dass auch hier die Glaskugel orakeln muss...

Vielen Dank für die Antworten. Anbei mal die Init der Sachen. Aktuell - 
aus Testzwecken - habe ich bereits alles auskommentiert. Es ist jetzt 
nur noch im programm die beiden ISR-Routinen (jeweils wird dort ein 
Port-Pin getoggelt) mehr nicht.


Die gleiche Software lief auf einem Attiny84 auch mit 20 Mhz. Da war 
alles kein Problem. Daher wundert mich das Ganze. Ich denke auch das ich 
etwas falsch initialisiert habe. Ich frage mich nur ernsthaft was.



//make clock system without prescaler
  CPU_CCP = 0xD8;
  CLKCTRL_MCLKCTRLA = CLKCTRL_CLKSEL_OSC20M_gc;
  CPU_CCP = 0xD8;
  CLKCTRL_MCLKCTRLB = 0;

  CPU_CCP = 0xD8;
  WDT.CTRLA = 0;


  PORTA.DIR = 0b11111001;
  PORTA.OUT = 0;

  PORTB.DIR = 0b11111100;
  PORTB.OUT = 0;

  ADC0.CTRLC = (ADC_SAMPCAP_bm | ADC_REFSEL_VDDREF_gc | 
ADC_PRESC_DIV256_gc);
  ADC0.MUXPOS = (ADC_MUXPOS_AIN2_gc);
  ADC0.CTRLA = (ADC_REFSEL1_bm | ADC_ENABLE_bm);  //8bit & enable
  ADC0.COMMAND = ADC_STCONV_bm;


//Timer init with 1ms/ovf (only for timing, e.g can dimming (soft)
  //Für den Timer (interrupt)  (20 kHz)
  TCD0.CMPBCLR = 31;
  TCD0.INTCTRL = TCD_OVF_bm;
  TCD0.CTRLB = TCD_WGMODE_ONERAMP_gc;
  TCD0.CTRLA = (TCD_CLKSEL_20MHZ_gc | TCD_CNTPRES_DIV32_gc | 
TCD_SYNCPRES_DIV1_gc | TCD_ENABLE_bm);

  //timer for detection cnt
  TCA0.SINGLE.PER = 0xFF;
  TCA0.SINGLE.CTRLA = (TCA_SINGLE_CLKSEL_DIV64_gc | 
TCA_SINGLE_ENABLE_bm);


//PCINT for DCC_DETECT, Pull Up for DCC
  PORTA.PIN7CTRL = (PORT_ISC_BOTHEDGES_gc | PORT_PULLUPEN_bm);

von Mr. AVR (Gast)


Lesenswert?

ISR(PORTA_PORT_vect)
{
  tgl other pin
}

ISR(TCD0_OVF_vect)
{
  tgl pin

  //reset int ctrl
  TCD0.INTFLAGS = TCD_OVF_bm;
}

von Äxl (geloescht) (Gast)


Lesenswert?

stell mal das Projekt hier ein. wie soll man das sonst durch den 
Debugger jagen?

von Simon G. (Gast)


Angehängte Dateien:

Lesenswert?

Äxl (geloescht) schrieb:
> stell mal das Projekt hier ein. wie soll man das sonst durch den
> Debugger jagen?

Sorry für die späte Rückmeldung! Anbei mal das Testprogramm. Ich 
verzweifel langsam echt, ich verstehe nicht warum das nicht geht. So 
eine Sache wäre bei einem "normalen" Tiny oder Mega kein Problem. Selbst 
bei einem XMega habe ich sowas am Laufen.

Bin echt mehr als Dankbar für jede Unterstützung und Hilfe.

von axel (Gast)


Lesenswert?

Route 6. schrieb:
> Vermutung: du überfährst deinen µC mit dem Flanken-INT an PortA alle 25
> µs.
> Der Timer kommt nicht mehr zum Zuge.

Magst Du das bitte mal ernster nehmen?

von axel (Gast)


Lesenswert?

Das Intflag muss im Pininterrupt manuell zurückgesetzt werden.

von Mr. AVR (Gast)


Lesenswert?

axel schrieb:
> Das Intflag muss im Pininterrupt manuell zurückgesetzt werden.

H am Pinint? Beim Timer habe ich es gelesen das es gemacht werden muss, 
teste ich danke Timer. Finde das doof das man das manuell machen muss.

von Simon G. (Gast)


Lesenswert?

axel schrieb:
> Das Intflag muss im Pininterrupt manuell zurückgesetzt werden.

Danke, das war es wiklich. Jetzt läuft alles wie vorher auf dem Tiny84 
auch. Super danke. Super Teil, dann kann ich den jetzt ersetzen den 
Tiny84.

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.