www.mikrocontroller.net

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


Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define __16f873
#include "pic/pic16f873a.h"
#include "LCD/lcd.h"

typedef unsigned int config;
config at 0x2007 __CONFIG = _CP_OFF & 
 _WDT_OFF & 
 _BODEN_OFF & 
 _PWRTE_ON & 
 _HS_OSC & 
 _LVP_OFF;


static void Intr(void) interrupt 0  //auszulösender Inter.
{
  LCD_write_char('I');
  TMR1IF = 0;
  TMR1IE = 1;
}

void main()
{
  TRISB = 0x00;               // PortB als Ausgang
  TRISA = 0xff;               // PortA als Eingang
  TRISC &= 0x03;              // PortC als Ausgang (ausser PC0 PC1)
  
  ADCON1 = 0x06;              // PortA alles auf D I/O
  PORTB = 0x00;
  
  TMR1CS = 1;                 // Externes Quarz aktiviert
  TMR1IE = 1;                 // Timer 1 Interrupt durch Overflow
  TMR1ON = 1;                 // Timer 1 wird aktiviert
  NOT_T1SYNC = 1;             // Synchronisation deaktiviert
  T1OSCEN = 1;                // Zähler aktiviert
  T1CKPS0 = 0;                // kein Vorteiler
  T1CKPS1 = 0;                // kein Vorteiler
  TMR1IF = 0;                 // Timer1-Interruptflag löschen
  while ( !GIE )              // Globaler Interrupt aktiviert
    GIE=1;
  
  init_LCD();
  
  LCD_write_char('T');
  while(1);                   // Endlosschleife
}

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

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Lösung gefunden.

Ich hab vergessen das PEIE-Flag zu setzen:
#define __16f873
#include "pic/pic16f873a.h"
#include "LCD/lcd.h"

typedef unsigned int config;
config at 0x2007 __CONFIG = _CP_OFF & 
 _WDT_OFF & 
 _BODEN_OFF & 
 _PWRTE_ON & 
 _HS_OSC & 
 _LVP_OFF;


static void Intr(void) interrupt 0  //auszulösender Inter.
{
  LCD_write_char('I');
  TMR1IF = 0;
  TMR1IE = 1;
}

void main()
{
  TRISB = 0x00;               // PortB als Ausgang
  TRISA = 0xff;               // PortA als Eingang
  TRISC &= 0x03;              // PortC als Ausgang (ausser PC0 PC1)
  
  ADCON1 = 0x06;              // PortA alles auf D I/O
  PORTB = 0x00;
  
  TMR1CS = 1;                 // Externes Quarz aktiviert
  TMR1IE = 1;                 // Timer 1 Interrupt durch Overflow
  TMR1ON = 1;                 // Timer 1 wird aktiviert
  NOT_T1SYNC = 1;             // Synchronisation deaktiviert
  T1OSCEN = 1;                // Zähler aktiviert
  T1CKPS0 = 0;                // kein Vorteiler
  T1CKPS1 = 0;                // kein Vorteiler
  PEIE=1;                     // <--------------------------------
  TMR1IF = 0;                 // Timer1-Interruptflag löschen
  while ( !GIE )              // Globaler Interrupt aktiviert
    GIE=1;
  
  init_LCD();
  
  LCD_write_char('T');
  while(1);                   // Endlosschleife
}

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

Autor: Stephan S. (uxdx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.