Arkadaşlar merhaba,
İşlemciden adc ile okuduğum değeri sd carda kaydedip aynı zamanda da lcd de görmek istiyorum. Yaptığım yazılım da
adc değerini lcd de görebiliyorum fakat sd carda veri kaydedilmiyor. Ben de paylaştığım kodda da göreceğiniz üzere lcd rutinlerini iptal ettim. Bu şekilde çalıştırdığım da veri sd carda kayıt edilebiliyor. Hem sd card hem de lcd kısmını çalıştırmak istiyorum. Yardımlarınızı bekliyorum.
#define RS PORTBbits.RB2
#define EN PORTBbits.RB3
#define D4 PORTBbits.RB4
#define D5 PORTBbits.RB5
#define D6 PORTBbits.RB6
#define D7 PORTBbits.RB7
#include "mcc_generated_files/mcc.h"
#include <stdio.h>
#include "ff.h"
#include <stdint.h>
#include <stdbool.h>
#include "lcd.h"
FATFS FatFs; /* FatFs work area needed for each volume */
FIL Fil; /* File object needed for each open file */
void ADC_Init();
int ADC_Read(int);
#define vref 5.00
int digital;
float voltage;
uint16_t i=0;
void ADC_Init()
{
TRISA = 0xFF; /*Set as input port*/
ANSELAbits.ANSA0 == 1;
ADCON1 = 0x0F; /*Ref vtg is VDD & Configure pin as analog pin*/
ADCON2 = 0x92; /*Right Justified, 4Tad and Fosc/32. */
ADRESH=0; /*Flush ADC output Register*/
ADRESL=0;
}
int ADC_Read(int channel)
{
int digital;
/*channel 0 is selected i.e.(CHS3CHS2CHS1CHS0=0000)& ADC is disabled*/
ADCON0 |= ((1<<ADON)|(1<<GO));/*Enable ADC and start conversion*/
/*wait for End of conversion i.e. Go/done'=0 conversion completed*/
while(ADCON0bits.GO_nDONE==1);
digital = (ADRESH*256) | (ADRESL); //Combine 8-bit LSB and 2-bit MSB
return(digital);
}
void main(void) {
UINT bw;
//char s[16];
char t[20];
TRISA = 0xff;
TRISB = 0x00; //LCD BAGLANTILARI
// Lcd_Init();
ADC_Init();
// Initialize the device
SYSTEM_Initialize();
while (1) {
digital=ADC_Read(0);
// voltage= digital*((float)vref/(float)1023);
/*
sprintf(s, "Voltage = %f ",voltage );
Lcd_Set_Cursor(1,1);
Lcd_Write_String(s);
sprintf(s, "ADC = %d " , digital );
Lcd_Set_Cursor(2,1);
Lcd_Write_String(s);
__delay_ms(50);
*/
i++;
sprintf(t, "Measure %d :%d\r\n", i,digital);
if (f_mount(&FatFs, "", 1) == FR_OK) { // Mount SD
if (f_open(&Fil, "temp_log.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE) == FR_OK) { // Open or create a file
if ((Fil.fsize != 0) && (f_lseek(&Fil, Fil.fsize) != FR_OK)) goto endSD; // Jump to the end of the file
f_write(&Fil, t, 19, &bw); // Write data to the file
endSD: f_close(&Fil); // Close the file
}
}
__delay_ms(50);
}
}
/**
End of File
*/
Sorunum hala devam etmektedir.
Şu anda çok önemli bir konu var. Cin-şeytan dedektörü.. :D
SD kart PORTB de mi?
GÜNCEL
@PICaso sprintf(t, "Measure %d :%d\r\n", i,digital);
Bu komut ne işe yarıyor? Seriporttan da mı bilgi gönderiyorsun?
Alıntı yapılan: dumansiz - 11 Ekim 2019, 08:27:07@PICaso
sprintf(t, "Measure %d :%d\r\n", i,digital);
Bu komut ne işe yarıyor? Seriporttan da mı bilgi gönderiyorsun?
ADC den okuduğum değeri diziye atıp f_write(&Fil, t, 19, &bw); bu komut ile sd carda yazdırıyorum.
Alıntı yapılan: PICaso - 11 Ekim 2019, 10:24:59ADC den okuduğum değeri diziye atıp f_write(&Fil, t, 19, &bw); bu komut ile sd carda yazdırıyorum.
Hmm.Tamam. String formatında yazdırmak için yani.
Peki SD karta yazma adımlarını tek tek kontrol ettiniz mi?
Örneğin:
if (f_mount(&FatFs, "", 1) == FR_OK) { // Mount SD
bu koda "else" ekleyip "sd-kart takılı değil" hatası gibi bir şey bastırsanız?
Bir de sd-karta hiç mi yazmıyor yoksa anlamsız şeyler mi yazıyor? SD kartın içini "hex" açan bir programla okudunuz mu?
Lcd pinleri böyle olması lazım değilmi?
#define RS LATBbits.LATB2
Adc den önce sistem init olması lazım görebildiğim bunlar.
SYSTEM_Initialize();
TRISB = 0x00; //LCD BAGLANTILARI
ADC_Init();
Alıntı yapılan: dumansiz - 11 Ekim 2019, 11:15:01Hmm.Tamam. String formatında yazdırmak için yani.
Peki SD karta yazma adımlarını tek tek kontrol ettiniz mi?
Örneğin:
if (f_mount(&FatFs, "", 1) == FR_OK) { // Mount SD
bu koda "else" ekleyip "sd-kart takılı değil" hatası gibi bir şey bastırsanız?
Bir de sd-karta hiç mi yazmıyor yoksa anlamsız şeyler mi yazıyor? SD kartın içini "hex" açan bir programla okudunuz mu?
lcd rutinlerini kodda iptal edersem sd karta yazdırabiliyorum. İptal etmezsem lcd düzgün çalışıyor, sd carda dosya dahi oluşturmuyor. Benim istediğim anlık olarak adc değerini lcd de görmek aynı zamanda geri planda da sd carda yazdırmak.
Alıntı yapılan: serkan - 11 Ekim 2019, 11:39:08Lcd pinleri böyle olması lazım değilmi?
#define RS LATBbits.LATB2
Adc den önce sistem init olması lazım görebildiğim bunlar.
SYSTEM_Initialize();
TRISB = 0x00; //LCD BAGLANTILARI
ADC_Init();
#define RS PORTBbits.RB2
Bu şekilde de sorunsuz çalışıyor.
Dediğiniz değişiklikleri yaptım fakat sd card da dosya dahi oluşmuyor.
Arkadaşlar problem henüz çözülebilmiş değil. Tecrübe eden varsa yardımlarını bekliyorum.
İyi çalışmalar.
Uart portlu nextion bu projede sorunsuz çalışır. Nextion ekrana 9 değer gönderiyorum içinde adcde olan işlemciye hiç sorun çıkarmıyor. Tıkır tıkır çalışıyor. Nextion kullandığımdan beri lcdden uzaklaştım. 45k22 çift uart porta sahip zaten.
Alıntı yapılan: dnacikaya - 25 Kasım 2019, 17:56:31Uart portlu nextion bu projede sorunsuz çalışır. Nextion ekrana 9 değer gönderiyorum içinde adcde olan işlemciye hiç sorun çıkarmıyor. Tıkır tıkır çalışıyor. Nextion kullandığımdan beri lcdden uzaklaştım. 45k22 çift uart porta sahip zaten.
Hocam nextion ekran ile lcd ekran arasında fiyat olarak dağlar kadar fark var. :(
sd card iptal iken lcd çalısıyor. lcd iptal iken sd card çalısıyor. ama birlikteyken çalışmıyor.. .
Böyle bir durumda ben olsam çözüme giden adımlarım şöyle olurdu:
1-) adc iptal et, lcd iptal et, varsa seri port iptal et. sadece sd card çalışır vaziyete getir.
2-) sd karta basit bir float değişken yazdır. a=1.234; gonder_sdcard(a);
3-) 1 ve 2 başarılı ise bir bardak çay al.
4-) aynı programda lcd'yi devreye al ve "hello brother" yazdır.
5-) yeni zelanda saldırganını an ve ona küfret.
6-) 2. adımdaki a değişkenini lcd'ye yazdır.
7-) sonuc başarılı ise bir bardak çay daha al.
8- ) adc'yi devreye alıp adc sonucunda oluşan değişkeni lcd'ye yazdır.
9-) adc sonucunda oluşan değişkeni sd karta yazdır.
* bir adımı tamamlamadan sonraki adımlara asla geçme.
* her birkaç adımda programı yedekle.