Forum: Mikrocontroller und Digitale Elektronik Timer 8051


von Steffen (Gast)


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

von Thomas D (Gast)


Lesenswert?

Hi

Also da gibt´s glaub ich noch nen enable all der auch gesetzt sein
muss!! EAL, EA oder so ähnlich.

Gruß          Thomas D

von Steffen (Gast)


Lesenswert?

Hallo Thomas,

meinst du den im IEN0?

Den Interrupt Enable all hab ich gesetzt.

Oder gibts da noch was anderes?

Grüße
Steffen

von buz11 (Gast)


Lesenswert?

mit TMOD = 0b00000000 hast Du den 13-bit Timer (8048 compatible)

TCON und IE sind ok .


Wie sieht es aus mit der VECTOR ADDRESS (0013H) (=Einsprungsadresse)
für timer 0 ?

von Steffen (Gast)


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

von buz11 (Gast)


Lesenswert?

Sorry , der interrupt Timer 0 ist bei 0x000B  ...

Aber :
" TMOD = 0x00 ist der 8 bit Timer mit 5 bit Prescaler "
stimmt nicht .

von buz11 (Gast)


Lesenswert?

Probier mal :

TMOD = 0b00000010

von Steffen (Gast)


Lesenswert?

Hallo!

Hier der Link zum Datenblatt von Atmel.

http://www.atmel.com/dyn/resources/prod_documents/doc4109.pdf

Seite 59.

Bit 0 und Bit 1: 0 und 0 für Mode 0
Mode 0 = 8 bit Timer + 5 bit Prescaler.

Oder habe ich da etwas übersehen?

Selbst wenn es der 13 bit Timer wäre, müsste er dennoch in die
Interrupt Routine springen, oder nicht?

Grüße
Steffen

von Steffen (Gast)


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

von Arne (Gast)


Lesenswert?

Ich vermisse die Zeile:

setb EA ;allgemein Interrupts zulassen

ohne dem wird kein Interrupt gleich welche Art ausgeführt!

Gruß,
Arne

von Steffen (Gast)


Lesenswert?

Hallo Arne,

Das EA bit ist Bit7 im Register IEN0 und wird hier gesetzt:

 IEN0 = 0x82; // Interrupt Enable

Viele Grüße
Steffen

von Arne (Gast)


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

von Steffen (Gast)


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

von sorin7486 (Gast)


Lesenswert?

Hello... I don't speak german. I am a student and I wold like to buy an
AT89C51SND chip. Can you tell me where I could find it online

10q

von Alex (Gast)


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!

von Helmut L. (helmi1)


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

von Peter D. (peda)


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

von Helmut L. (helmi1)


Lesenswert?

Ach Peter

dann bist du das also fuer den Intel den damals eingebaut hat.

Gruss Helmi

von Alex (Gast)


Lesenswert?

Besten Dank!

Also einfach vergessen....;)

von Helmut L. (helmi1)


Lesenswert?

So isses

Gruss Helmi

von Ampfing (Gast)


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

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.