Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

вообще бред собачий какой-то

Отправлено soon 21 августа 2007 г. 17:41
В ответ на: Вопрос знатокам AVR(atmega8). Что на самом деле запрос на прерывание, возникшее при запрешенных прерываниях, забывается???(+) отправлено <font color=gray>soon</font> 21 августа 2007 г. 15:00

вот кусочек кода, вернее одна строчка, из-за которой куда-то деваются прерывания. проверил на двух компиляторах.....
стоит ее убрать, прерывания идут нормально. что за Х?


DDRD_Bit3 = 1; // pin tx 0
delay_us(720);//480..960 need
DDRD_Bit3 = 0; // pin 3 state <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
delay_us(60); // wait 60 us(max)

вот вся прога, если что-нибуть тут понятно
фигня в функции 1WReset()

#include
#include
#include
#include
#include "init.h"


#define R1w PIND
#define P1w PORTD
#define D1w DDRD
#define B1w 3
#define LOW1w 0
#define HIGH1w 1


//#define __EEGET(var, addr);
//#define __EEPUT(addr, val);


#define DIGIT_NUM 6
char DisplayBuf[DIGIT_NUM];

void Display(void){
char i, j, mask;

for(j=0;j mask=128;
for(i=0;i<8;i++){
if(SevenSegm[DisplayBuf[j]] & mask)
DOUT=1;
else
DOUT=0;
mask >>= 1;
SCLK=1;
SCLK=0;
}
}
LATCH=1;
LATCH=0;
}

#pragma vector=TIMER2_OVF_vect
__interrupt void clock_int_tmr2(void)
{
static char b;

if(++b & 1) LED=0; else LED=1;
}

#if 0
void _1WWrite(char cmd){
char b, mask;

mask = 1;
for(b=0; b<8; b++){
if(cmd & mask){
// 1 time slot tx
//#asm("cli");
DDRD_Bit3 = 1; // pin tx 0
//////delay_us(10);
DDRD_Bit3 = 0; // pin 3 state
//////delay_us(50+10);
//#asm("sei");
}else{
// 0 time slot tx
//#asm("cli");
DDRD_Bit3 = 1; // pin tx 0
//////delay_us(60+10);
DDRD_Bit3 = 0; // pin 3 state
//#asm("sei");
}
mask <<= 1;
////delay_us(1); // min 1 uS
}
}

char _1WRead(void){
char b;
char d = 0;

for(b=0; b<8; b++){
BOOL rb;

//get bit
//#asm("cli");
DDRD_Bit3 = 1; // pin tx 0
////delay_us(6);
DDRD_Bit3 = 0; // pin 3 state
////delay_us(8);
// rb = R1w.B1w;
rb = PIND_Bit3;
//#asm("sei");
////delay_us(60+10-6-8);

d>>=1;
if(rb) d |= 0x80;
////delay_us(1); // min 1 uS
}
return d;
}
#endif


BOOL _1WReset(void){
BOOL exist;
//#asm("cli"); // time critical

// P1w.B1w = LOW1w; // to lo
PORTD_Bit3 = 0; // to lo

// D1w.B1w = 1; // pin tx 0
DDRD_Bit3 = 1; // pin tx 0
DDRD_Bit3 = 0; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
////delay_us(720);//480..960 need

/*

DDRD_Bit3 = 0; // pin 3 state
////delay_us(60); // wait 60 us(max)

if(PIND_Bit3 == LOW1w) exist = TRUE; else exist = FALSE;
//#asm("sei"); // no time critical
////delay_us(480-60+10); // min 480 - 60 after reset 1 and 10 just in case
if(PIND_Bit3 != HIGH1w) exist = FALSE;
*/
return TRUE;
}

void main(void){
//char _1w_devices_num = 0;

//#asm("cli");
__disable_interrupt();

DDRB=0x06;
DDRC=(1< DDRD=0x60;
PORTB=0;PORTC=0;PORTD=0; //?

LED = 1;

// GICR = 0x40; // External Interrupt Request 0 Enable
GICR = 0x0; // External Interrupt Request 0 Enable
GIFR = -1;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// MCUCR=0x82; // sleep enable

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 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: TOSC1 pin
// Clock value: PCK2/32
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x08;
TCCR2=0x03;
TCNT2=0x00;
OCR2=0x00;


// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x45;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

//#asm("sei");
__enable_interrupt();

for(;;)
{
// while(!PINB.0);
// while(PINB.0);

//get temperature module
unsigned char buf[9];
BOOL ds18s20ok = TRUE;

if(_1WReset()){
char i;

// _1WWrite(0xCC);
// _1WWrite(0x44);

for(i=0; i<200; i++){
////delay_ms(1);
}
for(i=0; i<200; i++){
////delay_ms(1);
}
for(i=0; i<200; i++){
////delay_ms(1);
}
if(_1WReset()){
char j;
char crc = 0;

// _1WWrite(0xCC);
// _1WWrite(0xBE);
for(j=0; j<9; j++){
// buf[j] = _1WRead();
crc = crc8table[crc ^ buf[j]];
}
if(crc!=0)
ds18s20ok = FALSE;
}else
ds18s20ok = FALSE;
}else
ds18s20ok = FALSE;

//if(ds18s20ok)
{
if(buf[1]){
DisplayBuf[5]=SSI_MINUS;
buf[0] = 0-buf[0];
}else{
DisplayBuf[5]=SSI_OFF_SEGMENTS;
}
DisplayBuf[4]=(buf[0]>>1)/10;
DisplayBuf[3]=(buf[0]>>1) - (DisplayBuf[4] * 10);
DisplayBuf[2]=(buf[0] & 1) ? 5 : 0;
DisplayBuf[1]=SSI_GRAD;
DisplayBuf[0]=SSI_C;

Display();
}

}
}



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
сложите три и три:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru