Autor Thema: Timer1 PIC18F45K22  (Gelesen 4034 mal)

Offline Austrianer

  • Newbie
  • *
  • Beiträge: 30
    • Profil anzeigen
Timer1 PIC18F45K22
« am: April 03, 2012, 22:38:23 Nachmittag »
Guten Abend!

Der Timer1 von einem PIC18F45K22 besitzt einen 16Bit-Zähler(2x8 Bit-Zähler). Wie kann ich den Zählbereich einstellen(z.B. 0 bis 1000 => Überlauf)?

Vielen Dank!

Offline Edson

  • Sr. Member
  • ****
  • Beiträge: 410
    • Profil anzeigen
Re:Timer1 PIC18F45K22
« Antwort #1 am: April 04, 2012, 09:36:25 Vormittag »
Hallo,

der Timer-Überlauf heisst nicht zum Spaß so. Damit ist der Zeitpunkt gemeint, in dem z.B. ein 8-Bit Timer von 255 zu 256, also 0, übergeht. Bei einem 16-Bit Timer dann eben 65535. Wenn du den Timer von 0 bis 1000 zählen lassen willst und damit einen Interrupt auslösen, brauchst du eine Capture/Compare-Einheit. Oder du denkst eine Sekunde lang nach und kommst auf den Trichter, dass du ja deine gewünschten 1000 vom maximalen Timer-Wert subtrahieren und in der ISR immer wieder diesen Wert "nachladen" könntest.

Gruß,
Edson

PS. So einfach wie in deinem Timer0-Thread mache ich es dir nicht mehr. Deine aktuelle Frage solltest du dir schon längst selbst beantworten können.

Offline Austrianer

  • Newbie
  • *
  • Beiträge: 30
    • Profil anzeigen
Re:Timer1 PIC18F45K22
« Antwort #2 am: April 04, 2012, 10:36:24 Vormittag »
Ich werde den Timer2 verwenden. Mir erscheint der Vergleich mit PR2 einfacher!?

Offline Edson

  • Sr. Member
  • ****
  • Beiträge: 410
    • Profil anzeigen
Re:Timer1 PIC18F45K22
« Antwort #3 am: April 04, 2012, 12:45:05 Nachmittag »
Zitat
Mir erscheint der Vergleich mit PR2 einfacher!?

Das wäre dann die Verwendung der Compare-Funktion. Der Interrupt wird ausgelöst wenn der Timer-Wert gleich dem Compare-Wert ist, das hat nichts mit dem Timer-Überlauf zu tun. Für dich macht das vielleicht keinen Unterschied, aber es lohnt sich (nicht nur) in technischen Dingen stets korrekt zu bleiben.

Gruß,
Edson

Offline Austrianer

  • Newbie
  • *
  • Beiträge: 30
    • Profil anzeigen
Re:Timer1 PIC18F45K22
« Antwort #4 am: April 04, 2012, 19:39:43 Nachmittag »
Wenn ich das schon könnte, dann würde ich es machen. Leider ist der Einstieg in die Welt der PIC-Programmierung sehr schwer für Anfänger wie mich. Es gibt nämlich keine gut aufbereiteten online Lernunterlagen für 18er PIC's.

Offline Edson

  • Sr. Member
  • ****
  • Beiträge: 410
    • Profil anzeigen
Re:Timer1 PIC18F45K22
« Antwort #5 am: April 05, 2012, 09:37:49 Vormittag »
Zitat
Wenn ich das schon könnte, dann würde ich es machen.

Nun sei nicht gleich beleidigt.

Zitat
Es gibt nämlich keine gut aufbereiteten online Lernunterlagen für 18er PIC's.

Nana, da ist schon Einiges zu finden wenn man will. Bezüglich der Timer ist das aber gar nicht nötig. Das sind Grundlagen der digitalen Schaltungstechnik, die Timer sind im Datenblatt detailliert beschrieben und mit Blockdiagrammen illustriert.

Zitat
Leider ist der Einstieg in die Welt der PIC-Programmierung sehr schwer für Anfänger wie mich.

Aller Anfang ist schwer. Du bekommst hier jederzeit Hilfe, aber du solltest wenigstens schreiben was du nicht verstehst, damit man dir die richtigen Ratschläge geben kann.

Gruß,
Edson

Offline Austrianer

  • Newbie
  • *
  • Beiträge: 30
    • Profil anzeigen
Re:Timer1 PIC18F45K22
« Antwort #6 am: April 05, 2012, 10:25:11 Vormittag »
Ich habe für meine Übung(Blinklicht am Port C) nun den Timer2 verwendet.

In dem unten stehenden Programm, habe ich eine Leucht- und Dunkelzeit von 1 Sekunde angestrebt. Als Ergebnis habe ich eine Leucht- und Dunkelzeit von 1,040s erhalten. Befindet sich diese Abweichung im Toleranzbereich oder habe ich bei der Umsetzung einen Fehler gemacht? Kann ich mit dem internen Oscillator eine noch höhere Genauigkeit erzielen(für digitale Uhr)?

int counter=0;

void init()
{
 /*Oscillator*/
 OSCCON.SCS0=1;
 OSCCON.SCS1=1;
 OSCCON.OSTS=0;
 OSCCON.IRCF0=1;
 OSCCON.IRCF1=1;
 OSCCON.IRCF2=0;
 /*Timer2*/
 T2CON.T2CKPS0=0;
 T2CON.T2CKPS0=0;
 T2CON.TMR2ON=1;
 T2CON.T2OUTPS0=0;
 T2CON.T2OUTPS1=0;
 T2CON.T2OUTPS2=0;
 T2CON.T2OUTPS3=0;
 PR2=0xFA;
 /*Interrupt*/
 INTCON.GIE=1;
 INTCON.PEIE=1;
 PIE1.TMR2IE=1;
 /*Port C*/
 TRISC=0x00;
 LATC=0x00;
}

void interrupt()
{
  if(PIR1.TMR2IF==1)
  {
   counter++;
   PIR1.TMR2IF=0;
   TMR2=0;
  }
}

void main()
{
 init();
 while(1)
 {
  if(counter==1000) //Eingabe der Leucht- und Dunkelzeit in ms
  {
   LATC=~LATC;
   counter=0;
  }
 }
}

« Letzte Änderung: April 05, 2012, 11:18:59 Vormittag von Austrianer »

 


* Recent Topics