Hallo,
Ich habe grad irgendwie ein Problem zwei Timer vernünftig zum Laufen zu bringen.
Also erstmal etwas vorab. Es handelt sich um eine Aufgabe aus einem Praktikum begleitend zur Mikroprozessortechnikvorlesung. Die Aufgabe ist es ein Programm zu schreiben, welches aus einem Array (gefüllt mit Frequenzen und Tondauern) Ein Lied wiedergeben soll. Dafür wird der Pin P1.0 getoggled, welcher an einen Piepser angeschlossen ist. Die Vorgabe war es das Array in der Hauptroutine also in main() und nicht in den Interrupts abzuarbeiten. Das hätte aber meiner Meinung zur Folge, dass man in main() undweigerlich eine Endlosschleife hätte solange die Melodie spielt. Ich möchte aber den IDLE-Modus der CPU benutzen, also muss ich auf Endlosschleifen verzichten. Also habe ich mir ein komplett anderes Konzept überlegt.
Die main() startet nur den Timer0. Danach ist main() zu ende und die CPU kann sich schlafenlegen.
In Timer0 soll jetzt Timer1 gestartet werden, aber genau das gelingt mir jetzt nicht. Timer1 soll also einen Timer-Reload-Wert bekommen, der zur Frequenz des aktuellen Tons passt. Timer0 soll bei einer Pause den Timer1 anhalten und bei einer Tonänderung die Reloadwerte von Timer1 entsprechend dem neuen Ton ändern.
Nur irgendwie bekomme ich den Timer1 nicht vernünftig zum laufen. Ich habe am Ende jetzt mal meinen aktuellen Code angehängt. Das steht zwar auch viel Müll mit drin, aber ich wollte den lieber komplett posten. Man hört momentan ungefähr im Sekundentakt einmal einen Ton und dann eine Sekunde wieder keinen Ton. Die Frequenz des Tons liegt bei ca 140 Hz. Aber ich kann bei den Timer-Reloadwerten einstellen was ich will, der Ton ändert sich gar nicht.
Ich vermute mein Fehler liegt irgendwo bei TMOD.
Ich hab hier für TMOD folgende Inhaltsangabe:
| für Timer 1 | für Timer 0 | |Gate|C/T | M1 | M0 |Gate|C/T | M1 | M0 |
C/T : 1:Counter, 0:Timer
Sieht jemand meinen Fehler? Es würde mir ja schon reichen, wenn beide Timer erstmal nur vernünftig mit den angegebenen Reload-Werten anlaufen.
Der unten mit /XXX eingekesselte Code ist der Code aus einer vorangegangenen Aufgabe, mit der der Timer0 gestartet wurde. Dieser Code funktionierte auch.
#include #include #include "cToolMod.h" #include "cLCDMod.h" #include "Reg552FHMS.h" //#define K 4608 // 5ms //#define TH1_Reloadwert (65536-K) >>8 //#define TL1_Reloadwert (65536-K) & 0x00FF
extern code Melodie;
unsigned int uiFrequenz; unsigned int uiDauer;
unsigned char TH0_Reloadwert = 0; unsigned char TL0_Reloadwert = 0;
void int_T0 (void) interrupt 1 // IR-Routine fr Tondauer { static unsigned char repeat_timer=1;
//unsigned int inhalt,i; //unsigned int code *piMel; // Deklaration Zeiger //piMel=(unsigned int code *)&Melodie; // Startwert
//sizeof(__memt__)
TMOD &= 0xf0; // Timer 1 unverndert lassen TMOD |= 1; // Timer 0 Modus 1
PT1 = 0; // Timer 1 Prioritt niedrig ET1 = 1; // Timer 1 individuelles Freigabeflag
PX1 = 1; // Taste Prioritt niedrig EX1 = 1; // Taste individuelles Freigabeflag
TH1 = 0x5f; TL1 = 0xf0; TR1 = 1; // Timer 1 starten
EA = 1;
TR0 = 0; // Timer 0 beenden
repeat_timer--; if (repeat_timer == 0) { repeat_timer=0; }
}void int_T1 (void) interrupt 3 // IR-Routine fr Frequenz { //TR1 = 0; // Timer 1 anhalten //TH1 = TH0_Reloadwert; //TL1 = TL0_Reloadwert; //TR1 = 1; // Timer 1 starten
P10 = ~P10; }
main() { unsigned int inhalt,i; unsigned int code *piMel; // Deklaration Zeiger piMel=(unsigned int code *)&Melodie; // Startwert
LCDInit();
//for (i=0;i