mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer 1 Problem mit PIC16F684


Autor: Martin Scheu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
      }
    }
    }

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Scheu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.