Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Help кодова брава
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=2311
Страница 1 от 1

Автор:  bigboy [ Чет Май 04, 2006 5:15 pm ]
Заглавие:  Help кодова брава

Здравейте!
Като цяло нещата горе-долу се получават, но имам един сериозен проблем свързан с eeprom-а.
Четенето от eeprom-а е перфектно, но когато подам командата от клавиатурата за смяна на кода записа в eeprom-а не се осъществява или (при друго оформяне на прогрмата) e частично записан или не в коректната последоватилност! Ако имате идеи ще е добре, че аз се изчерпах.

#include <16F84A.H>
#include <KEYPAD.C>
#fuses NOWDT, XT, PUT, NOPROTECT
#use delay(clock=4000000)
#bit Power = 0x05.1
#bit LED = 0x05.2
#rom 0x2100={'1','2','3','4'} //начален код
.........
.....
.........
void main(){

init_ports();
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
kbd_init();
Power=0;
LED=0;



KEY:
while(1){if(Power==0){if(kbd_getc()=='*'){Delay_ms(1500);
if(kbd_getc()=='*'){goto Write;}}}
if(kbd_getc()==read_eeprom(0)){count=0; enable_interrupts(INT_TIMER0);break;}} //проверка на първа цифра или смяна на кода
while(1){
if(kbd_getc()==read_eeprom(1)){break;}
if(count>46){disable_interrupts(INT_TIMER0); GOTO KEY;} } //проверка на втора цифра

while(1){
if(kbd_getc()==read_eeprom(2)){break;}
if(count>46){disable_interrupts(INT_TIMER0); GOTO KEY;} } //проверка на трета цифра

while(1){
if(kbd_getc()==read_eeprom(3)){IF(Power == 0){Power = 1; disable_interrupts(INT_TIMER0); GOTO KEY;} // проверка на четвърта цифра и промяна на състоянието на бравата.
IF(Power == 1){Power = 0; GOTO KEY;}}
if(count>46){disable_interrupts(INT_TIMER0); count=0; GOTO KEY;}}

Write:
i=0;LED=1;
while(1){
if(kbd_getc()=='1'){write_eeprom(i,'1');Delay_ms(500); i++;}
if(kbd_getc()=='2'){write_eeprom(i,'2');Delay_ms(500); i++;}
if(kbd_getc()=='3'){write_eeprom(i,'3');Delay_ms(500); i++;}
if(kbd_getc()=='4'){write_eeprom(i,'4');Delay_ms(500); i++;}
if(kbd_getc()=='5'){write_eeprom(i,'5');Delay_ms(500); i++;}
if(kbd_getc()=='6'){write_eeprom(i,'6');Delay_ms(500); i++;}
if(kbd_getc()=='7'){write_eeprom(i,'7');Delay_ms(500); i++;}
if(kbd_getc()=='8'){write_eeprom(i,'8');Delay_ms(500); i++;}
if(kbd_getc()=='9'){write_eeprom(i,'9');Delay_ms(500); i++;}
if(kbd_getc()=='0'){write_eeprom(i,'0');Delay_ms(500); i++;}
if(i==4){LED=0;GOTO KEY;}}

}

Автор:  Gogo [ Чет Май 04, 2006 11:51 pm ]
Заглавие: 

Като записваш еепрома, не е зле да забраниш прекъсването, освен ако не го забранява функцията "write_eeprom()". Гледам, че таймера работи и му е разрешено прекъсването...

Автор:  setoy [ Пет Май 05, 2006 12:34 pm ]
Заглавие: 

Това е CCS като гледам. Не се предоверявай на вградените му функции. Най-добре си напиши собствена функция за запис, да знаеш какво правиш поне. Ако не знаеш как, питай;)

Автор:  denis_hasan [ Пет Май 05, 2006 1:11 pm ]
Заглавие: 

enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);

размени има местата

Автор:  evc [ Пет Май 05, 2006 2:09 pm ]
Заглавие: 

denis_hasan написа:
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);

размени има местата


Това пък защо? :?:

Автор:  valioman [ Вто Май 09, 2006 1:45 pm ]
Заглавие: 

Пробвай това :

Write:
i=0;LED=1;
while(1){
switch(kbd_getc(100)){
case '1' : write_eeprom(i,'1');Delay_ms(5); i++; break;
case '2' : write_eeprom(i,'2');Delay_ms(5); i++; break;
case '3' : write_eeprom(i,'3');Delay_ms(5); i++; break;
case '4' : write_eeprom(i,'4');Delay_ms(5); i++; break;
case '5' : write_eeprom(i,'5');Delay_ms(5); i++; break;
case '6' : write_eeprom(i,'6');Delay_ms(5); i++; break;
case '7' : write_eeprom(i,'7');Delay_ms(5); i++; break;
case '8' : write_eeprom(i,'8');Delay_ms(5); i++; break;
case '9' : write_eeprom(i,'9');Delay_ms(5); i++; break;
case '0' : write_eeprom(i,'0');Delay_ms(5); i++; break;
}
if(i==4){LED=0;GOTO KEY;}}


При мен работи.
И не забравяй да махнеш #rom 0x2100={'1','2','3','4'} след направата на проекта щото при всяко пускане трябва да въведеш 1234 :)


Не се учудвай за (kbd_getc(100) това е моя функция с вкл.пищялка на pin_b0 защото оригиналната не работи добре :)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/