/*
Beispielprogramm (IAR-Compiler) fuer PWM-Ausgabe ohne Optimierung.
Das PWM-Intervall betraegt SCHRITTE * 32us -> 3,2ms.
Pro Intervall wird jedes Portbit maximal zweimal veraendert: set-reset.
Ein Ausgabewert von SCHRITTE/2 erzeugt ein Ausgangssignal von ca. 310 Hz.

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
// Die Ausfuerungszeit des Interrupt haengt entscheidend von der
// Optimierung des Compilers bei der Indizierung in der Schleife ab !!!
// besser: Schleife aufloesen


void interrupt [TIMER0_OVF0_vect] timer0_int()
{
static unsigned char schritt = 0;
unsigned char neuer_wert, i;
  neuer_wert = 0;				// neues Ergebnis loeschen
  for(i=MAX_KANAL; i-- > 0;) {	// Schleife zur besseren Uebersicht
    neuer_wert <<= 1;           // '0' einschieben fuer naechstes Bit
    if(wert[i] > schritt) {		//
      neuer_wert |= 1;          // unteres Bit setzen
    }
  }
  PORTA=neuer_wert;				// Ergebnis ausgeben
  if(++schritt >= SCHRITTE) schritt = 0;	// fuer naechsten Aufruf
}

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);
}