You are on page 1of 3

// Sgezahn.cpp : Definiert den Einstiegspunkt fr die Konsolenanwendung. // #include "stdafx.h" // Headerdateien #include <drv_ioport.h> #include <stdint.h> #include <stdlib.

h> #include <drv_dac084s085.h> #include <devices.h> #include <timers.h> // spezielle Headerdatei fuer die Interrupts (Unterbrechung , Steuerung vom Mikroprozessor) timer_handler_t TimerISR(void *context); // Interrupt Service - Routine, eine Fu nktion die ausgefuehrt wird wenn der Interrupt kommt ioport_t *ptrLED; // Zeiger vom Datentyp ioport_t, zeigt auf ein/ mehrerer Geraete, vermutlich die Wishbones dac084s085_t *ptrDAC; // siehe eine Zeile davor //static uint32_t cnt= 0; das war der vorherige Ausgang vom DA-Wandler, der imm er hoch gezaehlt wurde static bool TimerFlag = 0; // Schalter zur Erkennung vom Interrupt, TimerFlag == 1, wenn Interrupt ausgeloest wurde; wenn TimerFlag == =, // kein Interrupt ausgelst; es wird hier jede Mikrosekunde ein Interrupt ausgelo est; Static -> wenn mehrere Fkt. parallel arbeiten void main (void) {en double periode double frequenz z double maxFrequenz n darf; eventuell kann sie et werden koennen double schrittweite = 1 / maxFrequenz; // Mit jeder Schrittweite wird ei n neuer Wert gezeichnet bzw. Punkt gemalt double anzahlXWerte = 0; // Werte insgesamt, die in einer Periode ausgeg eben werden double schritthoehe = 0; // Mit jeder Schritthoehe wird ein neuer Wert g ezeichnet double taktfrequenz = 50000000; // Mit dieser Taktfrequenz arbeitet der Mikroprozessor (50 MHz) double taktzeit = 1 / taktfrequenz; // So lange dauert ein Takt; Keh rwert von der Taktfrequenz double output = 0; // Ausgang, also was auf dem DA-Wandler ausgege ben wird double zaehlwert = schrittweite / taktzeit; // Alle 50 Takte (zaehlwe rt == 50 bzw. zaehlwert = 50 ) //soll ein Wert ausgegeben bzw. der Interrupt ausgeloest werden // Hauptfunktion = 0; // siehe T in der Skizze = 0; // Eingabe der Frequenz bzw. angegebene Frequen = 1000000; // Hoechste Frequenz, die eigegeben werde hoeher sein, //allerhoechstens 25 MHz, damit 2 Pkt. gezeichn

timer_register_handler(0, zaehlwert, TimerISR); // 0 ?? -> faengt entwed er bei Null an oder wird bei Null zurueckgesetzt?? // wenn timer_register_handler zaehlwert erreicht hat, soll er in TimerISR

ptrLED = ioport_open (DRV_IOPORT_1); // Ports / Anschluesse ptrDAC = dac084s085_open(DAC);

dac084s085_write(prtDAC, 0, output, true); // vermutlich O szilloskop <==> Nanobaord/DAC Eingaenge/ Ausgaenge dac084s085_write(prtDAC, DAC0845085_OUTB, output, false); dac084s085_write(prtDAC, DAC0845085_OUTC, output, false); dac084s085_write(prtDAC, DAC0845085_OUTD, output, false); ioport_set_value(ptrLED, 0, output); printf("Bitte geben Sie eine beliebige Frequenz zwischen 0 und 1.000.000 Hz ein: "); // Eingabeaufforderung bzw. Benutzeraufforderung einen Wert einzuge ben scanf("%d", &frequenz); // Einlesen von der Frequenz, die auf der Tastau r eingegeben wird if ( frequenz <= maxFrequenz && frequenz > 0) // diese Bedingung muss er fuellt, sein sonst geht Programm nicht rein bzw. if, somt wird das Programm nich t ausgefuehrt und es kommt eine Warnmeldung { periode = 1 / frequenz; // Brechnung der Periode mit der Benutze r eingegebenen Frequenz anzahlXWerte = periode / schrittweite ; // Berechnung der Punkte , die in einer Periode vorhanden sind schritthoehe = 255 / anzahlXWerte ; // Brechnung der Schritthoeh e; 255 kann hstens ausgegeben werden -> //Wert kommt vom 8-bit DA-Wandler (Rechn ung: 2^8= 256, es wird aber von Null gezaehlt und nicht von 1) for (;;) // Endlosschleife, hoert nicht auf, der Saegezahn geht immer weiter, hoert auf, wenn man die Schleife abbricht { if (TimerFlag == 1) // ein Interrupt wurde ausgeloest -> siehe TimeFlag == 1 { dac084s085_write(prtDAC, DAC0845085_OUTA, (int) output, true); // Ausgabe OutA beim DAC ioport_set_value(ptrLED, 0, (int) output); // Um wandlung double in int (Type cast = Typeumwandlung output += schritthoehe; // Output wird immer um die Schritthoehe erhoeht, in diesem Fall ist es abhaengig von der Frequenz, //je nach dem welche vom Benutzer eingegeben wir d if (output > 255) // Der naechste Saegez ahn wird gezeichnet { output = 0; // Output gibt paar Takte weiter eine Null aus, dac084s085_write(prtDAC, DAC0845 085_OUTA, output, true); ioport_set_value(ptrLED, 0, (int ) output); }//f (output > 255) TimerFlag = 0; // Fuer neue Interrupterkennung m

uss TimerFlag wieder auf Null gesetzt werden }//if (TimerFlag == 1) }//for (;;) }//if ( frequenz <= maxFrequenz) else { printf("Ungueltige Eingabe der Frequenz!"); } sytem("PAUSE"); }//void main (void) timer_handler_t TimerISR(void *context) { TimerFlag = 1; return NULL; }

You might also like