PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem Timer0 mit interrupt



PICuin
20.03.2011, 23:26
Hallo RoboterNetz Forum,

vorab, ich bin in dieser Materie ein absoluter Newbie und möchte eine Led zum laufen bringen welche sich für 1 Sek. Ein und 1 Sek. Ausschaltet.
Das programm läuft bereits, aber ich hab bemerkt das die Led nicht konstant 1 Sekunde leuchtet, es gibt meistens kleine abweichungen so in ms Bereich. Verglichen habe ich es auf 0815 art mit einer Stoppuhr. Gibt es eine Möglichkeit in der Enwicklungsumgebung festzustellen mit welcher Geschwindigkeit die Led blinkt.

Oder liegt es daran das der PIC Oszi nicht stabil ist?

ps. Das Programm habe ich aus dem Netz hab einiges für meine bedürfnisse angepasst.

Meine Entwicklungsumgebung ist das MPLAB mit Hi Tech C18 Compiler

--------------------------------------------------------------------------------
hier ist wäre der Code.


#include <htc.h>

//Chip Settings
__CONFIG(1,0x0200);
__CONFIG(2,0X1E1F);
__CONFIG(3,0X8100);
__CONFIG(4,0X00C1);
__CONFIG(5,0XC00F);


unsigned char counter=0;//Overflow counter

void main()
{
//Setup Timer0
T0PS0=1; //Prescaler is divide by 256

T0PS1=1;
T0PS2=1;

PSA=0; //Timer Clock Source is from Prescaler

T0CS=0; //Prescaler gets clock from FCPU (5MHz)

T08BIT=1; //8 BIT MODE

TMR0IE=1; //Enable TIMER0 Interrupt
PEIE=1; //Enable Peripheral Interrupt

GIE=1; //Enable INTs globally

TMR0ON=1; //Now start the timer!

//Set RB1 as output because we have LED on it

TRISB&=0B11111101;

while(1); //Sit Idle Timer will do every thing!
}

//Main Interrupt Service Routine (ISR)
void interrupt ISR()
{
//Check if it is TMR0 Overflow ISR

if(TMR0IE && TMR0IF)
{
//TMR0 Overflow ISR
counter++; //Increment Over Flow Counter

if(counter==15)
{
//Toggle RB1 (LED)

if(RB1==0)
RB1=1;
else
RB1=0;

counter=0; //Reset Counter

}

//Clear Flag
TMR0IF=0;
}
}

TobiKa
21.03.2011, 14:47
Ohne jetzt auf deinen Code und das MPLab einzugehen.
Das die Abweichung schwankt kann eigentlich nicht sein, wenn er immer gleich zählt.

Also nicht einmal blinken messen, sondern gucken wielange es dauert bis die LED 100mal geblinkt hat, ist sehr viel genauer. Daraus kannst du denn einen Korrektuwert errechnen.

Und nochwas, Programmcode bitte immer in Code-Tags.

PICture
21.03.2011, 15:13
Hallo!

Der Vorschlag von TobiKa ist sehr gut. :)

Fürs Messen von kurzen einzelnen Zeitinterwallen ist die Stopuhr nicht geeignet, da die variable Reaktionszeit von Menschen um 100 ms beträgt. Ganz genau kann man es nur elektronisch z.B mit Frequenzzähler messen. ;)

PICuin
21.03.2011, 21:01
Hallo,

danke für die Tips!

hab dauer von 100 mal blinken lassen (wenn LED aufleuchtet gezählt)
bis 100 hat es 3min :15sek gedauert.

100*2 (1s an; 1s aus= 2s) = 200/60= 3,33

Eine abweichung von 18s, falls ich Richtig verstanden habe, und die berechnung stimmt.
wie kann ich den Wert korriegieren.

mfg

PICture
21.03.2011, 22:10
Beispielweise durch Änderung des Startwertes vom Timer.

TobiKa
22.03.2011, 14:57
Wie kommst du auf 18 Sekunden?!
Mein Ergebnis ist, das er in 3:15 min (195 sek) bei einem 2 sek Intervall (1 sek an, 1 sek aus) maximal 97,5 Intervalle durchlaufen kann. Also hattest du 2,5 Intervalle zuviel, was 5 sek entspricht.