Antworten

Der Beitrag verursachte die folgenden Fehler, die behoben werden müssen:
Achtung: In diesem Thema wurde seit 120 Tagen nichts mehr geschrieben.
Wenn Sie nicht absolut sicher sind, dass Sie hier antworten möchten, starten Sie ein neues Thema.
Einschränkungen: 8 pro Beitrag (8 verbleibend), maximale Gesamtgröße 8,79 MB, maximale Individualgröße 1 MB
Entfernen Sie den Haken der Dateianhänge, die gelöscht werden sollen
Klicken Sie hier oder ziehen Sie Dateien hierher, um sie anzuhängen.
Anhänge und andere Optionen
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

Zusammenfassung

Autor Herbert
 - 23.01.2021, 23:54:40 CET
Hallo
habe die while Schleife im Code für 2 LED am PIC 18F25K22 so geändert
wie mir Dimitri es im Alten Forum PIC-Projekte vorgeschlagen hat.

Die beiden LED blinken jezt wie ich mir es gedacht habe.
Die verzögerung kann man mit bloßem Auge nicht sehen
weshalb man denkt die LED blinken Syncron.

Den while änderungs Code von Dimitri habe ich hier mit Angehängt.
while(1)
    {
        LED1 = 0;           // turn LED on
	LED2 = 0;           // turn LED on
        __delay_ms(500);	// warte halbe Sekunde 
        LED1 = 1;           // turn LED off
        LED2 = 1;           // turn LED off		
        __delay_ms(500);	// warte halbe Sekunde
    }
 

Bin durch die Erklärung von vloki u. Dimitri wieder für meine Begriffe eine
ganze Menge weiter danke bis demnächst

Herbert
Autor Herbert
 - 23.01.2021, 19:34:16 CET
danke,

werde ich alles mal versuchen,


herbert
Autor vloki
 - 23.01.2021, 19:15:06 CET
Dimitrij88 hat dir ja im pic-projekte Forum schon geantwortet.

Da die LEDs nicht wie die Servos am gleichen Port liegen,
muss man das natürlich nacheinander machen.

Der Zeitversatz ist dann aber lediglich die Taktfrequenz geteilt durch vier.
Also nicht wahrnehmbar. Außer du schaust mit einem Oszilloskop.
Autor Herbert
 - 23.01.2021, 18:52:51 CET
Hallo Volker,
danke für die Rückmeldung.
Den Code für die Servos habe ich nur als Beispiel
hier eingestellt, weil dieser Code so lief das man
annimmt die Servos laufen absolut Syncron.
Aber wie du schon sagst sind wohl ms dazwischen.

Ich werde mal versuchen die Code änderung von dir
so umzustellen das diese im ersten Code für den
18F25K22 passt denn hier sieht man am blinken der LED das diese LED1 dann LED 2
Aktiviert werden. Siehe hierzu ersten Code.

Weil es aber beim Code der Servos nicht wahrnembar war das die Singnale
nacheinander kamen, habe ich diesen Code hier eingestellt und
war der Meinung das müßte auch bei den LED mit dem PIC 18F25K22 funktionieren.

Grüße Herbert

Autor vloki
 - 23.01.2021, 17:24:17 CET
Hallo Herbert,
um absolut zeitgleich zu sein, muss man beide Signale auch zur gleichen Zeit verändern.
Das geht natürlich, wenn die beide an einem Port sind.
Für den Servo sollte es eigentlich auch ausreichen, wenn der Puls nur einmal kommt.
Bin jetzt nicht so fit mit PIC12, aber versuch mal:

void servoRotate90() //90 Degree
{
    GPIO != 0x03;         // beide 1
    __delay_us(1500);     // pulsdauer
    GPIO &= 0xFC;         // beide 0
}
Autor Herbert
 - 23.01.2021, 15:45:20 CET
Hallo Volker,

danke für deine Rückmeldung,

warum ist das Servo Programm seltsam?
Es funktioniert wie es soll. Beide Servos
gehen bei start auf 0Grad dann auf 90 Grad u. dann auf 180Grad u. wieder von Vorne.
Ich fahre mich immer wieder fest in der Programmierung und verstehen des solchen.

Wie müßte man denn ein Programm erstellen was zb. an dem 12F683 Pin 7 u. Pin6
Absolut gleich zb ein Singnal ausgeben,
Grüße Herbert



Autor vloki
 - 23.01.2021, 15:20:35 CET
Hallo Herbert,
das mit den Servos sieht nur synchron aus,
weil du die Verzögerung von 20ms nicht sehen kannst.

(Das ganze Servoprogramm ist seltsam :-)

Grüße,
    Volker
Autor Herbert
 - 23.01.2021, 14:46:29 CET
Hallo Peter,
danke für die Erklärung.

Hier nun nochmal die beiden Code zu
meiner Frage am Anfang.

Herbert
/*******************************************************************************
 * File:        main.c
 * Project:     SP18 - Hello World 
 * Author:      Nicolas Meyertöns
 * Version:     siehe main.h
 * Web:         http://pic-projekte.de
 ******************************************************************************/

#include <xc.h>

#define LED1        LATBbits.LB1
#define _XTAL_FREQ  2000000 
#define LED2        LATBbits.LB5 
#pragma config FOSC = INTIO67       // Internal oscillator block
#pragma config PWRTEN = ON          // Power up timer enabled
#pragma config BOREN = OFF          // Brown-out Reset disabled
#pragma config WDTEN = OFF          // Watch dog timer is always disabled
#pragma config MCLRE = EXTMCLR      // MCLR enabled
#pragma config LVP = OFF            // Single-Supply ICSP disabled

/*******************************************************************************
 * Diverse Einstellungen zum PIC (IO, Takt, ...)
 */

void initPIC(void)
{
    TRISA = 0x00;
    TRISB = 0x01;                   // RB0:Input (PB)
    TRISC = 0x20;                   // RC6:Input (AN16)

    ANSELA = 0x00;                  // All digital
    ANSELB = 0x00;                  // ...
    ANSELC = 0x20;                  // AN16 on

    OSCCON2bits.MFIOSEL = 0;        // 111: 16 MHz
    OSCCONbits.IRCF2 = 1;           // 110:  8 MHz
    OSCCONbits.IRCF1 = 0;           // 101:  4 MHz
    OSCCONbits.IRCF0 = 0;           // 100:  2 MHz <-- aktiv
}

/*******************************************************************************
 * Main Routine
 */

void main (void)
{
    initPIC();
    
    /*Shut OFF the LCD-Backlight*/
    LATCbits.LC2 = 1;
    
    /*Endlosschleife*/
    while(1)
    {
        LED1 = 0;           // turn LED on
        __delay_ms(250);    // delay 250 ms
        __delay_ms(250);    // ...
        LED1 = 1;           // turn LED off
        __delay_ms(250);    // ...
        LED2 = 0;           // turn LED on
        __delay_ms(250);    // delay 250 ms
        __delay_ms(250);    // ...
        LED2 = 1;           // turn LED off
        __delay_ms(250); 
    }
}[code]/*
 * File:   newmain.c
 * Author: Herbert
 *
 * Created on 12. Oktober 2019, 17:26
 */


#define _XTAL_FREQ 8000000

#include <xc.h>
#pragma config FOSC = INTOSCIO        // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA4/OSC2/CLKOUT and RA5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Detect (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)





void servoRotate0() //0 Degree
{
  unsigned char i;
  for(i=0;i<50;i++)
  {
      GP1 = 1;
      __delay_us(800);
      GP1 = 0;
    __delay_us(19200); 
      GP0 = 1;
      __delay_us(800);
      GP0 = 0;
    __delay_us(19200);
  }
}


void servoRotate90() //90 Degree
{
  unsigned int i;
  for(i=0;i<50;i++)
  {
    GP1 = 1;
    __delay_us(1500);
    GP1 = 0;
    __delay_us(18500);
     GP0 = 1;
    __delay_us(1500);
    GP0 = 0;
    __delay_us(18500);
  
  }
  
}

void servoRotate180() //180 Degree
{
  unsigned int i;
  for(i=0;i<50;i++)
  {
    GP1 = 1;
    __delay_us(2200);
    GP1 = 0;
    __delay_us(17800);
    GP0 = 1;
    __delay_us(2200);
    GP0 = 0;
    __delay_us(17800);
  }
}


void main()
{
    OSCCON = 0b00000000;
    OSCCONbits.IRCF = 0b111;
          
  TRISIO = 0x00; // PORTB as Ouput Port
  do
  {
    servoRotate0(); //0 Degree
    __delay_ms(2000);
    servoRotate90(); //90 Degree
    __delay_ms(2000);
    servoRotate180(); //180 Degree
  }while(1);
}
[/code]
Autor Peter
 - 23.01.2021, 14:20:47 CET
Hallo
Du kannst aber auch direkt den Code hier einfügen, wenn er nicht
zu groß ist.
Siehe Bild.
Unbenannt.JPG

Einfach drauf klicken und den Code dazwischen einfügen.

Peter.
Autor Herbert
 - 23.01.2021, 14:15:32 CET
main.pdfServo Programm.pdfServo Programm.pdf
Sorry
Hier nun Endlich die Datei Anhänge

Grüße Herbert

Similar topics (5)