Autor Thema: Taktquelle für Timer0 (PIC18F45K22)  (Gelesen 15579 mal)

Offline Edson

  • Sr. Member
  • ****
  • Beiträge: 410
    • Profil anzeigen
Re:Taktquelle für Timer0 (PIC18F45K22)
« Antwort #30 am: März 08, 2012, 12:56:24 Nachmittag »
Hallo

Zitat
Mit dem Begriff Hardware meinst du den PIC oder?

Damit ist die komplette Hardware gemeint, der PIC und die daran angeschlossene Schaltung.

Zitat
Mein RB0 ist jetzt ohne Pull-Up-R und Pull-Down-R (Entwicklungsboard).

Der Vollständigkeit halber: in deinem Code werden die Pullups deaktiviert, das habe ich vorhin falsch gesehen.

Schalte die Pullups an PORTB ein, die sind in dem Falle schon nützlich (bzw. der an RB0). Jetzt kommt ein Anschluss des Tasters an RB0 und der andere Anschluss wird direkt mit der Masse (GND) verbunden.
Der Pullup sorgt dafür, dass der Eingang RB0 den Zustand "High" erkennt wenn die Taste (Schliesser) im Ruhezustand ist. Bei Druck auf den Taster fällt die Spannung über dem Pullup ab, so dass der Zustand "Low" erkannt wird. Das ist ein Flankenwechsel von "High" nach "Low", also Fallend. Dafür musst du INTEDG0 im INTCON2 Register auf 0 setzen.

Dass ein Taster mechanisch prellt habe ich schon geschrieben. Versuch das dochmal mit deinem Setup nachzuvollziehen, bau einen Zähler in die ISR ein mit dem du die Flanken zählst. Du wirst sehen, einmal Taste drücken verursacht eine unbestimmte Zahl weiterer Interrupts.

Gruß,
Edson

Offline Austrianer

  • Newbie
  • *
  • Beiträge: 30
    • Profil anzeigen
Re:Taktquelle für Timer0 (PIC18F45K22)
« Antwort #31 am: März 08, 2012, 13:55:19 Nachmittag »
Ist die Abfrage ob der Taster an RB0 gedrückt ist und die Unterbrechnung des Blinklichts korrekt ausgeführt(abgesehen von der Entprellung).

Offline Edson

  • Sr. Member
  • ****
  • Beiträge: 410
    • Profil anzeigen
Re:Taktquelle für Timer0 (PIC18F45K22)
« Antwort #32 am: März 08, 2012, 14:29:23 Nachmittag »
Zitat
Ist die Abfrage ob der Taster an RB0 gedrückt ist und die Unterbrechnung des Blinklichts korrekt ausgeführt(abgesehen von der Entprellung).

Nein, ist sie nicht. Du fragst nirgends RB0 ab, das solltest du mittlerweile eigentlich auch selbst sehen (Tipp: INT0IF ist kein Port-Bit, sondern ein Interrupt-Flag). Wo ist der Unterschied zwischen einem I/O-Port und einem SFR? Wenn du so grundlegende Dinge nicht selbst erarbeitest kommen wir nicht weiter.

Gruß,
Edson

Offline Austrianer

  • Newbie
  • *
  • Beiträge: 30
    • Profil anzeigen
Re:Taktquelle für Timer0 (PIC18F45K22)
« Antwort #33 am: März 08, 2012, 14:56:13 Nachmittag »
Mit folgendem Code, lässt sich jetzt das Blinklicht starten und stoppen (eine Entprellung ist notwendig).

//globale Variablen
volatile unsigned int blink_wert;

void blink(unsigned int time_ms)
{
 //Timer0
 T0CON.PSA=1;
 T0CON.T0CS=0;
 T0CON.T08BIT=1;
 T0CON.TMR0ON=1;

 blink_wert=time_ms;
}

void interrupt(void)
{
 static unsigned int counter=0;
 static unsigned int start_stop=0;
 
 //if(INTCON.INT0IF==1)
 if(PORTB.RB0==1)
 {
  start_stop=~start_stop;
  INTCON.TMR0IE=0;
  //INTCON.INT0IF=0;
 }
 else if(start_stop==0)
 {
  if(INTCON.TMR0IF==1)
  {
   counter++;
   if(counter==blink_wert)
   {
    LATD=~LATD;
    counter=0;
   }
   INTCON.TMR0IF=0;
  }
 }
}

void init(void)
{
 //PORTD
 TRISD=0x00;
 LATD=0x00;
 
 //PORTB
 ANSELB=0xFE;

 //Internal Oscillator
 OSCCON.SCS0=0; //Bit ist unknown
 OSCCON.SCS1=1;
 OSCCON.OSTS=0;
 OSCCON.IRCF0=1;
 OSCCON.IRCF1=1;
 OSCCON.IRCF2=0;

 //Interrupt
 INTCON.TMR0IE=1;
 INTCON.GIE=1;
 
 //INT0 ???
 INTCON.INT0IE=1;
 INTCON2.RBPU=1;  //0
 INTCON2.INTEDG0=0;
}

void main()
{
 init();
 blink(500); //Uebergabe der Leucht- und Dunkelzeit in ms
 while(1);
}

Wie wird der Taster entprellt (Ist dies überhaupt möglich? Zur Zeit ist für die gewünschte Ausführung ein mehrmaliges Tasten nötig => das nervt.).
« Letzte Änderung: März 09, 2012, 09:30:10 Vormittag von Austrianer »

Offline Edson

  • Sr. Member
  • ****
  • Beiträge: 410
    • Profil anzeigen
Re:Taktquelle für Timer0 (PIC18F45K22)
« Antwort #34 am: März 08, 2012, 15:54:28 Nachmittag »
Zitat
Die Umsetzung ... erfüllt die Aufgabenstellungen.

Siehst du, jetzt hast du es selbst geschafft und weißt sogar schon etwas mehr als für die Aufgabe gefordert war.

Würde mich freuen wenn du nochmal hier reinschaust, wenn ihr die Arbeit durchgegangen seid. Vielleicht kannst du dann berichten worauf diese Übung didaktisch abgezielt hat.

Gruß,
Edson

Offline Austrianer

  • Newbie
  • *
  • Beiträge: 30
    • Profil anzeigen
Re:Taktquelle für Timer0 (PIC18F45K22)
« Antwort #35 am: März 09, 2012, 09:27:05 Vormittag »
Ich würde trotzdem gerne versuchen, das Flag INTCON.INT0IF für die Unterbrechung des Blinklichts zu verwenden. Das Stoppen funktioniert schon, aber das Starten nicht, da ich das Flag INTCON.INT0IF nicht zum passendem Zeitpunkt (Tastendruck RB0) auf 0 setzen kann!?

//globale Variablen
volatile unsigned int blink_wert;

void blink(unsigned int time_ms)
{
 //Timer0
 T0CON.PSA=1;
 T0CON.T0CS=0;
 T0CON.T08BIT=1;
 T0CON.TMR0ON=1;

 blink_wert=time_ms;
}

void interrupt(void)
{
 static unsigned int counter=0;
 
 if(INTCON.INT0IF==1) //Wie kann ich das INTCON.INT0IF über RB0 0 setzen???
 {
  INTCON.TMR0IE=0;
 }
 else if(INTCON.INT0IF==0)
 {
  if(INTCON.TMR0IF==1)
  {
   counter++;
   if(counter==blink_wert)
   {
    LATD=~LATD;
    counter=0;
   }
   INTCON.TMR0IF=0;
  }
 }
}

void init(void)
{
 //PORTD
 TRISD=0x00;
 LATD=0x00;

 //PORTB
 ANSELB=0xFE;

 //Internal Oscillator
 OSCCON.SCS0=0; //Bit ist unknown
 OSCCON.SCS1=1;
 OSCCON.OSTS=0;
 OSCCON.IRCF0=1;
 OSCCON.IRCF1=1;
 OSCCON.IRCF2=0;

 //Interrupt
 INTCON.TMR0IE=1;
 INTCON.GIE=1;

 //INT0 ???
 INTCON.INT0IE=1;
 INTCON2.RBPU=1;  //0
 INTCON2.INTEDG0=0;
}

void main()
{
 init();
 blink(500); //Uebergabe der Leucht- und Dunkelzeit in ms
 while(1);
}

Offline Stampede

  • Hero Member
  • *****
  • Beiträge: 1026
    • Profil anzeigen
    • PicPlayer.de
Re:Taktquelle für Timer0 (PIC18F45K22)
« Antwort #36 am: März 09, 2012, 10:06:48 Vormittag »
Hallo,

du musst das Flag bei der Init auf 0 setzten und in der ISR auch wieder zurücksetzen.
Dann das übliche: RB0 als digitaler (nicht analoger) Eingang, ADC aus, Edge und InterruptEnable Bit setzten. Dann gehts.

Gruß
Stefan

Offline Austrianer

  • Newbie
  • *
  • Beiträge: 30
    • Profil anzeigen
Re:Taktquelle für Timer0 (PIC18F45K22)
« Antwort #37 am: März 09, 2012, 11:58:07 Vormittag »
Ich habe das Programm jetzt umgebaut und es funktioniert.

@Stefan

Das war nicht notwendig.


volatile unsigned int blink_wert;     //

void blink(unsigned int time_ms)      //
{
 T0CON.PSA=1;                         //Timer0 prescaler is NOT assigned. Timer0 clock input bypasses prescaler.
 T0CON.T0CS=0;                        //Internal instruction cycle clock (CLKOUT)
 T0CON.T08BIT=1;                      //Timer0 is configured as an 8-bit timer/counter
 T0CON.TMR0ON=1;                      //Enables Timer0

 blink_wert=time_ms;                  //
}

void interrupt(void)                  //
{
 static unsigned int counter=0;       //
 static unsigned int start_stop=0;    //
 
 if(INTCON.INT0IF==1)                 //
 {
  start_stop=~start_stop;             //
  INTCON.INT0IF=0;                    //
 }
 else if(start_stop==0)               //
 {
  if(INTCON.TMR0IF==1)                //
  {
   counter++;                         //
   if(counter==blink_wert)            //
   {
    LATD=~LATD;                       //
    counter=0;                        //
   }
   INTCON.TMR0IF=0;                   //
  }
 }
}

void init()                           //
{
 ANSELB=0x00;                         //configure pins as digital (PORTB)
 TRISD=0x00;                          //set direction to be output (PORTD)
 LATD=0x00;                           //turn off LEDs (PORTD)
 
 OSCCON.SCS0=0;                       //Internal oscillator block (Bit ist unknown)
 OSCCON.SCS1=1;                       //Internal oscillator block
 OSCCON.OSTS=0;                       //Device is running from the internal oscillator (HFINTOSC, MFINTOSC or LFINTOSC)
 OSCCON.IRCF0=1;                      //HFINTOSC/16 – (1 MHz)
 OSCCON.IRCF1=1;                      //HFINTOSC/16 – (1 MHz)
 OSCCON.IRCF2=0;                      //HFINTOSC/16 – (1 MHz)

 INTCON.TMR0IE=1;                     //Enables the TMR0 overflow interrupt
 INTCON.GIE=1;                        //Enables all unmasked interrupts
 INTCON.INT0IE=1;                     //Enables the INT0 external interrupt
 INTCON2.RBPU=1;                      //All PORTB pull-ups are disabled
 INTCON2.INTEDG0=0;                   //Interrupt on falling edge
}

void main()                           //
{
 init();                              //Aufruf der Funktion init
 blink(200);                          //Leucht- und Dunkelzeit (ms)
 while(1);                            //Warteposition durch Endlosschleife
}


Vielen DANK für eure Hilfe!!!
« Letzte Änderung: März 09, 2012, 14:16:16 Nachmittag von Austrianer »

 


* Recent Topics