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
Hallo
Du hast den Anhang vergessen ;D
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
Sorry, Anhänge haben noch nicht geklappt.
Komm irgendwie nicht klar.
beim Daten Anhängen.
main.pdfServo Programm.pdfServo Programm.pdf
Sorry
Hier nun Endlich die Datei Anhänge
Grüße Herbert
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.
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]
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
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
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
}
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
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.
danke,
werde ich alles mal versuchen,
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