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
Hi Also da gibt´s glaub ich noch nen enable all der auch gesetzt sein muss!! EAL, EA oder so ähnlich. Gruß Thomas D
Hallo Thomas, meinst du den im IEN0? Den Interrupt Enable all hab ich gesetzt. Oder gibts da noch was anderes? Grüße Steffen
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 ?
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
Sorry , der interrupt Timer 0 ist bei 0x000B ... Aber : " TMOD = 0x00 ist der 8 bit Timer mit 5 bit Prescaler " stimmt nicht .
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
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
Ich vermisse die Zeile: setb EA ;allgemein Interrupts zulassen ohne dem wird kein Interrupt gleich welche Art ausgeführt! Gruß, Arne
Hallo Arne, Das EA bit ist Bit7 im Register IEN0 und wird hier gesetzt: IEN0 = 0x82; // Interrupt Enable Viele Grüße Steffen
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
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
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
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!
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.