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