Forum: Mikrocontroller und Digitale Elektronik Timer 1 Problem mit PIC16F684


von Martin Scheu (Gast)


Lesenswert?

Hallo zusammen.
ich schreibe ein Programm, dass nach dem Aufstarten des PIC's eine
Spannung einlesen soll und dazu proportional lang einen Timer zählen
lassen soll. (Eingangsspannung z.b. 1V ==> 1Sekunde, 2V ==>
2Sekunden...)
Nach Ablauf der zeit soll eine LED angesteuert werden.
Nun habe ich den code geschrieben und es funktioniert einfach nicht und
ich weiss echt nicht mehr weiter. Hat jemand von euch eine Ahnung was
ich falsch mache:

Code programmiert mit MPLAB IDE v.7.2 auf einem PICKit1 mit 16F684!

#include <pic.h>


unsigned int inputh  ;      //  variable für AD-Input
unsigned int inputl  ;      //  variable für AD-Input
unsigned int i  =  0;      //  Anzahl Durchläufe der Timer1
unsigned int n  =  0;      //  laufvariable

__CONFIG(WDTDIS & INTIO & MCLRDIS & PWRTEN);  //  Power-Up-Timer (64ms),
Watchdog off

void INIT ()
{
PEIE  =  1;
PIE1  =  0x81;
GIE    =  1;
}

void delay(int time0)
{
  OPTION  =  0xC7;
  TMR0  =  0x0;
  while (time0 != 0)
  {
    if (T0IF)        //  if T0 Interrupt
    {
    T0IF  =  0;      //  clear Interrupt Flag
    time0  =  time0 - 1;
    }
  }
//  T0IE  =  0;
}


void read_voltage()
{
  CMCON0  =  0x00;
  TRISA  =  0xFF;    //  Alle Ports als Eingänge definiert;
  ANSEL  =  0x01;    //  Wahl von Chanel 1 als analoger Eingang
  ADCON0  =  0x83;    //  AD-Configuration Byte
  ADCON1  =  0x00;    //  conversation Clock für AD
  inputh  =  ADRESH;    //  übergabe von AD-Wert
  inputl  =  ADRESL;    //  übergabe von AD-Wert
  GODONE  =  1;      //  Ende AD-Wandlung
  ANSEL  =  0x00;
  i  =  0xFF;//(inputh*128)+inputl;  //  Übertrag von ADRESH und ADRESL
  n  =  0x00;

}


void interrupt isr(void)
{
  if (TMR1IF)
  {
    TMR1IF  =  0;      //  Clear Interruptflag
//    TRISA  =  0x2B;
//    PORTA  =  0x10;
    TMR1H  =  0x00;    //  Timer1 preload
    TMR1L  =  0x00;    //  Timer1 preload
    if (n < i)
    {
      n = n + 1;          //  Increment durchgaenge
    }
  }
}

void main ()
{
  INIT ();
  delay(0);          //  ==> ==> ==> ==> noch zu klären
  read_voltage();        //  Unterfunktion aufrufen zur AD-Einlesen
  TMR1H  =  0x00;      //  Timer1 preload
  TMR1L  =  0x00;      //  Timer1 preload
  T1CON  =  0x01;      //  Timer1 Controllregister inkl. Start (PRESCALE 
1:4)
(35)
  TMR1IE  =  1;
  while (1)
    {
    if (n   >  i)        //  Timer genügen oft durchloffen
    {
      TRISA  =  0x0F;
      PORTA  =  0x20;
    }
    else
    {
      while (1)
      {
        TRISA  =  0x0F;
        PORTA  =  0x10;
      }
    }
    }

von Steffen (Gast)


Lesenswert?

n und i sind gleich 0, also bleibt er in der Schleife

      while (1)
      {
        TRISA  =  0x0F;
        PORTA  =  0x10;
      }

hängen.

Mit dem Simulator lässt sich so etwas recht einfach nachvollziehen.

von Martin Scheu (Gast)


Lesenswert?

Hallo Steffen
Danke für deine schnelle Hilfe. Hab nun den Code etwas angepasst...
natürlich haben sich zwei, drei neue, kleine Fehler eingeschlichen aber
die werde ich schon noch finden..

Danke, Martin

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.