mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DCF 77 auf PIC18F8722


Autor: Lego (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich versuch schon seit mehrer Tagen das DCF 77 Signal auszuwerten.

mein Problem in folgendem Code ist, dass er bei einem highpegel 
nichtmehr den Interrupt verlässt, zu sehen an einer LED (LATDbits.LATD6 
= 1;).
Die if abfrage im main frägt ab, ob der Highpegel zwischen 80 und 120 
ms, oder zwischen 180 oder 220 ms lag, um somit zwischen einem high 
signal oder einem low signal zu unterscheiden.
Leider wird dieser zustand nie erreicht.

Ansich soll das Programm bisher nur unterscheiden zwischen einem 
highsignal oder einem Low Signal des DCF's.

programmiert hab ich das ganze auf einem development Tool von microchip.
http://ww1.microchip.com/downloads/en/DeviceDoc/51721b.pdf
/*********************************************************************
Projekt: 10016
Projekt von Simon Arndt
Projekt DCF77 Auswerten
*********************************************************************/


//********************************************************************
//*                       INCLUDES                                   *
//********************************************************************
#include<p18cxxx.h>


//********************************************************************
//*                  GLOBALE VARIABLEN                               *
//********************************************************************
char TMR0_high=0;
char TMR0_low=0;
unsigned int  TMR0_erg=0;


//********************************************************************
//*                  PORTB INITIALISIERUNG                           *
//********************************************************************

void PORTB_init(void)
{
  TRISB = 16;    //PORT-B-4 als Eingang Konfigurieren
  //INTCON2bits.RBPU = 0;
  LATB = 0;
}  

//********************************************************************
//*                  PORTD INITIALISIERUNG                           *
//********************************************************************

void PORTD_init(void)
{
  TRISD = 0;    //PORT D als Ausgang Konfigurieren
  LATD = 0;    //Gesamten PORTD auf 0 (LED aus)  
}

//********************************************************************
//*                    TIMER-0 INITIALISIERUNG                       *
//********************************************************************

void TMR0_init(void)
{
  T0CON = 0x87;
  TMR0H = 0x00;
  TMR0L = 0x00;
  
  T0CON = 0x97;

  
}

//********************************************************************
//*                    TIMER-0 REGISTER SETZEN                       *
//********************************************************************

void TMR0_set(void)
{
  TMR0H = 0x1B;  
  TMR0L = 0x1D;    
}

//********************************************************************
//*                   INTERRUPT   INITIALISIERUNG                    *
//********************************************************************

void Interrupt_init(void)
{
  INTCON = 0;
  INTCONbits.GIE = 1;
  INTCONbits.RBIE = 1;
}

//********************************************************************
//*                 INTERRUPT SERVICE ROUTINE                        *
//********************************************************************

#pragma /*interruptlow*/interrupthigh InterruptHandler
void InterruptHandler (void)
{
  INTCONbits.GIEH = 0;

  if (INTCONbits.RBIF == 1)
  {
    INTCONbits.RBIF = 0;  

     LATDbits.LATD6 = 1;
    
    T0CON = 0x87;

    TMR0_low  = TMR0L;
    TMR0_high = TMR0H;

    TMR0_set();      

    T0CON = 0x97;
  }  
  
  INTCONbits.GIEH = 1;

}

#pragma code _HIGH_INTERRUPT_VECTOR = 0x000008
void _high_ISR (void)
{
  _asm
    goto InterruptHandler       // Sprung zur Interruptroutine
  _endasm
}

#pragma code _LOW_INTERRUPT_VECTOR = 0x000018
void _low_ISR (void)
{
  _asm
    goto InterruptHandler       // Sprung zur Interruptroutine
  _endasm
}

//********************************************************************
//*                       MAIN                                       *
//********************************************************************

void main (void)
{
  PORTB_init();
  PORTD_init();
  TMR0_init();
  Interrupt_init();

  while(1)
  {
    LATDbits.LATD6 = 0;
    TMR0_erg = 0x00;

    INTCONbits.GIEH = 0;
    TMR0_erg = TMR0_high;
    TMR0_erg = (TMR0_erg<<8) | TMR0_low;
    INTCONbits.GIEH = 1;

    if(TMR0_erg >= 10066 && TMR0_erg <= 11629)
    {
      LATDbits.LATD0 = 1;
      LATDbits.LATD1 = 0;
    }

    else if(TMR0_erg >= 13972 && TMR0_erg <= 15535)
    {
      LATDbits.LATD1 = 1;
      LATDbits.LATD0 = 0;
    }

    else if(INTCONbits.TMR0IF == 1)
    {
      LATDbits.LATD7 = 1;
      INTCONbits.TMR0IF = 0;
    }

    else
    {
    //  LATD = 0;
    } 
  }

}

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.