H

LEDs am PIC 18F25K22

Begonnen von Herbert 1, 23.01.2021, 00:13:30 CET

Vorheriges Thema - Nächstes Thema

Herbert 1

Hallo Neues Forum ,

Ich habe ein C-Programm  Hello World (blink Led) siehe Anhang ehemals aus Forum PIC-Projekte           
versucht so abzuändern das am Port RB1 u. am Port RB5 die Leds 1u.2 Gleichzeitig
An und aus gehen. Habe schon diverses versucht, und krieg das einfach nicht hin.
Es gehen beim Start nur nach der Reihe die LEDs an u. aus. Mir ist bekannt das
ein C-Programm immer erst in die main geht und dann der Reihe nach Zeilen abarbeitet.Oder geht es gar nicht ohne Timer u. interrupt?

Aber hier auch im Anhang noch ein Fertiges C-Programm für Pic 12F683
welches 2 Model Servos mit delays und for-Schleifen absolut syncron steuert.

Das muß doch dann auch irgendwie mit den LED am 18F25K22 funktionieren,
Aber wie gesagt ich krieg das nicht hin. Brauche Eure Hilfe mal wieder.

Danke für Eure Hilfe
Grüße Herbert

Peter


Herbert 1

Hallo danke,
muß mich erstmal zurecht finden wie das Forum Bedient wird.

Hier nun aber die Anhänge. Ich hab die Dateien
einfach in PDF gewandelt damit ich diese überhaupt
Anhängen konnte.

Danke Grüße Herbert

Herbert 1

Sorry, Anhänge haben noch nicht geklappt.

Komm irgendwie nicht klar.
beim Daten Anhängen.


Herbert


Peter

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.

Herbert

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]

vloki

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
MPLABX  XC8  KiCAD

Herbert

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




vloki

#9
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
}
MPLABX  XC8  KiCAD

Herbert

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


vloki

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.
MPLABX  XC8  KiCAD

Herbert


Herbert

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

Schnellantwort

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.

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

Similar topics (5)