/*

Beispielprogramm (IAR-Compiler) für PWM-Ausgabe mit hoher Pulsrate.
Das PWM-Intervall betraegt SCHRITTE * 32us -> 3,2ms. In diesem Intervall
werden moeglichst viele nicht zusammenhaengende Einzelimpulse erzeugt,
sodass bei einem Ausgabewert von SCHRITTE/2 50 Einzelimpulse mit ca. 15 kHz
ausgegeben werden.

Michael Nowak, www.mino-elektronik.de

Alle Angaben ohne Gewaehr !
*/

#include <io8515.h>
#include <ina90.h>	// nur fuer _SEI(); !

#define MAX_KANAL	8
#define SCHRITTE	100
unsigned char wert[MAX_KANAL];


// Aufruf alle 32us bei 8MHz CPU-Takt

void interrupt [TIMER0_OVF0_vect] timer0_int()
{
static unsigned char neuer_wert=0;	// fuer allerersten Aufruf
static unsigned char summe[MAX_KANAL];

  PORTA=neuer_wert;				// letztes Ergebnis verzoegert ausgeben
  if((summe[7]+= wert[7]) >= SCHRITTE) {	// bis Endwert ueberschritten wird
    summe[7] -= SCHRITTE;		// dann Summe korrigieren
    neuer_wert |= 1;			// und Bit setzen (Ueberlauf)
  }
  neuer_wert += neuer_wert;           // schieben fuer naechstes Bit
  if((summe[6]+= wert[6]) >= SCHRITTE) {	// bis Endwert ueberschritten wird
    summe[6] -= SCHRITTE;		// dann Summe korrigieren
    neuer_wert |= 1;			// und Bit setzen (Ueberlauf)
  }
  neuer_wert += neuer_wert;           // schieben fuer naechstes Bit
  if((summe[5]+= wert[5]) >= SCHRITTE) {	// bis Endwert ueberschritten wird
    summe[5] -= SCHRITTE;		// dann Summe korrigieren
    neuer_wert |= 1;			// und Bit setzen (Ueberlauf)
  }
  neuer_wert += neuer_wert;           // schieben fuer naechstes Bit
  if((summe[4]+= wert[4]) >= SCHRITTE) {	// bis Endwert ueberschritten wird
    summe[4] -= SCHRITTE;		// dann Summe korrigieren
    neuer_wert |= 1;			// und Bit setzen (Ueberlauf)
  }
  neuer_wert += neuer_wert;           // schieben fuer naechstes Bit
  if((summe[3]+= wert[3]) >= SCHRITTE) {	// bis Endwert ueberschritten wird
    summe[3] -= SCHRITTE;		// dann Summe korrigieren
    neuer_wert |= 1;			// und Bit setzen (Ueberlauf)
  }
  neuer_wert += neuer_wert;           // schieben fuer naechstes Bit
  if((summe[2]+= wert[2]) >= SCHRITTE) {	// bis Endwert ueberschritten wird
    summe[2] -= SCHRITTE;		// dann Summe korrigieren
    neuer_wert |= 1;			// und Bit setzen (Ueberlauf)
  }
  neuer_wert += neuer_wert;           // schieben fuer naechstes Bit
  if((summe[1]+= wert[1]) >= SCHRITTE) {	// bis Endwert ueberschritten wird
    summe[1] -= SCHRITTE;		// dann Summe korrigieren
    neuer_wert |= 1;			// und Bit setzen (Ueberlauf)
  }
  neuer_wert += neuer_wert;           // schieben fuer naechstes Bit
  if((summe[0]+= wert[0]) >= SCHRITTE) {	// bis Endwert ueberschritten wird
    summe[0] -= SCHRITTE;		// dann Summe korrigieren
    neuer_wert |= 1;			// und Bit setzen (Ueberlauf)
  }
} // neuer_wert (static) wird beim naechsten Aufruf synchron ausgegeben

C_task void main()
{
char n;
  TCCR0 = 0x01;		// timer0 ohne Vorteiler
  TIMSK |= 0x02; 	// timer0 overflow-int
  DDRA=255;			// bei 8-bit Ausgabe
  _SEI();
  for(n=0; n<MAX_KANAL; n++) wert[n] = n * (SCHRITTE/10);	// default init
  while(1);
}