PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sprunghafte Fehler in Timerwerten



Thomas$
11.09.2012, 17:32
Hi

ich habe Folgendes Problem

Mit einem µC erzeuge ich einen gleichmäßigen Takt


$regfile "m8def.dat"
$crystal = 10000000

Config Portd = Output

Do
Set Portd.2
Nop
Nop
Nop
Nop
Reset Portd.2

Waitms 999
Loop


Dies Klappt scheinbar auch soweit Fehlerfrei




Ein Zweiter µC Stoppt diese Zeit
Und gibt diesen wert über uart aus


$regfile "m8def.dat"
$crystal = 10000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 9600

Config Timer0 = Timer , Prescale = 1
Config Timer1 = Timer , Prescale = 256
Config Int0 = Rising
'6 Takte für Timer

Enable Interrupts

Enable Int0 'enable the interrupt

On Int0 Send Nosave


Stop Timer0
Stop Timer1
Timer0 = 0
Timer1 = 0

Start Timer0
Start Timer1

Do

Loop

Send:
Stop Timer0
Stop Timer1

Print "Timer1= " ; Str(timer1) ; "Timer0= " ; Str(timer0)

Timer0 = 0
Timer1 = 0

Start Timer0
Start Timer1
Return



So weit so gut

die Ausgabe sieht wie folgt aus

Timer1= 37920Timer0= 199
Timer1= 37920Timer0= 213
Timer1= 37920Timer0= 233
Timer1= 37920Timer0= 251
Timer1= 37920Timer0= 205
Timer1= 37920Timer0= 223
Timer1= 37920Timer0= 239
Timer1= 37920Timer0= 253
Timer1= 37920Timer0= 203
Timer1= 37920Timer0= 215
Timer1= 37920Timer0= 227
Timer1= 37920Timer0= 239
Timer1= 37920Timer0= 253
Timer1= 37919Timer0= 203
Timer1= 37920Timer0= 219
Timer1= 37920Timer0= 239
Timer1= 37920Timer0= 1
Timer1= 38001Timer0= 19 <-- Woher kann dieser Sprung kommen?
Timer1= 37960Timer0= 133
Timer1= 37920Timer0= 247
Timer1= 37920Timer0= 199
Timer1= 37920Timer0= 219
Timer1= 37920Timer0= 235


Zur Beschaltung

Gemeinsame Masse
Gemeinsamme Betriebspannung 7805
an jedem µC mit 100n abgeblockt

Quarze haben jeweils 2 33p dran

Ich hoffe das mir Einer einen Tipp geben kann woher dieser Sprunghafte wert herkommen kann

Mit Freundlichem Gruß
Thomas

radbruch
11.09.2012, 18:09
Hallo


$regfile "m8def.dat"
$crystal = 10000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 9600

Dim Flag As Byte
Dim Timer0_temp As Byte
Dim Timer1_temp As Word
Flag = 0

Config Timer0 = Timer , Prescale = 1
Config Timer1 = Timer , Prescale = 256
Config Int0 = Rising
'6 Takte für Timer

Enable Interrupts

Enable Int0 'enable the interrupt

On Int0 Send Nosave


Stop Timer0
Stop Timer1
Timer0 = 0
Timer1 = 0

Start Timer0
Start Timer1

Do
If Flag = 1 Then
Print "Timer1= " ; Str(timer1_temp) ; " " ; "Timer0= " ; Str(timer0_temp)
Flag = 0
End If
Loop

Send:
Timer0_temp = Timer0
Timer1_temp = Timer1
Timer0 = 0
Timer1 = 0
Flag = 1
Return(ungetestet)


Funktioniert es so besser?

Gruß

mic

Thomas$
11.09.2012, 18:20
ich bin verblüfft

ja so funktioniert es besser

nun die frage warum geht es denn besser

der µC hatte doch ewig zeit zum senden oder uart in einer isr nicht so gut?

So und noch ein Danke ich such die ganze zeit die fehler in der Hardware uart aus der isr raus und es geht

Thx

radbruch
11.09.2012, 18:40
Ich vermute, Bascom sendet die Daten über einen Sendepuffer der irgendwann mal voll wird. Ab diesem Zeitpunkt wird dann in der ISR gewartet und der impulsgebende µC ist nicht mehr synchron. Das könnte man etwa so überprüfen:

Print "Timer1= " ; Str(timer1) ; "Timer0= " ; Str(timer0) ; "dummytext"

Mehr Text bedeutet Puffer ist schneller voll.

Wie sieht denn die Ausgabe der verbesserten Variante aus?

Thomas$
11.09.2012, 19:17
Temp= 9956365 Timer1= 38892 Timer0= 13
Temp= 9956365 Timer1= 38892 Timer0= 13
Temp= 9956365 Timer1= 38892 Timer0= 13
Temp= 9956365 Timer1= 38892 Timer0= 13
Temp= 9956620 Timer1= 38893 Timer0= 12
Temp= 9956363 Timer1= 38892 Timer0= 11
Temp= 9956361 Timer1= 38892 Timer0= 9
Temp= 9956360 Timer1= 38892 Timer0= 8


Temp=timer1*256+timer0