Timer 1 Problem mit PIC16F684

Gast #356589
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;
      }
    }
    }
Gast #356591
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.