Hallo,
ich bin dabei, ein kleines Beispielprogramm für
http://www.mikrocontroller.net/articles/EZ8_Beispielprogramme zu
schreiben. Dabei soll eine leuchtende LED durch einen Timer unterbrochen
werden. Meinem Code nach sollte die LED durch den Timer-Interrupt
gelöscht werden. Leider wird meine Interruptroutine nicht angesprungen,
die LED bleibt immer an. Vielleicht hat hier jemand schon etwas mit dem
eZ8 zu tun gebabt und sieht meinen Fehler.
1
INCLUDE "ez8.inc"
2
3
VECTOR RESET = startme
4
VECTOR TIMER0 = timtaylor
5
6
startme:
7
LDX PCADDR,#%07 ; Alternate Function Port C
8
LDX PCCTL, #%FF ; All Pins alternate function
9
LDX LEDEN, #%FF ; LED enable all pins
10
LDX LEDLVLH,#%FF ; LED level high value (13mA)
11
LDX T0L, #%00 ; Timer 0 Counter Register Low = 00
12
LDX T0CTL0, #%00 ; Timer 0 Control Register 0 (Interrupt)
Niemand hier, der den z8 verwendet?
Ich glaube ja, daß es an den Timer-Registern liegt, aber ich habe schon
alle nach Datenblatt plausiblen Werte ausprobiert. Keiner eine Idee?
Wo machst du das Enable des Timer0 (Bit7 von T0CTL =TEN auf 1 setzen)?
Wo machst du das globale Enable Interrupts?
Welchen µC hast du genau, wenn du die beiden Register T0CTL0 und T0CTL1
hast? Ich habe nur Stellen gefunden, bei denen es ein T0CTL gibt.
Von welchem Datenblatt gehst du aus?
Ah ich habe ein Datenblatt mit getrennten T0CTLx Registern. Das enable
timer ist geklärt (T0CTL1 = 0xB9 macht es).
Ich schätze es fehlt die Antwort auf die zweite Frage: Die EI
Instruktion fehlt, also das sog. "Master Interrupt Enable".
Stefan B. schrieb:
> Welchen µC hast du genau, wenn du die beiden Register T0CTL0 und T0CTL1> hast? Ich habe nur Stellen gefunden, bei denen es ein T0CTL gibt.
Ich habe den Z8F082A auf einem original Zilog-Board.
> Von welchem Datenblatt gehst du aus?
Ich hab das Datenblatt vom 082A zu Rate gezogen
> Ich schätze es fehlt die Antwort auf die zweite Frage: Die EI> Instruktion fehlt, also das sog. "Master Interrupt Enable".
Ich hab jetzt mal ein EI eingebaut, das Verhalten bleibt leider das
selbe, der Interrupt wird nicht angesprungen. Zusätzlich habe ich auch
noch ein "LDX IRQ0,#%20" eingebaut, damit der Timerinterrupt garantiert
nicht maskiert ist. Hilft aber auch nichts. Jetzt weiss ich gar nicht
mehr weiter.
So, jetzt blinkt's auch. Es hatte schon etwas mit Interrupt Enable zu
tun, aber EI alleine erfüllt nicht den Zweck. Ich musste manuell ein
"LDX IRQ0ENL,#%20" machen, dann geht's auch.
Hier der funktionierende Code:
Timer.c im Zip Anhang sollte helfen.
Auf der Zilog WebPage sind genug Beispiele.
Gruss Holger
Ich suche da den Z8XP via ADC mit internem Tempsensor.
bis ca. 300 Grad soll der da messen, als 10 Bit Wert. ????
//**********************************************************************
****************
//The timer0 is initialzed to generate an interrupt at every second.
//**********************************************************************
***************
void init_timer0(void)
{
SET_VECTOR(TIMER0, isr_timer0);
T0H = (char)(TIMER_START_VALUE >> 0x08);// Timer High
T0L = (char)(TIMER_START_VALUE & 0xff); // Timer Low
T0RH =(char)(RELOADVALUE >> 0x08); // Reload Compare High
T0RL =(char)(RELOADVALUE & 0xff); // Reload Compare Low
T0CTL = 0xC1; // Contineous mode
T0CTL |= SET_PRESCALE; // pre scale of 128,
IRQ0ENH |= 0x20; // Set Interrupt Priority Nominal
IRQ0ENL &= 0xDF; // Set Interrupt Priority Nominal
}
Holger schrieb:
> Ich suche da den Z8XP via ADC mit internem Tempsensor.> bis ca. 300 Grad soll der da messen, als 10 Bit Wert. ????
Mit dem internen Sensor bestimmt nicht, der Chip macht bei 150 Grad
wahrscheinlich schlapp. Du wirst einen externen Sensor brauchen.
> IRQ0ENH |= 0x20; // Set Interrupt Priority Nominal> IRQ0ENL &= 0xDF; // Set Interrupt Priority Nominal
Genau da dran hat's gelegen. Ich dachte EI macht das schon. Das kommt
davon, wenn man das Interrupt-Kapitel nicht liest und gleich bei den
Timern einsteigen will.
Mit Dank und Gruß, Iwan
Ganz schön ausgefuxt der kleine Z8. Mit Interrupt-Prios und so....
leider fehlen im Datenblatt die bequemen Codebeispiele an die man sich
beim AVR schon so schön gewöhnt hat.
Aus dem Leitfaden habe ich die PS2 Keyboard Routine untersucht.
Clock an PA7 IRQ Falling Edge-Triggert
Ich habe die 10K-Pull Up an PIN13,PIN12(A-PORT)XP(Z8F0822).
Zum testen ob der PA7 Low Edge Trigger Irq geht,
und mit einem Blinken in verschieden Frequenzen
ausgegeben wird. also mit dem Multimeter analysierbar
ist, habe ich diesen TestCode gemacht.
Gruss Holger.
----------------------------------------------------
Die Temperatur Formel im report.pdf ist aber anders.
????
10Bit ADC
0xEFE0 /20 = 307,4 Grad Celsius ???? Hmmmm
----------------------------------------------------
Die Temperatur Formel im ZIP Anhang.
-----------------------------------------------------
ADC Kanal 0x0E ist der ADC_Temperatur Kanal !
new_adc_High = ADCHigh <<3;
new_adc_low = ADCLow >>5;
int_result = new_adc_High <<8;
int_result |= new_adc_low;
int_tempCelsius_Result = (int_result - 0x18B);
/* auf 0 Grad */
int_tempCelsius_Result = int_tempCelsius_Result /5 );
@????