16F877 ve DHT11

Başlatan aozsahin, 28 Ocak 2020, 17:12:10

aozsahin

Merhaba,

DHT11 sensörün 16F628 ile kodunu oluşturup haberleştirdim. Elimde çalışan bir devre var. Port yetersizliğinden dolayı 40 bacaklı 16F87x bir işlemciye geçmek istiyorum. Ne kadar uğraştıysam PIC16F877 işlemciyi DHT11 ile haberleştiremedim. A,B,C ve D portlarını denedim hiçbiri ile haberleşmiyor. Kod çalışan bir kod ama ne sıkıntı var çözemedim.

erhang

Kodları ve semayı paylasırsan eger yardımcı olan arkadas olacaktır

aozsahin

PORTA=0:TrisA=%00001110
PORTB=0:TrisB=%00000001
PORTC=0:TrisC=%00000001
PORTD=0:TrisD=%00000001
PORTE=0:TrisE=%00000001


'*********LCD Tanımlamaları***********
DEFINE LCD_DREG      PORTB   
DEFINE LCD_DBIT         4      
DEFINE LCD_EREG      PORTB   
DEFINE LCD_EBIT        3   
DEFINE LCD_RSREG   PORTB   
DEFINE LCD_RSBIT      2            
DEFINE LCD_BITS         4      
DEFINE LCD_LINES      2
DEFINE OSC 8
                             
'*********** DEĞİŞKEN Tanımlamaları ***********
dht var byte[32]
humidite var byte
haut var byte
bas var byte
temp var byte
x var byte
SET VAR BYTE
dht11 var PORTA.0
AYAR VAR PORTA.1
ART VAR PORTA.2
EKS VAR PORTA.3
i VAR BYTE
SURE VAR BYTE

SET=50
SURE=0

MAIN:
IF AYAR=1 THEN GOTO MENU
IF humidite>=SET then
HIGH PORTB.0
ELSE
LOW PORTB.0
ENDIF
TRISA.0 = 0 ' PORTA.0 = output
dht11 = 1 ' sortie à 1=Çıkış - 1
pause 1000 ' wait 2 sec
dht11 = 0 : pause 20 ' send 20ms low
dht11 = 1 : pauseus 40 ' send 40us hi

PulsIn PORTA.0, 1, haut 'reponse du dht-11=dht11 yanıtı
if haut < 15 then goto HATA


for x = 31 to 0 step-1 'capture des 8 bits entier humidite=Yakalama 8-bit tamsayı nem
PulsIn PORTA.0, 1, dht
  • ' 1
next x

For x = 31 to 0 step-1 'conversion en 1 ou 0: 14 ou 5=Dönüştürme 1 veya 14 veya 5
if dht
  • > 9 then
dht
  • =1 'partie décimale de la temp toujours à 0 =Ondalık kısmı hala temp 0
else
dht
  • =0
endif
next x

humidite=dht[31]*128+dht[30]*64+dht[29]*32+dht[28]*16+dht[27]*8+dht[26]*4+dht[25]*2+dht[24]*1
temp=dht[15]*128+ dht[14]*64+dht[13]*32+dht[12]*16+dht[11]*8+dht[10]*4+dht[9]*2+dht[8]*1

LCDOUT $FE,$80,"NEM = ",#humidite," % "
LCDOUT $FE,$C0,"ISI = ",#temp," C "
goto MAIN
HATA:
LCDOUT $FE,$80,"Sensor Yanit Yok"
LCDOUT $FE,$C0,"Sure:",#haut
PAUSE 200
goto MAIN

MENU:
LCDOUT $FE,$80,"YENI DEGER GIRIN"
LCDOUT $FE,$C0,"NEM SET = ",#SET," % "
PAUSE 100
SURE=SURE+1
i=0
BUTTON PORTA.2, 1,254,255,i,1,ARTI
i=0
BUTTON PORTA.3, 1,254,255,i,1,EKSI
IF SURE=20 THEN
SURE=0
LCDOUT $FE,1
GOTO MAIN
ENDIF
GOTO MENU

ARTI:
 PAUSE 100
 SET=SET+1
 IF SET>99 THEN SET=99
 SURE=0
 GOTO MENU
EKSI:
 PAUSE 100
 SET=SET-1
 IF SET<10 THEN SET=10
 SURE=0
 GOTO MENU
END




POWER

isis dosyası olmadığı için simüle etme imkanım olmadı ama 877a da olması gereken aşağıdaki iki satırı göremedim.
ADCON1=7             'ADC leri iptal pinlerin hepsi digital
CMCON =7             'komparatörler iptal

aozsahin

Alıntı yapılan: POWER - 28 Ocak 2020, 20:07:27isis dosyası olmadığı için simüle etme imkanım olmadı ama 877a da olması gereken aşağıdaki iki satırı göremedim.
ADCON1=7             'ADC leri iptal pinlerin hepsi digital
CMCON =7             'komparatörler iptal

ADCON1=7 EKLEMİŞTİM BİRŞEY FARKETMEDİ
CMCON=7 EKLEYİNCE DERLEME HATASI VERİYOR ACABA BENİM MPLAB TA SORUNMU VAR

POWER

isis ve bas uzantılı dosyayı yükleyebilirseniz çok daha kolay olurdu.

aozsahin

#6
Bu eki görüntüleyemezsiniz.

aozsahin


POWER

dosya sağlıklı indirilemiyor.hata veriyor.

aozsahin

Tekrar gönderdim (bilgisayarda açılıyor, yüklerken bozulmuş olabilir)

aozsahin


ete

En çok yapılan hatalardan biriside 16F877 ile 16F877A nın karıştırılmasıdır.
16F877 eski teknoloji ile üretilen bir işlemci ve içerisinde Komparatör bulunmuyor. Yani bu işlemciyi kullanıyorsanız programa CMCON=7 komutunu ekleyemezsiniz.
Ama 16F877A yeni teknoloj ile üretilmiş bir işlemci ve içersinde komparatör vardır. Bu işlemci kullanılıyor ise CMCON=7 komutunu kullanmak ve komparatörleri iptal etmek gerekir.
Tabiiki derleme esnasında doğru işlemcide seçiliyor olmalı. Alinde 16F877A var iken 16F877 yi seçersen veya elinde 16F877 var iken 16F877A yı seçersen hata yapmış olursun. Bu nedenle einde hangisi var ise derlemede o işlemciyi seçmen gerekir.
Bir işlemci ile çalışan bir program doğru adaptasyon yapılır ise diğerinde de çalışır. Tabiiki çalışma hızlarıda aynı olmalıdır. Özellikle program içinde zamanlama fonksiyonları sıklıkla kullanılmış ise.
Şİmdi işlemcin ne ise ona bak ve programında eksik olan satırları ekleyerek programını çalışır hale getir.
Unutma 16F877 veya 16F877A da analog pinler vardır bunlar default olarak aktiftirler. Sen kullanmıyorsan bunları iptal etmen gerekiyor. Bunun komutu ADCON1=7 dir.
16F877 kullanıyorsan yalnızca yukardaki değişiklik ile programın çalışır hale gelmesi gerekir.
Yok 16F877A kullanıyor isen programa CMCON=7 komutunuda eklemen gerekiyor. Hepsi bu.

Ete

POWER

ete hocam son noktayı koymuş.Yeni yüklediğin dosyada hata veriyor.bilemiyorum hata bendenmi kaynaklanıyor.

ete

Dosyayı açtım açılıyor yani.
Programda ADCON1=%10001110  şeklinde bir komut var bu hatalı. Bu nedenle çalışmıyordur.
ADCON1=7 yazılması yeterli olacaktır. Şemayada baktım analog pin kullanımıyor.
İŞlemcide 16F877 o halde CMCON=7 ye de gerek yoktur. Ama gerçek devreyi yaparken dikkatli olmak gerek Piyasada 16F877A daha fazla bulunuyor ve ucuz diğeri bulunsa bile daha pahalı olması gerek.

İkaz etmem rağmen programda açılış gecikmesi yine koyulmamış. Buda çalışmayı etkiler.
MAIN satırından önce PAUSE 300 ekleyin.

Ete

aozsahin

Merhaba ADCON1=7 yi daha önce denemiştim. Olmamıştı. Tekrar aynı şekilde yaptım.

Pause 300 komutunu ekledim. Portd den tekrar porta. 0 a aldım. Kristal frekansı 16f628 ile aynı ama sonuç görseldeki gibi




Powered by EzPortal