Hallo,
ich habe in deinem Code mal ein bisschen was verändert.Das Servo hat eine Wartezeit von 20ms das hast du vergessen und du hattest die Werte bei der Einschaltzeit konstant auf 1,1 ms gesetzt. Guck dir den Code mal an, ich hoffe er funktioniert. ich bin nämlich noch nicht so gut in C.
Code:
/*Grundprogramm für PIC 12F629/675
zum Einlesen eines Analogwertes mit Anzeige auf dem LC-Display
belegt min.4 max.5 Ausgänge
825 Codewords
30 Bytes RAM
//Pinbelegung des 12F629: Funktion:
//Pin1 VPP +5V +5V
//Pin2 GP5 IOP INT on Ch./T1CKI/OSC1 in out Funktion5 SI Serielle Daten
//Pin3 GP4 AIOP INT on Ch./T1G/OSC2 in out Funktion4 CLK Serieller Takt
//Pin4 GP3 I INT on Ch./MCLR\ in Funktion3
//Pin5 GP2 AIOP INT on Ch./Cout/INT/T0CIin out Funktion2 RS Daten(1)/Steuerzeichen(0)
//Pin6 GP1 AIOP INT on Ch./Cin-/Vref+ in out Funktion1 Servo
//Pin7 GP0 AIOP INT on Ch./Cin+ in out Funktion0 AD-Kanal 0
//Pin8 Gnd 0V GND
*/
#pragma config |=0b000.1.1.1.0.0.0.100
// ||| | | | | | | +++----Oscillator Selection Bits (100=intern)
// ||| | | | | | |+-------Watchdog timer (1=enable)
// ||| | | | | +----------Power up timer (0=enable)
// ||| | | | +------------MCLR\ select *) (0:RA5=IO; 1:RA5=MCLR\)
// ||| | | +--------------Brown out reset (1=enable)
// ||| | +----------------Flash-Programm memory protection(0=enable)
// ||| +------------------EE-Prom memory code protected (0=enable)
// +++--------------------nicht implementiert
// Konstanten Portzuweisung I/O Funktionsbeschreibung
bit RS @ GPIO.2; //I/O Daten/Steuerzeichen (Da=1; St=0)
bit Servo @ GPIO.1; //I/O Hintergrundbeleuchtung (Option)
//bit CSB @ GPIO.0; //I/O Analogkanal
#include "AD_Wandler.c" //AD-Wandler Hilfsprogramme
//#include "MATH24F.H" //Mathematikroutinen
// Variablen Funktionsbeschreibung
uns16 i;
uns16 AD_wert; //eingelesener AD-Wert
//-------------------Hauptprogramm-------------------------------------------------------------
void main(void)
{
//-------------------Konfiguration des PIC
//Anm.: Erst Ausgänge setzen, dann Konfigurieren (wg. Spikes)
GPIO= 0b.00.00.0.000; //Port Grundeinstellungen Statusregister
TRISIO= 0b.00.00.1.001; //Port Eingänge definieren (1=Eingang; 0=Ausgang)
//--------------------AD-Wandler, nicht relevant für 12F629
ADCON0=0b.10.00.0001; //AD-Wandler konfigurieren
ANSEL=0b.0.001.0001; //Bit 0..3: GPIO 0..3=Analog(=1) / Digital(=0) Bit4..6:AD Clock
//--------------------Komperator
CMCON=0b.0.0.0.00111; //Komperator aus
//--------------------Konfiguration der Variablen
Servo=0;
ruecksprung:
//Hauptprogramm
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
AD_wert=Analogwert(0); //Kanal 0 einlesen
AD_wert=AD_wert/12;
AD_wert=AD_wert + 85; // 1ms dazuaddieren
Servo=1; //Servo bekommt Signal
for (i=0; i<AD_wert; i++) // Er braucht 85 Schleifen um 1ms zu warten. Der AD_Wert vom Poti kann 0 bis 1024 betragen. --> 1024/85
{;}
Servo=0; //Signal wird abgesetzt. Servo hat also 1 PWM Signal bekommen
for (i=0; i<1700; i++) // Er braucht 85 Schleifen um 1ms zu warten. Also 85*20 um 20ms zu warten.
{;}
goto ruecksprung;
}
Gruß,
Jojo12
Lesezeichen