Forum: Mikrocontroller und Digitale Elektronik z8 encore: Timer wird nicht angesprungen


von Иван S. (ivan)


Lesenswert?

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)
13
  LDX T0CTL1, #%B9        ; Timer 0 Control Register 1 (Prescaler, Mode)
14
gerhard:  
15
  JP gerhard
16
17
timtaylor:
18
  LDX LEDEN, #%00
19
  IRET

von Иван S. (ivan)


Lesenswert?

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?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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".

von Иван S. (ivan)


Lesenswert?

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.

von Иван S. (ivan)


Lesenswert?

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:
1
INCLUDE "ez8.inc"
2
3
VECTOR RESET = startme
4
VECTOR TIMER0 = tim
5
6
startme:
7
  LDX SPL,#%ff
8
  LDX SPH,#%00
9
  EI
10
  LDX IRQ0ENL,#%20
11
  LDX PCADDR,#%07          ; Alternate Function Port C
12
  LDX PCCTL, #%FF          ; All Pins alternate function
13
  LDX LEDEN, #%FF          ; LED enable all pins
14
  LDX LEDLVLH,#%FF        ; LED level high value (13mA)
15
  LDX T0RL, #%00          ; Timer 0 Counter Register Low = 00
16
  LDX T0RH, #%00
17
  LDX T0CTL1, #%F9        ; Timer 0 Control Register 1 (Prescaler, Mode
18
  LDX T0CTL0, #%E0
19
20
gerhard:
21
  JP gerhard
22
23
tim:
24
  XORX LEDEN,#%FF
25
  IRET

von Holger (Gast)


Angehängte Dateien:

Lesenswert?

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
}

von Иван S. (ivan)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Holger (Gast)


Angehängte Dateien:

Lesenswert?

Hier  ein guter Leitfanden für den Z8XP 08()22 ect.
Gruss Holger.

von Holger (Gast)


Angehängte Dateien:

Lesenswert?

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 );

@????

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.