www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer 8051


Autor: Steffen (Gast)
Datum:

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

Autor: Thomas D (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas,

meinst du den im IEN0?

Den Interrupt Enable all hab ich gesetzt.

Oder gibts da noch was anderes?

Grüße
Steffen

Autor: buz11 (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: buz11 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry , der interrupt Timer 0 ist bei 0x000B  ...

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

Autor: buz11 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal :

TMOD = 0b00000010

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Hier der Link zum Datenblatt von Atmel.

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

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

Autor: Steffen (Gast)
Datum:

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

Autor: Arne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermisse die Zeile:

setb EA ;allgemein Interrupts zulassen

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

Gruß,
Arne

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Arne,

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

 IEN0 = 0x82; // Interrupt Enable

Viele Grüße
Steffen

Autor: Arne (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: sorin7486 (Gast)
Datum:

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

Autor: Alex (Gast)
Datum:

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

Autor: Helmut Lenzen (helmi1)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach Peter

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

Gruss Helmi

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank!

Also einfach vergessen....;)

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So isses

Gruss Helmi

Autor: Ampfing (Gast)
Datum:

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

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.