Daniel wrote:
> Sorry hab leider immer noch nicht des so hin bekommen das erzählt aber> danke nochmal!
Wird deine Interrupt Funktion überhaupt aufgerufen?
(Mach da mal in der Interrupt Funktion eine LED an und
sieh nach ob sie auch tatsählich eingeschaltet wird)
Ansonsten:
volatile char timer;
timer=10000;
Das wirds nicht spielen. Ein char hat gerade mal 8 Bit.
Damit kannst du bis 255 zählen. Mehr aber auch nicht.
(Hat der Compiler da gar nichts dazu gesagt ?)
if (timer>0) timer++;
Ich denke mal, du willst den Timer runterzählen auf 0
und nicht hochzählen.
Mach doch mal folgendes:
Lass dir in der Inerruptfunktion den aktuellen Timer
Wert ausgeben.
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0xC7;
sprintf(szTemp,"%06d", timer);
lcd_gotoxy(0,0);
lcd_puts(szTemp);
timer--;
}
und beobachte mal, ob sich überhaupt was tut.
Normalerweise ist es unklug in einer Interrupt Funktion
solch aufwändige Dinge wie LCD Ausgaben zu machen. Da
du aber einen Vorteiler von 1024 hast, solltest du etwas Zeit
haben um das zu tun. Und wenn zwischendurch mal ein Interrupt
verloren geht, ist es bei diesem Testprogramm kein Beinbruch.
Es geht lediglich darum festzustellen, ob der Interrupt auch
ausgelöst wird.
Daniel wrote:
> Ne bei meinem Code geht leider gar nichts!
Was heist gar nichts?
Kriegst du auch keine Ausgabe in der Interrupt Funktion?
Dann wird der nicht aufgerufen. Jetzt heist es erst mal
rausfinden warum.
Daniel wrote:
Vielleicht ist das ja beim 8515 anders.
Aber bei den Prozessoren die ich benutze, ist
das hier
>> // Timer(s)/Counter(s) Interrupt(s) initialization> TIMSK=0x02;
die Initialisierung für einen Interrupt bei einem Compare
Match.
Du willst aber einen Overflow Interrupt haben. Da muesste
es
TIMSK = 0x01;
heissen.
Probier doch mal dieses hier:
1
#include<90s8515.h>
2
#include<stdio.h>
3
#asm
4
.equ__lcd_port=0x15;PORTC
5
#endasm
6
#include<lcd.h>
7
8
volatileinttimer;
9
charszTemp[16+1];
10
11
// Timer 0 overflow interrupt service routine
12
interrupt[TIM0_OVF]voidtimer0_ovf_isr(void)
13
{
14
sprintf(szTemp,"%06d",timer);
15
lcd_gotoxy(0,0);
16
lcd_puts(szTemp);
17
18
timer++;
19
}
20
21
voidmain(void)
22
{
23
PORTC=0x00;
24
DDRC=0xFF;
25
26
// LCD module initialization
27
lcd_init(16);
28
29
TCCR0=0x05;
30
TIMSK=0x01;
31
32
// Global enable interrupts
33
#asm("sei")
34
35
while(1)
36
{
37
;
38
}
39
}
Änderungen:
* Alles was nicht unmittelbar mit dem Timer, Interrupt oder
LCD zu tun hat, ist rausgeflogen
* Der Vorteiler wurde auf Maximum, also auf 1024
gesetzt.
* Im TIMSK wurde der Overflow Interrupt und nicht der Compare
Match Interrupt freigegeben.
Daniel Ascher wrote:
> Vielen Dank!>> Jetzt gehts! :D>> Kann man jetzt eigentlich die Zeit auch in 00:00:00 noch einteilen?>
Sicher. So wie du das gemacht hast, ist das mal ein erster
Schritt.
Dein Problem war, dass du den falschen Interrupt freigegeben
hast.
Mit Datenblatt anstelle von 'Erstell-mir-mal-ein-Programmgerüst-
Wizzard" wär dir das nicht passiert.
Bin leider erst am anfang meiner C Karriere hab den Compiler erst seid 3
Wochen wieder.
Dank dir nochmal vielleicht hast du ja mal zeit mir noch ein paar Fragen
zu beantworten! :D
Gruß