Forum: Mikrocontroller und Digitale Elektronik [PIC16F690] Kein TMR1-Interrupt mit Quarz


von Manuel H. (manuel_h)


Lesenswert?

Hallo Leute!

Habe einen 32.768kHz Quarz an OSC1/OSC2 hängen, welcher auch schwingt. 
Jedoch wird das Interrupt für den Timer1 nicht ausgelöst und ich weiß 
nicht warum, liegt es an der Konfiguration?
1
ANSEL=0;
2
  ANSELH=0;
3
  
4
  TRISA=0b11111011;
5
  TRISB=0b11111111;
6
  TRISC=0b11100000;
7
  
8
  PORTA=0b00000000;
9
  PORTB=0b00000000;
10
  PORTC=0b00000000;
11
  
12
  //----Interrupt-Initialisierung-------
13
  RABIF=0;
14
  TMR1IF=0;  
15
  GIE=1;
16
  PEIE=1;
17
  TMR1IE=1;
18
  RABIE=1;
19
  IOCA0=1;
20
  IOCA1=1;
21
  
22
  //----Timer1-Initialisierung----------
23
  T1CON=0b00111111;
24
       //T1GINV(1) TMR1GE(2) T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

von iaoffline (Gast)


Lesenswert?

Manuel H. schrieb:
> Jedoch wird das Interrupt für den Timer1 nicht ausgelöst

Sieht erstmal alles richtig aus. Hast du mal das TMR1 (Zählregister) 
ausgelesen um zu sehen ob er überhaupt zählt? Nächster Schritt wäre dann 
einen anderen Interrupt zu triggern um zu sehen ob das funzt.

von Carsten M. (ccp1con)


Lesenswert?

Läuft der Chip überhaupt?
Hast du MCLR richtig beschalten?
Wie sieht denn das Konfigurationswort aus?
Und wie stellst du fest, dass der Interrupt nicht stattfindet?

PS: Ich lese gerade der 16F690 hat bereits einen eingebauten low-power 
crystal oszillator für Timer1. Just to let you know.

von Manuel H. (Gast)


Lesenswert?

Hallo!

Meine Konfiguration ist folgende:

__CONFIG(FOSC_LP & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CPD_OFF & CP_OFF & 
BOREN_OFF & IESO_OFF & FCMEN_OFF);

und dass kein Interrupt ausgeführt wird merke ich an folgendem Code:
1
void interrupt isr(void)
2
{
3
  if(TMR1IF==1)
4
  {
5
    clock++;
6
    clock2++;
7
    if((clock%2048)==0)//alle 500ms wird halftakt getoggled
8
    {
9
      halftakt=~halftakt;
10
    }
11
    else if((clock%4096)==0)//alle 1000ms wird takt getoggled
12
    {
13
      takt=~takt;
14
      clock=0;
15
    }
16
    if((clock2%40960)==0)//alle 10000ms wird pressed auf 0 gesetzt (damit bei Einstellen der Minuten von 59 auf 0, Stunde nicht um 1 erhöht wird)
17
    {
18
      pressed=0;
19
      clock2=0;
20
    }
21
    TMR1IF=0;
22
  }

In dem TMR1IF==1 Zweig habe ich direkt mal RA2=~RA2; stehen gehabt, 
welches bei mir eine LED über einen Transistor toggled.

Wie soll ich denn TMR1-Zählregister auslesen, während der PIC läuft, 
beim Debuggen übers PICkit v2 kommt bei mir nur eine Fehlermeldung, weiß 
jetzt nicht genau welche aber ich muss jetzt grad weg kann nachher 
nochmal nachschauen.

Andere Interrupts funktionieren, hab noch zwei tastergesteuerte 
Interrupts welche funktionieren.

von Manuel H. (Gast)


Lesenswert?

btw. der Chip läuft, aber bei MCLR habe ich nichts beschalten, der is 
alleinstehend ;)

von iaoffline (Gast)


Lesenswert?

Manuel H. schrieb:
> n dem TMR1IF==1 Zweig habe ich direkt mal RA2=~RA2; stehen gehabt,
> welches bei mir eine LED über einen Transistor toggled.

und mit welchem Ergebnis?

Manuel H. schrieb:
> Wie soll ich denn TMR1-Zählregister auslesen,

z.B. mit:

Wenn TMR1L ungleich TMR1L bei der letzten Abfrage dann toggle ne Led

von Manuel H. (Gast)


Lesenswert?

Ach danke, hatte einen Denkfehler im Programm. Nun toggled die Led im 
halben Sekunden Takt, ich wollte aber das interrupt alle halben sekunden 
haben. Dazu musst ich aber die zählregister miteinberechnen in meine 
rechnung.

Gut dass wenigstens dieses Problem schonmal gelöst ist. Danke!!

von Manuel H. (manuel_h)


Lesenswert?

Haha hab ein neues Problem, seit grade eben habe ich ein unregelmäßigen 
Interrupt, eingestellt auf alle 500ms kriege ich zuerst ein Interrupt 
nach 500 ms das nächste nach 250ms und dann wieder 500ms und so weiter. 
WIe kann sowas kommen?

von iaoffline (Gast)


Lesenswert?

Manuel H. schrieb:
> kriege ich zuerst ein Interrupt
> nach 500 ms das nächste nach 250ms und dann wieder 500ms und so weiter.
> WIe kann sowas kommen?

Watchdog, BrownOut, anderer Timer, Programmfehler etc.

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.