MPLABX 'de XC8 ile 16F serisi kullanımı

Başlatan fryrmnd, 26 Temmuz 2012, 13:02:50

kantirici

Proteus versiyonundan kaynaklı bir sorun olabilir çünkü ben sorusuz kullanıyorum.

metaltrrocker

Proteus 7.1 sp0 vardı.Sildim proteus 7.7 sp2 yükleyecektim ki yalnışlıkla portable indirmişim.denedim bu sürümde sorun çıkmıyor.Kurulumlu versiyonunu indirip deneyecem.Teşekkür ederim

skara1214

bende proteus 7.10 var wdt ve 18flerdeki simultane adc  düzgün çalışmıyor(gerçekte denedim hiç sıkıntı yok)
Herkes ölür ama herkes gerçekten yaşamaz

skara1214

Şimdi printf komutundan hiç cevap alamıyorum.Kendim ayar yapıp txrege yükleyince sıkıntı yok ama printf ile birşey yazınca hiçbirşey yollamıyor hatada  vermiyor(stdlib.h yüklü)
Herkes ölür ama herkes gerçekten yaşamaz

metaltrrocker

Benim sorunumla ilgili olarak, proteus 7.7 sp2 yi yükledim simulasyon sorunsuz çalıştı.Neden biranda sapıttı onu anlamış değilim.Teşekkür ederim yardımlar için.

yldzelektronik

Alıntı yapılan: skara1214 - 03 Ağustos 2013, 23:50:07
Şimdi printf komutundan hiç cevap alamıyorum.Kendim ayar yapıp txrege yükleyince sıkıntı yok ama printf ile birşey yazınca hiçbirşey yollamıyor hatada  vermiyor(stdlib.h yüklü)

Her hangi biryerde yada main programda putc fonksiyonu tanımla.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

skara1214

nasıl yani?  örnek satır verebilirmisiniz
Herkes ölür ama herkes gerçekten yaşamaz

yldzelektronik

void putch(char x){

    while(!TRMT);
    TXREG = x;
}
unsigned char getch(){
	/* retrieve one byte */
	while(!RCIF)	/* set when register is not empty */
		continue;
	return RCREG;
}
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

skara1214

bunda sıkıntı yok ben printf komutunu arıyorum mesela 16 bitlik bir sayı nasıl yollanır? printf("sss %lu",x); böyle kullanım için
Herkes ölür ama herkes gerçekten yaşamaz

AsHeS

Alıntı yapılan: skara1214 - 04 Ağustos 2013, 01:41:58
bunda sıkıntı yok ben printf komutunu arıyorum mesela 16 bitlik bir sayı nasıl yollanır? printf("sss %lu",x); böyle kullanım için
printf  fonksiyonu putch'ye çağrı yapar putch tanımlayın printf ile kullanın :)

skara1214

Herkes ölür ama herkes gerçekten yaşamaz

z

XC8 de ilk programi yazmak uzere kollari sivadim. Bir an once kodu yazip kurtulmak istiyorum.

Bunun icin 16F628A icin interrupt kullanan basit bir programinizi sablon olarak kullanip uzerinden devam etmek istiyorum.

Boyle bir sablon verebilirmisiniz?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

Elimde 16F887 icin olan bir kod var sadece. Henuz tamamlanmamis (ve yarim haliyle dsPIC30F'e gecirip oradan devam edecegim) bir BLDC surucu kodunun ana .c dosyasi. Belki fikir verir.
/* 
 * File:   bldcMain.c
 * Author: tagli
 *
 * Created on July 3, 2013, 5:26 PM
 */

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "utils.h"
#include "lcd.h"
#include "lcdMsgs.h"
#include "params.h"
#include "usart.h"
#include "status.h"
#include "protocol.h"
#include "cmd.h"

//Configuration Bits
#pragma config CPD = OFF
#pragma config BOREN = OFF
#pragma config IESO = OFF
#pragma config FOSC = HS
#pragma config FCMEN = OFF
#pragma config MCLRE = ON
#pragma config WDTE = OFF
#pragma config CP = OFF
#pragma config LVP = OFF
#pragma config PWRTE = ON
#pragma config CP = OFF

#define LCD_ENABLED

//Other Constants
const float RPM_RANGE = 4000.0;

//Allien Functions
char getCW(char hall);
char getCCW(char hall);

//Local Function Prototypes
void initialize(void);
void initPWM(void);
void interrupt isr(void);

//Variables
//None yet...

void interrupt isr(void){
	if (RBIE == 1 && RBIF == 1){
		char hall = updateHall();
		if (s.direction == 0) PORTA = getCW(hall);
		else if (s.direction == 1) PORTA = getCCW(hall);
		RBIF = 0;
	}
	else if (TMR1IE == 1 && TMR1IF == 1){
		++sysTick;
		TMR1IF = 0;
	}
	else if (TXIE == 1 && TXIF == 1) txInt();
	else if (RCIE == 1 && RCIF == 1) rxInt();
}

int main(void) {
	initialize();
	printGreatings();
	lcdClear();

	p.ki_s = 0.0005;
	float duty = 0.0;

	//Main Loop
	while(1){
		updateStatus();
		if (proReceive() == 1){
			processCommands(inProBuf);
		}

		//Calculating the reference (to be moved into updateStatus)
		int pot = readADC(7);
		float ref = (pot - 512) * (RPM_RANGE / 512.0);
		ref = fabs(ref);
		
		float err = ref - abs(s.spdNow);
		duty += err * p.ki_s * s.dt;
		duty = limit(duty, 0, 0.90);

		#ifdef LCD_ENABLED
		//LCD Update
		lcdClear();
		printRef((int)ref);
		printRpm(s.spdNow);
		printPwm((int)(duty*100));
		printErr();
		#endif

		//PWM Update
		setDuty(duty);
				
		delayMs(100);
	}
	panic();
	return (EXIT_SUCCESS);
}

void initialize(void){
	//Pin Settings
	PORTA = 0;
	PORTB = 0;
	PORTC = 0;
	PORTD = 0;
	PORTE = 0;

	TRISA = 0b11000000;
	TRISB = 0b11111111;
	TRISC = 0b11001000;
	TRISD = 0b00000111;
	TRISE = 0b11111111;

	//ADC Settings
	ANSEL = 0b10000000; //RE2 -> Analog input
	ANSELH = 0;
	ADCON0 = 0b10011101;
	ADCON1 = 0b10000000;

	//PWM Settings
	T2CON = 0b00000101; //TMR2 on, prescaler 1:4
	PR2 = (PWM_PERIOD - 1);
	CCP2CON = 0b00001100;
	setDuty(0.0);

	//Timer1 Initialization
	TMR1H = 0;
	TMR1L = 0;
	T1CON = 0b00110101; //Prescaler -> 1:8

	//USART initialization
	usartInit(B115200);

	//Variable initializations
	sysTick = 0;
	phaseCounter = 0;

	//Module Initializations
	initStatus();
	initParameters();
	
	#ifdef LCD_ENABLED
	lcdInit();
	lcdHome();
	#endif

	//Interrupt Settings
	IOCB = 0b00010101;
	INTCON = 0b11001000; //PORTB int. is enabled
	TMR1IF = 0;
	TMR1IE = 1; //Timer1 interrupt is enabled

	//Initilization Done Signal
	DEBUG_LED = 1;
	delayMs(50);
	DEBUG_LED = 0;
	delayMs(50);
}
Gökçe Tağlıoğlu

z

Yeni bir proje olustur demistim ve kullanacagim cip olarak da 16F628A yi secmistim.

Bu durumda senin programina daha baska bir sey ilave etmeme gerek kalacakmi?

Dogrudan register isimleri ile donanima erismeyi dusunuyorum. Bunun icin 16F628 ile ayri bir tanim (include vs) yapmam gerekecekmi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

#44
Hayir. MPLABX projede secilen modele gore bir #define olusturuyor kendi icinde sanirim. xc.h, bu tanimlamaya gore ilgili header dosyasini include ediyor. Bu sebeple sadece xc.h'in include edilmesi yeterli. Ancak yanlis hatirlamiyorsam bunun tum diger .c dosyalarinda da (veya baska header dosyalari uzerinden dolayli olarak) yapilmasi tavsiye ediliyordu.

Bu arada, stdlib ve stdio'ya gerek olmayabilir. Kendi genel template'i ile gelmislerdi bende belki ise yararlar diye silmemistim galiba. Ancak hazir genel template'deki main'in argumanlarini silersen birkac byte kazanabilirsin. Donusunu void yapmak da 1 byte kazandirabilir belki, her nedense onu yapmamisim.
Gökçe Tağlıoğlu