Pic Programlama Yardım !!!

fsm28

Üye
Katılım
10 Haz 2009
Mesajlar
3
Puanları
1
Adres Değer
0x020 0x40
0x021 0x01
0x022 0x41
0x023 0x02
0x024 0x42
0x025 0x03
Pic programlamaya yeni başladım.Asembly ile bu sıralamayla devam eden atamalar yapan programı yazıcam.Ama nasıl yapacağımı hala çözemedim yardımlarınızı bekliyorum.Pic 16F877A kullanıyorum.
 
öncelikle değişkeninizi w registerina atama yaparsınız:

movlw 0x40: 0x40 sayısını w registerina atadık

daha sonra w register içeriğini mesela porta ya atacaksınız diyelim:

movwf PORTA: w registeriçeriğini yani (0x40) sayısını porta ya atmış olduk.

diğer tüm atamalarınız bu sıra ile yapacaksınız.

umarım yardımcı olmuşumdur...
 
;===PROG7.ASM====29/05/2000=======
LIST P=16F84
INCLUDE "P16F84.INC"
SAYACl EQU H'0C' ;SAYACl registerinin adresi
SAYAC2 EQU H'0D' ;SAYAC2 registerinin adresi
PORTA EQU h'05'
PORTB EQU h'06'
STATUS EQU h'03'
TRISA EQU h'85'
TRISB EQU h'86'
CLRF PORTB ;PortB'yi sıfırla
BSF STATUS,5 ;BANKl’e geç
CLRF TRISB ;PortB'nin tüm uçları çıkış
MOVLW B'11111111' ;W‹h'FF •
MOVWF TRISA ;PortA'nın tüm uçları giriş
BCF STATUS, 5 ;BANK0’a geç
BASLA
MOVLW H'0A' ;W‹h'0A'
MOVWF SAYACl ;SAYACl‹W
TEST
BTFSC PORTA,1 ;PortA'nın 1. bit'i 0 mı?
GOTO TEST ;Hayır, tekrar test. et
GECIKME
MOVLW H'FF' ;W‹h'FF'
MOVF SAYAC2 ;SAYAC2‹W
GEC
DECFSZ SAYAC2,F ;SAYAC2‹SAYAC2-1, SAYAC2=0 mı?
NOP ; Arkın sönmesini bekle
NOP ; “
NOP ; “
GOTO GEC
DECFSZ SAYACl,F ;SAYACK-SAYACl-1 ,SAYAC1=0 mı?
GOTO BASLA ;Hayır, BASLA etiketine atla
GOTO TEST
MOVF SAYACl,W ; W‹SAYACl
MOVWF PORTB ;SAYAC1’i PortB'ye gönder
GOTO TEST ;PortA'yi tekrar test et.
END ;Prograa kodlarının sonu
program a portunun 1 bitine bağlı butona basılınca ,B portundaki Ledleri sıra ile yakacak
programlamayı yeni öğreniyorum. Burda bir hata var ama bulamadım.
pıc öğreniyorum kitabı sayfa 51 yardımcı olabilirmisiniz
 
acil bu soruların cevabını bulmam lazım lütfen yardım pıc 16f84 ile çalışıyorum

Değerlendirme Soruları
1- 6 sayısının faktöriyelini alan ve elde edilen sonucu aktif DS’in 0210H adresine kopyalayan programı döngü komutları kullanarak yazınız ve Debug’da uygulayınız.
2- 0500H adresindeki giriş portuna bağlı butonlardan (B0..B7) B3’e basıldığında 0501H adresindeki çıkış portuna bağlı 7 segment display üzerinde 0..9 arası birer birer sayan, herhangi bir anda B0’a basıldığında ise sonlanan programı döngü komutu da kullanarak yazınız. Sayma işlemi, program sonlandırılmadığı sürece baştan başlayıp devam edecektir.
3- Aktif data segmentin 0100 H adresinden başlayan 30 bytelık bloğunu 0500 H adresinden başlayan bölgesine kopyalayan programı döngü komutu da kullanarak yazınız ve Debug’da uygulayınız.
4- Aktif DS belleğin 80000H fiziksel adresinden başlamaktadır. DS’in 0301H offset adresinden başlayan 80 byte’lık bilgi içerisinde AAH bilgisini arayan, bulunması durumunda DS’in 0400H adresine kaçıncı adreste bulunduğu bilgisini, bulunamaması durumunda da aynı adrese FFH yazan programı yazınız ve Debug’da uygulayınız.
 
arkadaşlar merhaba
çok acil yardıma ihtiyacım var. şimdi elimde bulunan iki farklı direncin ölçümünü yapmak istiyorum. 1-0-2 anahtarla seçimini yapıcam ölçme direnci devredeki RX direncidir. çıkışta kırmızı , yeşil led , buzzer ve lcd var. devreyi isiste kurdum similasyonda lcd bana değeri veriyor fakat ok durumunda sürekli , açık devre ve uygunsuz durumunda kesikli çal dediğimde her iki durumda kesikli çalıyor tabi bunlar similasyonda . pratiğe geçtiğimde ise pici programladım devreyi kurdum. pic girişi okuyup çıkışa hiç birşey aktarmıyor. ne lcd , ne led ne buzzer çıkış veriyor. girişi de okumuyor. Yardıma çok ihtiyacım sorun nerede devrede mi programda mı?



#include <16f877A.h>
#DEVICE ADC=10 //10 BİT ADC
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(d)
#use fast_io(a)
#use fast_io(e)


unsigned int16 adcbilgi=0; //16 bitlik işaretsiz adcbilgi adında bir degisken tanımladık...
float voltajdeger=0; //ondalıklı voltaj adında bir degisken tanımladık
float R3 = 0.51 , Vcc = 5;
float direnc = 0;

#define LCD_ENABLE_PIN PIN_d3 //lcd enable pini d3
#define LCD_RS_PIN PIN_d1 //lcd rs pini pin d1
#define LCD_RW_PIN PIN_d2 //lcd rw pini pin d2

#define LCD_DATA4 PIN_d7 //lcdnin data4 pini pind7
#define LCD_DATA5 PIN_d6 //lcdnin data5 pini pind6
#define LCD_DATA6 PIN_d5 //lcdnin data6 pini pind5
#define LCD_DATA7 PIN_d4 //lcdnin data7 pini pind4

#include <lcd.c> // lcd dosyalarını yükler

void main()

{
set_tris_a(0b000001); //a0 pini giriş ...
setup_adc(adc_clock_div_32); //adc clock frekansı fosc/32
setup_adc_ports(AN0); //AN0 ANALOG GİRİŞ

set_tris_e(0xff); //e portu giriş
set_tris_d(0x00); //d portu cıkıs
set_tris_b(0x00); //b portu cıkıs
output_d(0x00); //d portunu sıfırla
output_b(0x00); //b portunu sıfırla
lcd_init(); //lcd dosyalarını yükle


while(1) //sonsuz döngüye giriliyor..

{
printf(lcd_putc,"\f"); //lcd'yi temizle
lcd_gotoxy(2,1);printf(lcd_putc," Direnc "); //lcd 1.satır 2.sütundan YAZ.
lcd_gotoxy(2,2);printf(lcd_putc," Olcme ");
delay_ms(1500); //2.SATIR 2.sütundan itibaren yaz.1.5 sn bekle
printf(lcd_putc,"\f");

set_adc_channel(0); //adc kanalı 0 aktıf
delay_us(20); //20 us bekle
adcbilgi=read_adc(); //adc oku adc bilgiye ata
voltajdeger=adcbilgi*0.00488828125; //5/1024=0.0048828125 ADIM voltajı...
direnc =((voltajdeger * R3)/(Vcc - voltajdeger)); // printf(lcd_putc,"\f"); //lcd'yi temizle


if (input(pin_e0) && input(pin_e1)) // e0 ve e1 lojik 1 ise
{
if(direnc >= 5.04 && direnc <= 6.16) // direnç değeri belirtilen aralıkta ise değeri yaz ve ok yaz
{
Output_high(pin_b0); //yesil led yak
Output_high(pin_b2); //buzzer çal
delay_ms(1000);
lcd_gotoxy(2,1);printf(lcd_putc,"DIRENC=%fkOhm",direnc); //direnc bilgisini göster...
Delay_Ms(100); //100 Ms BEKLE
lcd_gotoxy(2,2);printf(lcd_putc,"******OK******* ");
delay_ms(1000); //2.SATIR 2.sütundan itibaren yaz.1 sn bekle
printf(lcd_putc,"\f"); //lcd'yi temizle
}
else if (direnc > 20) //eğer ki bu şartların dışında ise açık devre var demektir.
{
lcd_gotoxy(2,1);printf(lcd_putc,"SONSUZ DIRENC "); //açıklama bilgisini göster...
Delay_Ms(100); //100 Ms BEKLE
lcd_gotoxy(2,2);printf(lcd_putc,"ACIK DEVRE VAR");
delay_ms(1000); //2.SATIR 2.sütundan itibaren yaz.1 sn bekle
printf(lcd_putc,"\f");
output_high(pin_b1); //kırmızı ledi yak
output_high(pin_b2); // aralıklı buzzer çal
delay_ms(500);
output_low(pin_b2);
delay_ms(500);

}
else //eğer ki belirtilen aralıkta değilde değeri yaz ve uyarı ver
{
lcd_gotoxy(2,1);printf(lcd_putc,"DIRENC=%fkOhm",direnc); //direnc bilgisini göster...
Delay_Ms(100); //100 Ms BEKLE
lcd_gotoxy(2,2);printf(lcd_putc," UYGUN DEGIL ");
delay_ms(1000); //2.SATIR 2.sütundan itibaren yaz.1 sn bekle
printf(lcd_putc,"\f");
output_high(pin_b1); //kırmızı ledi yak
output_high(pin_b2); // aralıklı buzzer çal
delay_ms(500);
output_low(pin_d2);
delay_ms(500);

}
}
else if (input(pin_e0) && input(pin_e2)) // e0 ve e2 lojik 1 ise
{
if(direnc >= 0.75 && direnc <= 0.85) // direnç değeri belirtilen aralıkta ise değeri yaz ve ok yaz
{
Output_high(pin_b0); //yesil led yak
Output_high(pin_b2); //buzzer cal
delay_ms(1000);
lcd_gotoxy(2,1);printf(lcd_putc,"DIRENC=%fkOhm",direnc); //direnc bilgisini göster...
Delay_Ms(100); //100 Ms BEKLE
lcd_gotoxy(2,2);printf(lcd_putc,"******OK*******");
delay_ms(1000); //2.SATIR 2.sütundan itibaren yaz.1 sn bekle
printf(lcd_putc,"\f"); //lcd'yi temizle
}
else if (direnc > 20) //eğer ki bu şartların dışında ise açık devre var demektir.
{
lcd_gotoxy(2,1);printf(lcd_putc,"SONSUZ DIRENC "); //direnc bilgisini göster...
Delay_Ms(100); //100 Ms BEKLE
lcd_gotoxy(2,2);printf(lcd_putc,"ACIK DEVRE VAR"); //2.SATIR 2.sütundan itibaren yaz.1 sn bekle
delay_ms(1000);
printf(lcd_putc,"\f");
output_high(pin_b1); //kırmızı ledi yak
output_high(pin_b2); // aralıklı buzzer çal
delay_ms(500);
output_low(pin_b2);
delay_ms(500);

}
else //eğer ki belirtilen aralıkta değilde değeri yaz ve uyarı ver
{
lcd_gotoxy(2,1);printf(lcd_putc,"DIRENC=%fkOhm",direnc); //voltaj bilgisini göster...
Delay_Ms(100); //100 Ms BEKLE
lcd_gotoxy(2,2);printf(lcd_putc," UYGUN DEGIL ");
delay_ms(1000); //2.SATIR 2.sütundan itibaren yaz.1 sn bekle
printf(lcd_putc,"\f");
output_high(pin_b1); //kırmızı ledi yak
output_high(pin_b2); // aralıklı buzzer çal
delay_ms(500);
output_low(pin_d2);
delay_ms(500);

}
}
else
output_d(0x00); //d portunu sıfırla
output_b(0x00); //b portunu sıfırla
}
}
 

Ekli dosyalar

  • Adsız.png
    Adsız.png
    70.8 KB · Görüntüleme: 5

Forum istatistikleri

Konular
128,179
Mesajlar
915,658
Kullanıcılar
449,940
Son üye
yavuzturan

Yeni konular

Geri
Üst