![]() |
|
![]() |
#1 |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 154
: |
chào anh nam. khi em chạm tay vào chân của pic thì mất dữ liệu, khi đó em cũng không nhớ chân nào nữa. thế các trường hợp tăng hoặc giảm nguồn đột ngột cũng làm mất data trong eeprom phải không anh.
cho em hỏi luông. pic có 256 byte eeprom thế nếu mình dùng hết toàn bộ 256 byte này để chứa data thì có ảnh hưỡng gì đến việc mất data không anh. các lệnh khai báo trong config có ảnh hưỡng gì đến việc lưu trữ data trong eeprom của pic không. anh giải thích dùm em nhé. thank you! |
![]() |
![]() |
![]() |
#2 | |
Trưởng lão PIC bang
|
Trích:
Những câu hỏi trên của bạn liên quan đến nhiều vấn đề, không thể giải thích đơn giản bằng vài đoạn văn bản. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
![]() |
#3 | |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 154
: |
Trích:
Code:
#include<18f4550.h> #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOBROWNOUT #device 18F4550*=16 ADC=10 #use delay(clock=48000000) #include<E:\595\font9moi.c> #include<E:\595\font7.c> #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) #priority rda #use fast_io(a) #byte porta=0x05 #use fast_io(b) #byte portb=0x06 #use fast_io(c) #byte portc=0x07 #use fast_io(d) #byte portd=0x08 #use fast_io(e) #byte porte=0x09 #define clk pin_b4 #define data pin_b5 #define lock pin_b6 //********** DIA CHI CAC EPPROM ************************************************ #define add1 0x06 // 30 byte #define add2 0x25 // 34 byte #define add3 0x49 // 80 byte #define add4 0x9f // 100 byte #define b1 0x01 #define b2 0x02 #define b3 0x03 #define b4 0x04 //================== void giao_tiep(); void viet_eeprom(); void doc_eeprom1(); void doc_eeprom2(); void doc_eeprom3(); void doc_eeprom4(); void trabang(); #INT_RDA void giao_tiep() { int8 c; disable_interrupts(global); output_low(pin_b0); output_low(pin_b1); output_low(pin_b2); output_low(pin_b3); c = getc(); putc(c); k=c; if(k==255) { viet_eeprom(); } else { chu[s]=k; s++; delay_ms(500);} enable_interrupts(global); } //**************************************************** #INT_EEPROM void viet_eeprom() { int i,l,x; disable_interrupts(global); if(chu[0]==251)// chuoi 1 { write_eeprom(b1,s); for(i=0;i<s;i++) // s { write_eeprom(add1+i,chu[i]); } } if(chu[0]==252) // chuoi 2 { write_eeprom(b2,s); for(i=0;i<s;i++) // s { write_eeprom(add2+i,chu[i]); } } if(chu[0]==253)// chuoi 3 { write_eeprom(b3,s); for(i=0;i<s;i++) // s { write_eeprom(add3+i,chu[i]); } } if(chu[0]==254) // chuoi 4 { write_eeprom(b4,s); for(i=0;i<s;i++) // s { write_eeprom(add4+i,chu[i]); } } for(i=0;i<s+2;i++) {chu[i] = 10;} s=0; printf("W "); enable_interrupts(global); } //**************************************************** void doc_eeprom1() { int i,l; disable_interrupts(global); for(i=0;i<f1;i++) { l = read_eeprom(add1+i); chu[i] = l; } enable_interrupts(global); printf("C1 "); } //********************************************************** void doc_eeprom2() { int i,l; disable_interrupts(global); for(i=0;i<f2;i++) { l = read_eeprom(add2+i); chu[i] = l; } enable_interrupts(global); printf("C2 "); } //**************************************************** void doc_eeprom3() { int i,l; disable_interrupts(global); for(i=0;i<f3;i++) { l = read_eeprom(add3+i); chu[i] = l; } enable_interrupts(global); printf("C3 "); } //********************************************************** void doc_eeprom4() { int i,l; disable_interrupts(global); for(i=0;i<f4;i++) { l = read_eeprom(add4+i); chu[i] = l; } enable_interrupts(global); printf("C4 "); } //==================== void main() { set_tris_b(0); set_tris_a(0); set_tris_c(0); set_tris_e(0); set_tris_d(0); output_b(0); output_e(16); enable_interrupts(INT_eeprom); enable_interrupts(INT_RDA); enable_interrupts(global); printf("v "); delay_ms(3000); while(true) { // printf("/"); f1 = read_eeprom(b1); f2 = read_eeprom(b2); f3 = read_eeprom(b3); f4 = read_eeprom(b4); doc_eeprom1(); trabang(); doc_eeprom2(); trabang(); doc_eeprom3(); trabang(); doc_eeprom4(); trabang(); trabang1(); dichtrai1(); } } thay đổi nội dung bởi: namqn, 19-03-2008 lúc 06:31 PM. |
|
![]() |
![]() |
![]() |
#4 |
Trưởng lão PIC bang
|
Tôi không dùng CCS C, nhưng đọc qua code của bạn, tôi có cảm giác không ổn. Theo tài liệu của CCS C, #INT_EEPROM là ngắt xảy ra khi việc ghi EEPROM hoàn tất. Những gì bạn viết trong trình xử lý ngắt #INT_RDA có thể hiểu được, nhưng những gì bạn viết trong trình xử lý ngắt #INT_EEPROM thì khó hiểu.
Theo cách bạn viết, khi nhận được ký tự, và ký tự đó có giá trị 255 thì bạn sẽ thực hiện việc ghi vào EEPROM. Tuy nhiên, chương trình con mà bạn gọi ở trình xử lý ngắt #INT_RDA lại là trình xử lý ngắt #INT_EEPROM, điều này có thể gây ra rắc rối, vì chương trình xử lý ngắt sẽ trở về bằng lệnh RETI, còn chương trình con bình thường sẽ trở về bằng lệnh RETURN hay RETLW. Điểm thứ hai, ngắt #INT_EEPROM xảy ra khi việc ghi 1 ô nhớ EEPROM hoàn tất, khi đó, trong chương trình xử lý ngắt #INT_EEPROM của bạn, bạn lại yêu cầu ghi vào EEPROM nữa, vì khi động tác ghi này hoàn tất, nó sẽ sinh ra một ngắt #INT_EEPROM nữa. Trong khi đó, bạn vẫn chưa hoàn tất vòng lặp ghi một mảng giá trị vào EEPROM. Thực sự tôi cũng không hiểu chương trình này sẽ vận hành như thế nào, vì tôi không bao giờ viết code kiểu như vậy. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
![]() |
![]() |
![]() |
Ðiều Chỉnh | |
Xếp Bài | |
|
|