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

Başlatan fryrmnd, 26 Temmuz 2012, 16: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 - 04 Ağustos 2013, 02: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, 04: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 == && RBIF == 1){
	
	
char hall updateHall();
	
	
if (
s.direction == 0PORTA getCW(hall);
	
	
else if (
s.direction == 1PORTA getCCW(hall);
	
	
RBIF 0;
	
}
	
else if (
TMR1IE == && TMR1IF == 1){
	
	
++
sysTick;
	
	
TMR1IF 0;
	
}
	
else if (
TXIE == && TXIF == 1txInt();
	
else if (
RCIE == && RCIF == 1rxInt();
}

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(duty00.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

19 Ekim 2013, 20:53:41 #44 Son düzenlenme: 19 Ekim 2013, 20:56:42 Tagli
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

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.