Timer 8051

Gast #119510
Lesenswert?

Hallo!

Ich möchte den Timer0 Overflow Interrupt des AT89C51SND nutzen. Laut
Datenblatt habe ich nun folgende Register gesetzt:

  TMOD = 0b00000000;
  // Enable Timer 0 when TR0 bit is set
  // Timer Operation
  // 8 bit Counter (TH0) 5 bit Prescaler (TL0)

  TH0  = 0b10000000; // set Timer 0 Count Value
  // 8 bit Counter Wert setzen

  TL0  = 0b00000000; // set Timer 0 Prescaler
  // Prescaler auf 0 setzen

  IEN0 = 0b10000010; // Interrupt Enable
  // Enable Timer 0 Ovfl. Interrupt
  // Enable all interrupts

  TCON = 0b00010000;
  // Timer 0 enable

Ich teste das Programm im C-Spy von IAR Embedded Workbench 8051. Leider
geht er nie in die Interruptroutine hinein.

Habe ich vielleicht etwas übersehen (habe bisher nur AVR
programmiert).

Danke für eure Hilfe!
Grüße Steffen
Gast #119514
Lesenswert?

Hallo buz11,

der Interrupt Vector ist 0x000B für den Timer0 Ovfl.

Ist in dem Headerfile für den Controller bereits so festgelegt.

TMOD = 0x00 ist der 8 bit Timer mit 5 bit Prescaler. Zumindest hab ich
das im Datenblatt so gefunden.

Muss ich im IAR C_Spy irgend etwas aktivieren, damit Interrupts
simuliert werden?


Das ist die Interrupt Routine. Aber wie gesagt - ein Breakpoint darin
wird nie angesprungen.

// Timerinterrupt (TIMER 0)
interrupt [0x0B] void timer0_int (void)
{
  TH0  = 0x80; // re-set Timer 0 Count Value
  test ++;
}


Grüße
Steffen
Gast #119518
Lesenswert?

Macht keinen Unterschied.

Bei der Simulation bis 0340885840 Clockcycles ist er immer noch nicht
in die Interrupt Routine gesprungen.

Das ganze Programm: Vielleicht muss man noch was anderes
initialisieren. Stack vielleicht?


#include "io8xc51snd1.h"

int test=0;

void main (void)
{
  // AT89C51SND1C initialisieren
  TMOD = 0x02; // Timer 0 cofigure
  TH0  = 0x80; // set Timer 0 Count Value
  TL0  = 0x00; //1F; // set Timer 0 Prescaler
  IEN0 = 0x82; // Interrupt Enable
  TCON = 0x10; // Timer 0 enable

  // Hauptschleife
  do
  {

  }
  while (1);
}


// Timerinterrupt (TIMER 0)
interrupt [0x0B] void timer0_int (void)
{
  TH0  = 0x80; // re-set Timer 0 Count Value
  test ++;
}


Grüße
Steffen
Gast #119521
Lesenswert?

Jetzt wo Du es sagst sehe ich es auch... sorry, aber Deine Art der
Deklaration ist zum Teil doch eher ungwöhnlich.

Dafür habe ich es jetzt einfach mal auf einem 80C32 ausprobiert. Dein
Init ist absolut in Ordnung. Nur die Deklaration IEN0 mußte ich neben
der Syntax in IE ändern. Abschließend noch der Code (P3.1 wird
Timer-gesteuert sichtbar zum blinken gebracht):


;--- Start-Vector ---
 org 0000h
 ljmp  HPRG_Start

;--- Interrupt-Vector ---
 org 0Bh
  djnz acc,IntT0_end
  mov  a,#100d
  cpl    P3.1
IntT0_end
  reti

;--- Hauptprogram ---
 org 0100h

HPRG_Start

 ;Timer0-Einrichten/starten
  mov  TMOD, #00000000b;
  mov  TH0,  #10000000b; // set Timer 0 Count Value
  mov  TL0,  #00000000b; // set Timer 0 Prescaler
  mov  IE, #10000010b  ;mov  IEN0, #10000010b; // Interrupt Enable
  mov  TCON, #00010000b;

 ;dumm auf der Stelle treten (nichts machen)
  sjmp  $


Dein Debugger (oder was auch immer) hat da offensichtlich Sorgen! Ich
bleib lieber bei greifbarer Hardware - das Gefühl, wenn man diese bei
Sorgen an die Wand klatscht ist durch nix zu ersetzen... smile.

Gruß,
Arne
Gast #119522
Lesenswert?

Hallo Arne!

Danke für deine Antwort.
Ok - ich werd den Code mal auf dem Controller testen.

Ich hab ja schon damit gerechnet, dass es am Compiler liegt.
Danke für deine Mühe!!

Vielleicht weiß ja jemand, was man im IAR Embedded Workbench einstellen
muss, damit der Timer Interrupt simuliert wird. Oder vielleicht weiß
auch jemand, dass man da nichts einstellen muss ...

Grüße
Steffen
Gast #786776
Lesenswert?

Moin!

Könnt ihr mir kurz und knapp erklären, waeum es den 13-Bit-Mode gibt?
Ich finde keinen Unterschied, zwischen dem 16-Bit Mode, wenn ich da nur 
13 Bit nutzen würde...

Habe da was von einem Vorteiler gelesen, aber irgendwie sehe ich da 
gerade kein Unterschied!

Danke!
#786874
Lesenswert?

Der 13 Bit Mode ist aus kompalibitaets Gruenden drin.
Der 8051 hat einen Vorgaenger den 8048 und der hatte nur einen 13 Bit 
Teiler. Da Intel als Entwickler des 8051 und des 8048 den Anwender in 
etwa die gleiche Hardware vorsetzen wollte haben die ihn auch dort 
eingebaut.
Heute braucht diesen Mode des Timers kein Mensch mehr.

Gruss Helmi
#786898
Lesenswert?

Helmut Lenzen wrote:
> Der 13 Bit Mode ist aus kompalibitaets Gruenden drin.

> Heute braucht diesen Mode des Timers kein Mensch mehr.

Och, der ist schon ganz nützlich.

Bei 12MHz Quarz sind das etwa 8ms Interruptrate, gut zum Tasten 
entprellen und ähnliches.


Peter
Gast #787923
Lesenswert?

Hi,

@Steffen:
Falls Du noch mitliest hier eine Antwort auf Deine Frage bezüglich 
Interrupt-Simulation im IAR: Du musst die Interrupt Requests im IAR 
extra einstellen, da der IAR die Hardwarekomponenten leider nicht 
wirklich simulieren kann (und damit für ordentliches Simulieren 
unbrauchbar ist).
Hab leider keinen IAR mehr hier drauf, sonst könnte ich Dir genauer 
sagen, wo Du die Einstellungen findest, aber in einem Menü, das es nur 
im Debugger gibt (findest Du aber auch in der Doku zum Debugger, wenn 
ich mich recht erinnere).

Viele Grüße

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