Interrupt bei PIC16F873a SDCC löst nicht aus

Gast #1712874
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
Gast #1713178
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
#1713237
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.