16F887 Problem mit Timer0
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  PIC Mikrocontroller Allgemein  |  16F887 Problem mit Timer0 « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: 16F887 Problem mit Timer0  (Gelesen 631 mal)
 
Kilian
Gast
« am: August 30, 2010, 19:18:19 »

Hi zusammen,

Wollte letzte Woche mein eigen zusammengebasteltes PIC16F887 Board testen.
Leider will der uC nicht so recht. Zuerst hab ich einfach mal alle Ausgänge gesetzt und die Leds geprüft, das passt auch.
Als nächstes war dann ein Lauflicht dran, was einfach nicht funktionieren will. Das Programm ist ein altes Beispiel für den
PIC16F690 (da funktionierts), daran hab ich nichts geändert, da ich keine bewegende Unterschiede im Datenblatt fand.

Die Led an PORTC 0 leuchtet und manchmal geht sie mal ne Sekunde aus
oder auch länger, manchmal blitzt sie auch etwas auf. Kurz, sie macht was sie will. Die anderen Leds sind immer aus.


Hier noch der Code:

Code:
#include <pic.h>

void delay10( char n);

void main( void)
{ ANSEL = 0;
  ANSELH = 0;
  TRISC = 0;

  while(1)
    {
        PORTC = 1;
        delay10(10);
        PORTC = 2;
        delay10(10);
        PORTC = 4;
        delay10(10);
        PORTC = 8;
        delay10(10);
    }
}

void delay10( char n)

{
    char i;

    OPTION = 7;
    do  {
         TMR0 = 0; /* 256 microsec * 39 = 10 ms */
        while ( TMR0 != 39)
            ;
    } while ( --n > 0);
}

Config1 11 1111 1111 0101 -> interner Takt
Config2 111


Ach ja, ich progge mit Windows7, Mplab 8.56 und PicKit2

Bin wirklich langsam am verzweifeln  Traurig

Vielen Dank schon mal
Gespeichert
Master Snowman
Sr. Member
****
Offline Offline

Beiträge: 289



Profil anzeigen WWW
« Antworten #1 am: August 31, 2010, 07:50:45 »

hallo Kilian

wozu bruauchst du in deiner delay10-funktion "char i;"? und was macht "OPTION = 7;"? und "while ( TMR0 != 39)" ist eine denkbar schlechte methode. stell dir vor der timer rennt ohne vorteiler, also maximalgeschwindigkeit. und stell dir vor, am ende der prüfung "TMR0 != 39" wäre der timer auf 38, bis die nächste prüfung aufgerufen wird, hat der timer vermutlich bereits etwas über 40... naja, da rennt der timer dir einmal ganz durch bis 255 und wieder von vorne los... vielleicht beim darauffolgenden durchlauf, vielleicht auch erst beim übernächsten trifft "TMR0 != 39" genau zu, was du möchtest. wenn schon, dann schreib besser "while(TMR0 <= 38)".

wie es scheint, benutzt du einen C-compiler (welcher?) und der stellt sicher bereits delay-funktionen zur verfügung, verwende doch zuerst einmal die.
Gespeichert
Kilian
Gast
« Antworten #2 am: September 01, 2010, 18:39:28 »

Hallo,

Mit der Genauigkeit hast du natürlich Recht, das Program hab ich auch nicht selbst geschrieben. Funktionieren sollte es jedoch trotzdem. Glaub ich :-)

Was "OPTION = 7" soll -> das ist der Teiler (hier 256)

Als Compiler verwende ich den "HI-Tech 9.71 C Compiler".

Eine DELAY Funktion an sich hab ich nicht gefunden  Augen rollen, jedoch ein Beispiel welches auf dem 16F84 basiert. Dieses hab ich auch nicht zum laufen gebracht. Auch nicht auf dem 16F690.  Verlegen
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #3 am: September 01, 2010, 21:59:56 »

Zitat
Eine DELAY Funktion an sich hab ich nicht gefunden

Such mal im Handbuch des verwendeten Compilers nach _delay(), __delay_ms() und __delay_us().

Viele Grüße

Bernd
Gespeichert

Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.039 Sekunden mit 18 Zugriffen.
 
Top! Top!