Trying to make the enemy fire

Im trying to get my enemy to fire fireballs.

I used ontriggerenter and a trigger box collider and it works but i need it to continue firing while the play is in the trigger. But when I sued ontriggerstay it goes nuts and fireballs are created every second.

FireblastManager code;

public PlayerHealth playerHealth;
public GameObject FireBlast;	
public float spawnTime; 
public Transform[] spawnPoints;

void Start () 
{
	InvokeRepeating ("Spawn", spawnTime, spawnTime); //repeat every specificed time, spawn point, amount of time to wait before doing it, time to wait before repeating it
}

// Update is called once per frame
void Spawn ()
/*{
	if (playerHealth.currentHealth <= 0f) {
		Destroy (gameObject); //Addition
		return;
	}*/
{
	int spawnPointIndex = Random.Range (0, spawnPoints.Length); //choose random spawn point

	Instantiate (FireBlast, spawnPoints [spawnPointIndex].position, spawnPoints [spawnPointIndex].rotation); //taking the random spawnpoint from previous line and using it
}

void OnTriggerStay (Collider col) 
{
	if (col.gameObject.tag == "Player")
	{
		Spawn(); 
	}
}

}

also when the fireball hits the player i get

NullReferenceException: Object reference not set to an instance of an object

Any suggestions?

It is an expected behavior. From: Unity - Scripting API: Collider.OnTriggerStay(Collider)

OnTriggerStay is called almost all the
frames for every Collider other that
is touching the trigger. The function
is on the physics timer so it won’t
necessarily run every frame.

So, what you can do is let enemy to spawn fireball at a time interval. Something like this could work:

public PlayerHealth playerHealth;
public GameObject FireBlast;    
public float spawnTime; 
public Transform[] spawnPoints;

private float spawnTime;

void Start () 
{
    InvokeRepeating ("Spawn", spawnTime, spawnTime); //repeat every specificed time, spawn point, amount of time to wait before doing it, time to wait before repeating it
}
// Update is called once per frame
void Spawn ()
/*{
    if (playerHealth.currentHealth <= 0f) {
        Destroy (gameObject); //Addition
        return;
    }*/
{
    if(Time.time - spawnTime > 3 /* this is for 3 seconds, you can change it for whatever you want*/) {
        int spawnPointIndex = Random.Range (0, spawnPoints.Length); //choose random spawn point
        Instantiate (FireBlast, spawnPoints [spawnPointIndex].position, spawnPoints [spawnPointIndex].rotation); //taking the random spawnpoint from previous line and using it
        spawnTime = Time.time;
    }
}
void OnTriggerStay (Collider col) 
{
    if (col.gameObject.tag == "Player")
    {
        Spawn(); 
    }
}

Note that, this is for 3 seconds, meaning enemy can fire a fireball once in 3 seconds as long as OnTriggerStay is triggered.