Forum: Mikrocontroller und Digitale Elektronik Interrupt bei PIC16F873a SDCC löst nicht aus


von Andy (Gast)


Lesenswert?

Hallo,

Ich bin am Verzweifeln. Ich hab scho überall nach Lösungen gesucht aber 
nichts hat funktioniert.

An meinen PIC hab ich ein 2. Externes Quarz (32768Hz) an RC0 und RC1 
angeschlossen.
Der Timer 1 soll bis zum Overflow zählen und dann einen Interrupt 
werfen.
Im Interrupt soll mir dann ein Buchstabe angezeigt werden.

Geschrieben habe ich den Code für den SDC-Compiler:
1
#define __16f873
2
#include "pic/pic16f873a.h"
3
#include "LCD/lcd.h"
4
5
typedef unsigned int config;
6
config at 0x2007 __CONFIG = _CP_OFF & 
7
 _WDT_OFF & 
8
 _BODEN_OFF & 
9
 _PWRTE_ON & 
10
 _HS_OSC & 
11
 _LVP_OFF;
12
13
14
static void Intr(void) interrupt 0  //auszulösender Inter.
15
{
16
  LCD_write_char('I');
17
  TMR1IF = 0;
18
  TMR1IE = 1;
19
}
20
21
void main()
22
{
23
  TRISB = 0x00;               // PortB als Ausgang
24
  TRISA = 0xff;               // PortA als Eingang
25
  TRISC &= 0x03;              // PortC als Ausgang (ausser PC0 PC1)
26
  
27
  ADCON1 = 0x06;              // PortA alles auf D I/O
28
  PORTB = 0x00;
29
  
30
  TMR1CS = 1;                 // Externes Quarz aktiviert
31
  TMR1IE = 1;                 // Timer 1 Interrupt durch Overflow
32
  TMR1ON = 1;                 // Timer 1 wird aktiviert
33
  NOT_T1SYNC = 1;             // Synchronisation deaktiviert
34
  T1OSCEN = 1;                // Zähler aktiviert
35
  T1CKPS0 = 0;                // kein Vorteiler
36
  T1CKPS1 = 0;                // kein Vorteiler
37
  TMR1IF = 0;                 // Timer1-Interruptflag löschen
38
  while ( !GIE )              // Globaler Interrupt aktiviert
39
    GIE=1;
40
  
41
  init_LCD();
42
  
43
  LCD_write_char('T');
44
  while(1);                   // Endlosschleife
45
}

Das LCD funktioniert, Das T wird mir ausgegeben. Der Interrupt soll 
jedesmal I schrieben wenn er ausgelöst wird, was aber nicht geschieht.

Der Zähler zählt, das habe Ich schon getestet.

Ich hoffe jemand kann mir helfen.

MfG Andy

von Andy (Gast)


Lesenswert?

Hi,

Lösung gefunden.

Ich hab vergessen das PEIE-Flag zu setzen:
1
#define __16f873
2
#include "pic/pic16f873a.h"
3
#include "LCD/lcd.h"
4
5
typedef unsigned int config;
6
config at 0x2007 __CONFIG = _CP_OFF & 
7
 _WDT_OFF & 
8
 _BODEN_OFF & 
9
 _PWRTE_ON & 
10
 _HS_OSC & 
11
 _LVP_OFF;
12
13
14
static void Intr(void) interrupt 0  //auszulösender Inter.
15
{
16
  LCD_write_char('I');
17
  TMR1IF = 0;
18
  TMR1IE = 1;
19
}
20
21
void main()
22
{
23
  TRISB = 0x00;               // PortB als Ausgang
24
  TRISA = 0xff;               // PortA als Eingang
25
  TRISC &= 0x03;              // PortC als Ausgang (ausser PC0 PC1)
26
  
27
  ADCON1 = 0x06;              // PortA alles auf D I/O
28
  PORTB = 0x00;
29
  
30
  TMR1CS = 1;                 // Externes Quarz aktiviert
31
  TMR1IE = 1;                 // Timer 1 Interrupt durch Overflow
32
  TMR1ON = 1;                 // Timer 1 wird aktiviert
33
  NOT_T1SYNC = 1;             // Synchronisation deaktiviert
34
  T1OSCEN = 1;                // Zähler aktiviert
35
  T1CKPS0 = 0;                // kein Vorteiler
36
  T1CKPS1 = 0;                // kein Vorteiler
37
  PEIE=1;                     // <--------------------------------
38
  TMR1IF = 0;                 // Timer1-Interruptflag löschen
39
  while ( !GIE )              // Globaler Interrupt aktiviert
40
    GIE=1;
41
  
42
  init_LCD();
43
  
44
  LCD_write_char('T');
45
  while(1);                   // Endlosschleife
46
}

PEIE setzt erlaubt externe Interrupts, die auch für den Timer 1 benötigt 
werden. Was übringends im Datenblatt nur sehr versteckt zu finden ist...

Ich hoffe es hilft jemandem

MfG Andy

von Stephan S. (uxdx)


Lesenswert?

Das ist aber nur für Interrupts notwendig. Um den Timer-Überlauf zu 
testen, muss man nur das TMR1IF-Flag im Register PIR1 abfragen (muss 
vorher zurückgesetzt werden), das gilt auch für das Aufwachen aus einem 
SLEEP-Befehl.

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.