z8 encore: Timer wird nicht angesprungen

OP #1453194
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
OP #1453493
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.
OP #1453585
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
Gast #1453592
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
}
Angehängte Dateien:
OP #1453618
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
Gast #1453761
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 );

@????
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren