PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer funktioniert nicht



barlip
03.03.2005, 14:31
Hi
Ich habe hier mit der Methode versucht die Signal() funktion in
die Timer()funktion über die Variable globaloverflows hinüberzuleiten.
Da ich den Timer nicht die ganze Zeit brauch sondern nur immer
speziel für verschiedenen Aufgaben. Das LED soll ned die ganze Zeit immer blinken im später Programm.
Ich hoffe ihr blickt durch.
danke

barlip
03.03.2005, 21:39
Ich habe die globaloverflow variable jetzt auch als volatile deklariert.
Aba funktioniert immer noch ned.

Arexx-Henk
03.03.2005, 22:41
Hallo barlip,

wass ist den mit:


tmp+globaloverflows;
gemeint?

dass tut nix. (mein compiler gibt hier eine warnung)

gruss

Henk

pebisoft
04.03.2005, 07:46
hallo, in den neuen winavr-version gibt es kein "outp() mehr und kein sbi und cbi". da kommen dann warnmeldungen.
mfg pebisoft

barlip
04.03.2005, 10:16
Hi
Bei meiner Version von WinAVR funktioniert sbi() und cbi() noch.
Daran kann es also ned liegen.
Warum wurden die beiden Funktionen rausgenommen?

mit : tmp+globaloverflows;
meine ich
tmp += globaloverflows; << besser ausgedrückt

also i bekommt die 50 ( 50*20ms = 1 sek.)
i wird in tmp kopiert // überflüssiger schirtt weiß auch ned warum ich das gemacht habe

auf die 50 (tmp) wird die Zahl der aktuellen überläufe(globaloverflows) draufgerechnet

nun wird for so lange "geschleift" bis 50 weitere überläufe passiert sind
also tmp == globaloverflows

da ja bei jedem über lauf globaloverflows++ passiert

SIGNAL(SIG_OVERFLOW0)
{
TCNT2= 236;
globaloverflows++;

}

TCNT2= 236; <-- ist dieser schritt eigentlich überflüssig fängt er auto matisch wieder bei 236 an ?????

oder kennt jm. ne anderen gute möglich keit das signal BUFFEROVERFLOW0
in der Hauptroutine zu empfangen??
anstatt in der nebenroutine SIGNAL()


danke für eure Hilfe

Arexx-Henk
04.03.2005, 17:50
Hallo barlip,

in SIGNAL function steht TCNT2=236 (Timer ZWEI)
in initimer function steht TCNT0=236 (Timer NUL)
vielleicht eine verschreibung?

TCNT0 ist dass actuelle Register dass hochzahlt, wenn mann
TCNT0 beliebig auslehst wird man immer ein anderen wert bekommen
abhangig von bis wie weit die timer gerade gezahlt hat beim auslesen.

Wenn du TCNT0 nicht wieder beschreibst wird die timer immer nach
MAX (0xFF) bei 0x00 anfangen. Dass aufsneu beschreiben vom TCNT im interupt function ist ja richtig.

Du hattest schon globaloverflows als volatile definiert?
volatile unsigned int globaloverflows=0;
Mit WinAvr macht dass ein richtigen unterschied.

Schick sonst mahl die compilierten listfile, kann ich vielleicht nachgucken wo's schief geht.

gruss

Henk

barlip
04.03.2005, 20:50
ja war ein schreibfehler.
so trotzdem danke für eure
hilfe,
habe nun das ganze ein bischen umgebaut und nun funktionierts..
zwar leider 2 variablen mehr aber egal.
wer will kann es sich ja mal anschauen ..
guten n'baned noch

Arexx-Henk
04.03.2005, 21:08
Ist ja auch schon,

immer freudig :-({|= wenn's functioniert.

versteh nur nicht was im interrupt function mit

if(gofs>=65000)
{
gofs = 0;
}

gemeint ist.

wenn gofs 65535 ist wird gofs auomatisch durchnummerieren
und wieder bei 0 anfangen.

gruss

Henk :)

barlip
05.03.2005, 11:05
Genau .
Aba da ich gerade 65535 nicht genau wusste sondern nur etwas mit 65xxx
und ich auch nicht mein Buch rausholen woltte habe ich einfach 65000
genommen.
Ist dieser Schritt denn eigentlich überflüssig?? Gibts es einen Bufferoverflow wenn ich einen höhere Zahl als 65535 reinspeichere? oder fängt es automatisch bei 0 an..
Theoretisch müsste doch ein Bufferoverflow passieren oder ist dort
eine Sicherung drinnnen..
danke

Arexx-Henk
05.03.2005, 12:28
ein integer is 16 bit

bit 15 (links) bis zum bit0 (rechts)
1111 1100 0000 0000
5432 1098 7654 3210
xxxx xxxx xxxx xxxx

Einige Beispiele...

0000 0000 0000 0000 = hex 0x0000 = decimal 0
0 0 0 0

0000 0000 0000 0001 = hex 0x0001 = decimal 1
0 0 0 1

0000 0000 0000 0010 = hex 0x0002 = decimal 2
0 0 0 2

0000 0000 0000 0100 = hex 0x0004 = decimal 4
0 0 0 4

0000 0000 0000 1000 = hex 0x0008 = decimal 8
0 0 0 8

0000 0000 0001 0000 = hex 0x0010 = decimal 16
0 0 1 0

usw..usw..usw...

1001 0110 1100 0111 = hex 0x96C7 = decimal 38599
9 6 C 7

1111 1111 1111 1111 = hex 0xFFFF = decimal 65535
F F F F

unsigned int var;
var = 0xFFFF; //oder var = 65535;
var=var+2;
//dann bevindet sich danach 0x0001 (1) in 'var'

65535+2=65537 oder 0xFFFF+0x0002=0x10001
0001 0000 0000 0000 0001 = 0x1FFFF
xxxx xxxx xxxx xxxx <-- nur diesen bits werden angeschaut bei 'int' uder 'unsigned int' so dort steht '1'

Dass umrechnen von hex <---> decimal kan mann auch mit die windows calculator machen.




Gruss

Henk

Arexx-Henk
05.03.2005, 12:33
65535+2=65537 oder 0xFFFF+0x0002=0x10001
0001 0000 0000 0000 0001 = 0x1FFFF

sollte sein

65535+2=65537 oder 0xFFFF+0x0002=0x10001
0001 0000 0000 0000 0001 = 0x10001 <<====



:Haue