www.mikrocontroller.net

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


Autor: Иван S. (ivan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin dabei, ein kleines Beispielprogramm für 
http://www.mikrocontroller.net/articles/EZ8_Beispi... 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.
INCLUDE "ez8.inc"

VECTOR RESET = startme
VECTOR TIMER0 = timtaylor

startme:
  LDX PCADDR,#%07          ; Alternate Function Port C
  LDX PCCTL, #%FF          ; All Pins alternate function
  LDX LEDEN, #%FF          ; LED enable all pins
  LDX LEDLVLH,#%FF        ; LED level high value (13mA)
  LDX T0L, #%00          ; Timer 0 Counter Register Low = 00
  LDX T0CTL0, #%00        ; Timer 0 Control Register 0 (Interrupt)
  LDX T0CTL1, #%B9        ; Timer 0 Control Register 1 (Prescaler, Mode)
gerhard:  
  JP gerhard

timtaylor:
  LDX LEDEN, #%00
  IRET

Autor: Иван S. (ivan)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Иван S. (ivan)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Иван S. (ivan)
Datum:

Bewertung
0 lesenswert
nicht 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:
INCLUDE "ez8.inc"

VECTOR RESET = startme
VECTOR TIMER0 = tim

startme:
  LDX SPL,#%ff
  LDX SPH,#%00
  EI
  LDX IRQ0ENL,#%20
  LDX PCADDR,#%07          ; Alternate Function Port C
  LDX PCCTL, #%FF          ; All Pins alternate function
  LDX LEDEN, #%FF          ; LED enable all pins
  LDX LEDLVLH,#%FF        ; LED level high value (13mA)
  LDX T0RL, #%00          ; Timer 0 Counter Register Low = 00
  LDX T0RH, #%00
  LDX T0CTL1, #%F9        ; Timer 0 Control Register 1 (Prescaler, Mode
  LDX T0CTL0, #%E0

gerhard:
  JP gerhard

tim:
  XORX LEDEN,#%FF
  IRET

Autor: Holger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
}

Autor: Иван S. (ivan)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Holger (Gast)
Datum:
Angehängte Dateien:

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

Autor: Holger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 );

@????

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.