;D
Perlu bantuan nih kalian semua - semua :D
lg bikin aplikasi sms controller buat nyalain 8 buah lampu rencananya :)
pake atmega 16 n covi avr pkenya mode pdu
aku dah coba koneksi ke komputer n dh bisa buat kirim.
waktu aku coba kirim pake mikro ada masalah nih . . . :D
hp tuh langsung mati ....
kira kira napa yah
aku ksh listingnya yah ...
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
[pranala luar disembunyikan, sila masuk atau daftar.]Project :
Version :
Date : 6/15/2010
Author : NeVaDa
Company : sttw
Comments:
Chip type : ATmega16
Program type : Application
AVR Core Clock frequency: 12.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include <delay.h>
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
#define enter putchar(0x0D);
#define nl putchar(0x0A);
char echo,AT,pdu,send,cek_send;
void cek_hp(void)
{
printf("AT\x0D\x0A");
while(AT!='K')
{
printf("AT\x0D\x0A");
AT=getchar();
}
PORTA.0=1;
}
void no_echo(void)
{
printf("ATE0\x0D\x0A");
while(echo!='K')
{
printf("ATE0\x0D\x0A");
echo=getchar();
}
PORTA.1=1;
}
void pdu_mode(void)
{
printf("AT+CMGF=0");
enter;
nl;
delay_ms(200);
while(pdu!='K')
{
printf("AT+CMGF=0");
enter;
nl;
delay_ms(200);
pdu=getchar();
}
PORTA.2=1;
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 19200
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x26;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
cek_hp();
delay_ms(500);
no_echo();
delay_ms(500);
pdu_mode();
delay_ms(500);
while (1)
{
delay_ms(200);
printf("AT+CMGS=29");
enter;
nl;
delay_ms(1000);
printf("0691261801000011000D91265822271261F40000AA0FE179BD5EAFD7EBF57ABD5EAFD701");
putchar(0x1B);
while(send!='K')
{
printf("AT+CMGS=29");
enter;
nl;
delay_ms(1000);
printf("0691261801000011000D91265822271261F40000AA0FE179BD5EAFD7EBF57ABD5EAFD701");
putchar(0x1B);
PORTA.5=1;
send=getchar();
}
PORTA.4=1;
};
}
setelah smlem w coba _ coba
msh juga blm berhasil
w coba simpen data pdu di memory hp penggalan listingnya gini :
void send_atcmgw(void)
{
while(atcmgw!='K')
{
printf("AT+CMGW=19\x0D");
delay_ms(100); //harus di pake delay kalau tidak hp mati
atcmgw=getchar();
if(atcmgw==0x20)
{
printf("0691261801000011000D91265847377221F30000AA046572D80D\x1A");
}
else
{
putchar(0x1A);
}
}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("atcmgw");
lcd_gotoxy(0,1);
lcd_putsf("ok");
delay_ms(3000);
}
hasilnya sms di inbox jd full dgn sendiri ......... ??? mungkin krna dari putchar(0x1A)
apa mungkin mikronya g mampu ngirim pdu sebnyk gt yah ??? ada yg bisa bantu g kira2 knapa ?? ???
g putus asa nih bikin penasaran . . . kok g jadi ;D
gue rombak - rombak lagi eh ketemu gini nih programnya :D
void send_sms(void)
{
while(send!='K')
{
printf("AT+CMGS=19\x0D");
delay_ms(100);
printf("0691261801000011000D91265822271261F40000AA046572D80D\x1A");
send=getchar();
delay_ms(100);
if(send!='K')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("send sms");
lcd_gotoxy(0,1);
lcd_putsf("waiting");
delay_ms(3000);
}
}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("send sms");
lcd_gotoxy(0,1);
lcd_putsf("sending");
delay_ms(3000);
}
program aku tes n jadi ... ;D tpi yg aneh nih disitu kan ada prog buatmenampilkan sms waiting atw sending.
lha pas hp tu lagi g da sinyal atw mencari jaringan otmtis staus ke waiting ...
tyus bas ok dpt sinyl sms terkirim ... status g berubah .... tetep waiting harusnya kan keluar dari looping itu ... status gnti ... knpa yah ???? pa yg salah ?? ???
Kutip dari: haglan pada Juni 19, 2010, 10:41:54 PM
g putus asa nih bikin penasaran . . . kok g jadi ;D
gue rombak - rombak lagi eh ketemu gini nih programnya :D
void send_sms(void)
{
while(send!='K')
{
printf("AT+CMGS=19\x0D");
delay_ms(100);
printf("0691261801000011000D91265822271261F40000AA046572D80D\x1A");
send=getchar();
delay_ms(100);
if(send!='K')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("send sms");
lcd_gotoxy(0,1);
lcd_putsf("waiting");
delay_ms(3000);
}
}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("send sms");
lcd_gotoxy(0,1);
lcd_putsf("sending");
delay_ms(3000);
}
program aku tes n jadi ... ;D tpi yg aneh nih disitu kan ada prog buatmenampilkan sms waiting atw sending.
lha pas hp tu lagi g da sinyal atw mencari jaringan otmtis staus ke waiting ...
tyus bas ok dpt sinyl sms terkirim ... status g berubah .... tetep waiting harusnya kan keluar dari looping itu ... status gnti ... knpa yah ???? pa yg salah ?? ???
yang membuat seperti itu ya if send tidak sama dengan karakter K
jadi setiap HP mengirim data serial, lantas diterima.
Jika yang diterima itu bukan K, maka tampil itu mas
kenapa hanya ngambil karakter doank???
coba ambil textnya
buka karakter
cara ambil text yaitu pake looping pengambilan karakter
looping karakter yah .... penjelasannya gimana tuh
Wow... Mangstab...
Udah di coba dan di tes perfungsi?
Jalan atau tidak... Coba dulu satu-satu kalo berhasil baru digabungkan.
Kutip// Declare your global variables here
#define enter putchar(0x0D);
#define nl putchar(0x0A);
Mending ga usa tulis begini biar ga bingung nanti.
Kutipvoid cek_hp(void)
{
printf("AT\x0D\x0A");
while(AT!='K')
{
printf("AT\x0D\x0A");
AT=getchar();
}
PORTA.0=1;
}
printf("AT\x0D\x0A"); nah mending begini aja nulisnya.
Kebalik nih..
Sama buat echo juga..
void cek_hp(void)
{
AT=' '; // init karakter awal spasi atau kosong(terserah)
while(AT!='K' && AT!='R') // OK dan ERROR
{
printf("AT\x0D\x0A");
AT=getchar();
}
if (AT=='K') PORTA.0=1;
else /*kalo error*/;
Kutipvoid pdu_mode(void)
{
printf("AT+CMGF=0");
enter;
nl;
delay_ms(200);
while(pdu!='K')
{
printf("AT+CMGF=0");
enter;
nl;
delay_ms(200);
pdu=getchar();
}
PORTA.2=1;
}
void pdu_mode(void)
{
pdu=' '; // init karakter awal spasi atau kosong(terserah)
while(pdu!='K' && pdu!='R') // OK dan ERROR
{
printf("AT+CMGF=0\x0d\x0a");
delay_ms(200);
pdu=getchar();
}
if (pdu=='K') PORTA.2=1;
else /*kalo error ??*/;
}
terlihat klo fungsi, PDU, AT, echo mirip.
Coba sederhanakan jadi cukup 1 fungsi saja.
Bisa kok..
Kutipprintf("AT+CMGS=29");
.....................
putchar(0x1B);
.....................
while(send!='K')
{
printf("AT+CMGS=29");
enter;
nl;
delay_ms(1000);
AT+CMGS=29 apa yak ?? lopa aku...
trus putchar 0x1B apa?
Kok pake memori HP fungsinya buat apa ?
Memori Mikro masi ebih dari cukup kok..
aku lagi coba bikin program buatbaca data pdu nya nih .. temen temen ada yg bisanagsih tips nya ga ?? seputar cara membaca datanya
aku coba buat data buat baca pdunya tyus ditampilan ke lcd dibwh data diambil dai komputer blm dari mikro :
at+cmgr=1
+CMGR: 1,,22
06912618010000240D91265822476131F400000160321201908202C834
OK
dalam hexnya
00000000: 0D 0A 2B 43 4D 47 52 3A | 20 31 2C 31 2C 2C 32 32 ..+CMGR: 1,1,,22
00000010: 0D 0A 30 36 39 31 32 36 | 31 38 30 31 30 30 30 30 ..06912618010000
00000020: 32 34 30 44 39 31 32 36 | 35 38 32 32 34 37 36 31 240D912658224761
00000030: 33 31 46 34 30 30 30 30 | 30 31 36 30 33 32 31 32 31F4000001603212
00000040: 30 31 39 30 38 32 30 32 | 43 38 33 34 0D 0A 0D 0A 01908202C834....
00000050: 4F 4B 0D 0A OK..
void read_sms1(void)
{
unsigned int x,msg,atcmgr1,msg5;
char buffer2[82],msg2[82],msg3[82],msg4[82];
atcmgr1=' ';
while (getchar()!='K')
{
printf("AT+CMGR=1\x0D");
delay_ms(100);
for(x=0;x<82;x++)
{
msg3
- =getchar();
}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("wait respon");
for(x=0;x<82;x++)
{
msg5=msg3 - ;
lcd_gotoxy(0,1);
lcd_putsf(" ");
lcd_gotoxy(0,1);
sprintf(msg4,"%x",msg5);
lcd_puts(msg4);
delay_ms(2000);
}
}
tyus dicoba dari mikro data kebaca sampia terakhir ... n dah ku bandingin bnar .. tp disini kok looping terus yah .. kan harusnya ketika menjumpai karakter 'K' pengambilan data slese g looping napa yah ?? ???
maaf ada kesalahan, yang dari looping for pertama gini :
for(x=0;x<82;x++)
{
msg3
- =getchar();
}
dan yang looping for kedua
for(x=0;x<82;x++)
{
msg5=msg3 - ;
................................
looping terus??
kan itu karakter K udah diambil sebelumnya...
jadi nanti saat getchar selanjutnya itu ya karakter "."
coba ganti 82 menjadi 81
oh iyah, coba kayak gini mas
printf("AT+CMGR=1\x0D");
delay_ms(100);
while (getchar()!='K')
{
msg3 =getchar();
msg5=msg3;
}
:D
udah ketemu bro ..... ;D mantanpssssssssss...................... tgl bikin perbanding antar data >:D
2 hri byum ketemu juga ...... weleh weleh .... mumet ......
Kutip dari: haglan pada Juni 26, 2010, 06:13:46 AM
2 hri byum ketemu juga ...... weleh weleh .... mumet ......
apa yang belum ketemu???
share atuh... ntar kita selesaikan.. hehehe
masalah pembanding data??
data apa yang dibandingkan??
k'lo data string perlu ada sedikit cara
tidak seperti data yang lain
sedikit pengetahuan
untuk data string
str1[] = "halo"
ini sama dengan
str1[] = {'h','a','l','o','\x0'}
wah semoga membantu untuk membandingkan data string yah.. hehehe
string tidak akan bisa membandingkan seperti ini
str1 == str2
namun perlu dicek karakter per karakter
kalo di library string kayanya bisa yah ?? lgsng dibandingin lg pelajari library string nya nih
Kutip dari: haglan pada Juli 03, 2010, 06:53:25 PM
kalo di library string kayanya bisa yah ?? lgsng dibandingin lg pelajari library string nya nih
wah blum pernah pake library string sih. hehehe
Bandingkan data ga bisa perkata tapi perhuruf.
caranya macam-macam, bisa dengan looping, perulangan, atau menggunakan gerbang logika..
Misalnya:
#define false 0;
#define true 1;
unsigned char look_table[4]={'T','E','S','T'}; // lookup table data pembanding.
unsigned char data_terima[4]; // memori data diterima
unsigned char sama=false;
void COMPARE_logic() // gerbang logika
{
if (look_table[0]==data_terima[0] && look_table[1]==data_terima[1] && look_table[2]==data_terima[2] && look_table[3]==data_terima[3]) sama= true;
else sama=false;
}
void COMPARE_loop() // perulangan
{
unsigned char x;
sama=true;
for (x=0; x<4; x++)
{
if (look_table[x]!=data_terima[x]) sama=false;
}
if sama==true {/*jika sama*/}
else {/*jika beda*/}
}
Kalo salah maklum yahh...
Soalnya ga dicoba lgs.
Yang penting logikanya.. OK..
;) ;) :D
hohohoh .... mantap bro atk cobain deh hehe ;D
oh ya bnrnya program dah jadi tapi program masih kurang stabil ajh gt ... kadang - kadang urutannya bner bisa nyalain lampu tuh ... kadang - kadang nyangkut program nya ... ;D
kira2 napa yah ?? apa krna musti level ttl nya harus sama persis yah ?... di hp siemens c45 aku ukur lvel ttl 2,3 v .. krna di mikro 5 volt aku turunin pake dioda di seri sebanyak 7 buah .... jadi aku ukur sekitar 2,4 gt ???
maaf mas
boleh tanya
maksude "K" pada "AT!=K" apah mas?
masalahnya saya lagi bkin alat pakai AT Command pengukuran suhu dengan tampilan SMS pada HP siemens C35 berbasis ATMega 8535
Kutip dari: vibe pada Mei 31, 2011, 10:57:44 PM
maaf mas
boleh tanya
maksude "K" pada "AT!=K" apah mas?
masalahnya saya lagi bkin alat pakai AT Command pengukuran suhu dengan tampilan SMS pada HP siemens C35 berbasis ATMega 8535
K yang dimaksud diatas bukan circle K haha :D
K itu cuman ngambil dari kata OK balasan dari HP menandakan perintah sudah dikerjakan. lawannya adalah ERR yang diambil satu karakter R.
haha.. cuman bwt simpelnya mungkin, harusnya kalo ingin lebih bagus datanya disimpan di array terus dibandingkan. getu mas jadi yang dibandingkan bukan cuman satu karakter aja.
untuk perbandingan data mudah aja, sebenarnya dengan bentuk data apapun bisa.. mau flash atau sram mau eeprom .. tinggal cara perbandingannya aja :D
ini contoh kalo fungsinya buat sendiri:
#include <string.h> //ini untuk fungsi strlen();
#define __err 1 //ini untuk ERROR
#define __ok 0 //ini untuk OK
//dibawah adalah karakter konstanta (pembanding)
//disimpan dalam memory flash
__flash char konstanta_1[]={"WWW.NUBIELAB.COM"}; //sample konstannya
/*
Dibawah adalah fungsi pembanding karakter yang berbentuk array dalam sram
dengan karakter dalam bentuk array pada flash.
nilai balik fungsi, char 0 atau 1, 0 ERROR 1 OK.
data dibandingkan mulai dari index 0, jadi misal ada karakter dibelakang data
yang dibandingkan gk masalah, karena jumlah index pembanding diambil
dari panjang karakter konstanta pada memory flash.
contoh cara panggil:
if(perbandingan_data(smstext,konstanta_1) == 0){
//disini bila data sama dari OK
}
else{
//disini bila data tidak sama ERR
}
*/
char perbandingan_data(char *datane,__flash char *konstanta){
unsigned int i;
char err_ok;
for(i=0;i<strlenf(konstanta);){
if(datane != konstanta){
err_ok = __err;
break;
}
i++;
}
if(err_ok != __err){
return __ok;
}
else return __err;
}dan bisa juga pake yang dari bawaan kompiler yg terdapat pada library string.h:
untuk perbandingan data sram dengan sram :signed char strncmp(char *str1,char *str2,unsigned char n);signed char = nilai baliknya, *str1 = pointer karakter pada sram, *str2 pointer karakter pada sram, n = jumlah karakter yang mau dibandingkan.
untuk perbandingan data flash dengan sram:signed char strncmpf(char *str1,char flash *str2,unsigned char n);signed char = nilai baliknya, *str1 = pointer karakter pada sram, *str2 pointer karakter pada flash, n = jumlah karakter yang mau dibandingkan.
nilai balik bila data sama adalah 0 dan bila data tidak sama bisa lebih besar atau lebih kecil karena nilai baliknya bertipe signed char!
begitu saja... hahaha programming with ease!
ada yang tau sms listing pake bascom 8051 gk...????
Wah sesepuh ane juga butuh nie aplikasi sms ini, tapi tugas akhir saya adalh mengendalikan servo pada lengan robot dngn sms
jadi kita ketik sms "angkat" maka servo akan mengangkat ,geser kanan,kiri dan letakkan
waduh-waduh masi PUsiiiiiiiiiiiing 10000 keliling.........
ijin nyimak gan..!!
kalo untuk gprs gimana yaa?
ada yang tau???
:-\
para suhu semuanya ada yang tau coding buat nampilan data di lcd lewat sms dengan menggunakan modem gsm sim 300?