Einzelnen Beitrag anzeigen

Elko

Registriert seit: 2. Feb 2008
52 Beiträge
 
Delphi 7 Personal
 
#5

Re: ISR in C erstellen

  Alt 28. Jul 2009, 23:18
Hi,
Zitat:
Wie schaltest Du den Interrupt ein?
tja, das ist eine sehr gute Frage... ich probiere jetzt noch mal ein bisschen rum, aber von den verschiedenen Registern habe ich leider sehr wenig Ahnung... Im folgenden findest Du das "Basisprogramm", auf dem ich alle C-Programme für den AN2131 aufgebaut habe. Darin ist dann logischerweise auch enthalten, wie deer Interrupt eingeschaltet wird. Es wäre echt super, wenn Du mir die mit " //*****" markierten Zeilen erklären könntest! Das stellt für mich teilweise nämlich echt ein Rätsel dar, weil es im Netz auch nur sehr wenig Anfängergerechte Erklärungen gibt
Aber ich finde es toll, wie du auf die 25 ms gekommen bist! Das könnte sehr gut mit der Blinkfrequenz übereinstimmen!

Code:
/*------------------------------------------------------------------------------
Blink.C

Copyright 1999-2003 by MmVisual - M.Müller
Erstellung BlinkLED 29.12.2001
--------------------------------------------------------------------------------
Testprogramm "Blinkende LED"

LED ist an Port PA4 des Cypress- Chips angeschlossen. Es wird nur dieser eine
Port als Ausgang definiert. Das Programm kann in den Speicher des AN21xx geladen
und gestartet werden. Sofort muss die LED anfangen zu Blinken (ca. 3 Hz).
------------------------------------------------------------------------------*/

#include <REGAN21.H>         /* Register des AN21xx   */
#include <EZREGS.H>            /* Externe Register des AN21xx */

// Definitionen der Routinen

// Belegung des Speichers
xdata unsigned char T0LED;
xdata unsigned char LED_BLINK _at_ 0x0101;   // LED blinken lassen
xdata unsigned char LED_COUNT _at_ 0x0100;   // Blinkende LED - Zähler nach Timer

xdata unsigned char iOEA _at_ 0x0110;
xdata unsigned char iOEB _at_ 0x0111;
xdata unsigned char iOEC _at_ 0x0112;
xdata unsigned char iOUTA _at_ 0x0113;
xdata unsigned char iOUTB _at_ 0x0114;
xdata unsigned char iOUTC _at_ 0x0115;
xdata unsigned char iPINSA _at_ 0x0116;
xdata unsigned char iPINSB _at_ 0x0117;
xdata unsigned char iPINSC _at_ 0x0118;

/*------------------------------------------------
The main C function. Program execution starts
here after stack initialization.
------------------------------------------------*/
void main()
{   EA = 0;

   // Ohne die folgenden 5 Zeilen kann das USB-Board sich nicht am USB-Port melden,
   // wenn Sie aus der IIC- Datei ein EEPROM herstellen!!!

   EUSB = 1; // Enable Firmware- USB //*****
   USBCS = 4; //*****
   USBIRQ = 0x1E; //*****
   IBNIRQ = IBNIEN = TOGCTL = 0; //*****
   EPIO[0] = 0x0A; // Enable Firmware- USB Ende //*****

   OUTA = 0x00;      // Register vorbelegen
   OEA = 0x30;         // LED-Out ausschalten
   T2CON = 3;      // Timer 2 aus //*****
   TR0 = 0;      // Timer 0 aus //*****
   T1M = 0;      // Clock div 12 //*****
   CT1 = 0;      // Timer- Betrieb ein //*****
   TH1 = 0x07;      // H-Register laden //*****
   TL1 = 0xC0;      // L-Register laden insgesamt: 0xF831 //*****
   TF1 = 1;      // Interrupt ein //*****
   ET1 = 1;      // Timer 1 Interrupt ein //*****
   TR1 = 1;      // Timer 1 einschalten //*****
   EA = 1;         // Interrupt ein //*****
   LED_COUNT = LED_BLINK = 1;   // Zähler zurücksetzen und Blinken einschalten
   PORTACFG = 0; //*****
   PORTBCFG = 0; //*****
   PORTCCFG = 0; //*****
   iOUTA = 0x00;      // Register vorbelegen
   iOEA = 0x30;         // LED-Out ausschalten
   
   while (1)      // IO- Werte kopieren ...
   {   OEA = iOEA;
      OEB = iOEB;
      OEC = iOEC;
      OUTA = iOUTA;
      OUTB = iOUTB;
      OUTC = iOUTC;
      iPINSA = PINSA;
      iPINSB = PINSB;
      iPINSC = PINSC;
   }
}

//————————————————————————————————————————————————————————————————
// Timer für ms- Zähler
static void T1_isr (void) interrupt 3 using 3
{   TL1 = 0xC0;      // L-Register laden insgesamt: 0xF831
   TH1 = 0x07;      // H-Register laden
   if (LED_BLINK)
   {
      if (LED_COUNT-- == 0)   // Zähler zurücksetzen
      {   LED_COUNT = 50;      // Schleifenzähler neu setzen
         iOUTA ^= 0x10;      // LED umschalten
         OUTA = iOUTA;
      }
   }
}
Wieso muss man den Timer-Interrupt eigentlich einschalten? Würde der Timer ansonsten laufen, wie vorgesehen, aber kein Interrupt und damit auch keine ISR ausgelöst?

Viele Grüße,
elko
Keyboard not found. Press any key to continue.
  Mit Zitat antworten Zitat