Перейти к содержанию
    

anking

Участник
  • Постов

    56
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о anking

  • Звание
    Участник
    Участник
  1. если ставлю частоту например 1 герц то лампочка моргает, и показания DC вольтметра меняются, но вот 60 герц... и полные нули...
  2. Может я гдето туплю. подскажите почему лампочка не горит в вот такой вот схеме...
  3. а как определить напряжение? я думал 105 это температура
  4. гуглил но не нашел ни даташит ни вменяемые характеристики для этого кондера. 105 c624 что за конденсатор? припаян на плате питания монитора, их там два, зеленые приблизительно два см в высоту и 1 в диаметре. на сколько вольт, сколько фарад? простите если слишком тупой вопрос просто не знаю где еще спросить
  5. Значит для управления двигателем переменного тока мне не подойдет шим, правильно я вас понял? Где можно найти простеньких примеров для генерации переменного тока с цап?
  6. гуглил но ничего конкретного не нашел. Все очень сложно и запутанно. Мне бы полегче чтонить. Я подключил тот вывод что у меня есть к осфилографу но треугольный график(возрастание-убывание) не получил... стоит ровненький "заборор"... я так понимаю из-за того что он видит только вкл-выкл. но как заставить построить линию?
  7. использовал функцию _delay_us() и все заработало. Только такой вопрос, при вызове этой функции обработка приложения разве не прекращается? пока контроллер спит, выполняются ли прерывания? что конкретно "спит" во время выполнения этой функции? И второй вопрос... как сгенерировать синусоидальный сигнал? при помощи двух последовательных таймеров?
  8. режим шим

    Пользую atmega 48. Включаю шим на таймере 0 Но светодиод горит постоянно и не геснет. в чем вилы? #define F_CPU 7372800 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> void init_pwm (void) { TCCR0A=(1<<COM0A1)|(1<<WGM00); TCCR0B=(1<<CS00); OCR0A=0x00; } void pause (unsigned int a) { unsigned int i; for (i=a;i>0;i--); } int main (void) { unsigned char i; DDRD=0b01000000; init_pwm(); while (1) { for (i=0;i<255;i++) { OCR0A++; pause(1000); } for (i=0;i<255;i++) { OCR0A--; pause(1000); } } }
  9. 12v DC. А как тогда отключать транзистор при сигнале с другово места?
  10. Классное реле.... только в продаже не найти... пробовал искать remote switch relay на ebay но там только готовые решения с пультами. Никаких отдельных реле не продается... есть какой-нибудь аналог или вообще какнибудь проблему можно обойти по-другому? Нашел вот этот... но почемуто в продаже только модификации с одной обмоткой...мне бы с двумя и с двумя фиксированными состояниями.
  11. Необходимо реализовать подачу напряжения в замкнутом контуре по сигналу на проводе 1 с устройства, и отключение по сигналу на проводе 2. Притом когда сигнал на проводе 1 пропадает, напряжение должно сохранаяться в контуре до появления сигнала на проводе 2. Есть ли какое реле которое имеет 2 обмотки и может работать как переключатель в данном случае?
  12. Спасибо что разъяснили, хотя над сдвигом еще придется голову поломать Набросал себе такой хидер для удобства, точнее украл с avrfreaks #define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT)) #define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT)) #define FLIPBIT(ADDRESS,BIT) (ADDRESS ^= (1<<BIT)) #define GETBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT)) #define BITWRITE(c,p,m) (c ? SETBIT(p,m) : CLEARBIT(p,m)) на первое время я думаю покатит, все же лучше чем сдвиги самому продумывать А вот кольцевой буфер идею которого я нашел где-то в гугле Правда работать не хочет... и несколько отличается от того, что мне писали здесь, вместо указателейц используется побитовая маска, идею которой я, дурак, так и не понял В статье писали что лучше всего использовать такой буфер в размерности 256, при этом битовую маску задавать одним байтом... может кто пояснит, спасибо. #define RXBUF_SIZE 16 //размер буфера обязательно равен степени двойки! #define RXBUF_MASK (RXBUF_SIZE-1) #define BLOCK_TIMEOUT 10 #define BYTE_TIMEOUT 10 #define BLOCK_SIZE 8 unsigned char rxbuf[RXBUF_SIZE]; unsigned char inrx, outrx; unsigned char rxtimeout = 0; unsigned char idxDiff(unsigned char idxIN, unsigned char idxOUT, unsigned char bufsize) { if (idxIN >= idxOUT){ return (idxIN - idxOUT); FLIPBIT(PORTB,0); } else{ return ((bufsize - idxOUT) + idxIN); FLIPBIT(PORTB,1); } } //программка отслеживает прием и его таймауты, и в зависимости от приема // сбрасывает буфер либо переключает режим работы. Подпрограмма должна // вызываться в бесконечном цикле main. void usartPool (void) { char value; unsigned char rxcnt = idxDiff (inrx, outrx, RXBUF_SIZE); if (0 == rxcnt) { //в буфере ничего нет if (rxtimeout >= BLOCK_TIMEOUT) { //в буфере ничего нет давно //... } } else if (rxcnt < BLOCK_SIZE) { //в буфере что-то есть, но мало if (rxtimeout >= BYTE_TIMEOUT) { //прошла слишком большая пауза между байтами, // сбрасываем буфер приема outrx = inrx; } } else { //в буфере корректно приняты BLOCK_SIZE байт, // обрабатываем данные //... do{ value = rxbuf[outrx++]; while ( !( UCSR0A & (1<<UDRE0)) ) UDR0 = value; outrx &= RXBUF_MASK; } while(inrx!=outrx); } } int main (void) { USART_Init(BAUD_PRESCALE); sei(); for(;;) // Loop forever { usartPool(); } } ISR(USART_RX_vect) { char ReceivedByte; ReceivedByte = UDR0; // Fetch the recieved byte value into the variable "ByteReceived" //while ( !( UCSR0A & (1<<UDRE0)) ) UDR0 = ReceivedByte; // Echo back the received byte back to the computer rxbuf[inrx++] = ReceivedByte; inrx &= RXBUF_MASK; rxtimeout = 0; FLIPBIT(PORTB,0); }
  13. Вам это может показаться элементарным но все же _delay_ms(100); PORTB|=(1<<0); PORTB|=(0<<1); PORTB|=(1<<2); _delay_ms(100); PORTB&=(0<<0); PORTB&=(1<<1); PORTB&=(0<<2); Средний светодиод при таком раскладе не моргает? почему? в первом случае использую или но если использую или и во втором то не моргают все? так в чем разница между и и или при обращении к регистрам? что за символ такой "<<"и чем он отличается от ">>" и где их применять? прочитал про побитовые операции но там нигде нет очевидных примеров про регистра и все на асме PS отличный пример про кольцевой массив... буду пробовать заюзать
  14. Разобрался почему не работало... Было включено прерывание (1<<UDRIE0) о пустом буфере. Следовательно вопрос прерывание работает всегда даже если у меня нет для него функции? И как можно отменить отдельное прерывание далее по программе? (UCSR0B&=~(_BV(UDRIE0)); - вот это что-то не работает) как можно обратиться к отдельному биту в регистре не похерив все остальные? И так что там по поводу кольцевого буфера, может подкинет кто примерчик пожалста
  15. А можно примерчик кольцевого буфера для usart на avr студии? попробовал для простоты переписать прогу так, начал с совсем простого, но прерывание не работает #include <avr/io.h> #include <avr/interrupt.h> #define USART_BAUDRATE 9600 #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) void USART_Init( unsigned int baud ) { // Set baud rate UBRR0H = (unsigned char)(baud>>8); UBRR0L = (unsigned char)baud; // Enable receiver and transmitter & interrupts UCSR0B = (1<<RXCIE0)|(1<<UDRIE0)|(1<<RXEN0)|(1<<TXEN0); // Set frame format: 8data, 1stop bit UCSR0C = (0<<USBS0)|(3<<UCSZ00); } int main (void) { USART_Init(BAUD_PRESCALE); sei(); for(;;) // Loop forever { /* while ((UCSR0A & (1 << RXC0)) == 0) {}; // Do nothing until data have been recieved and is ready to be read from UDR ReceivedByte = UDR0; // Fetch the recieved byte value into the variable "ByteReceived" while ((UCSR0A & (1 << UDRE0)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it UDR0 = ReceivedByte; // Echo back the received byte back to the computer*/ } } ISR(USART_RX_vect) { char ReceivedByte; ReceivedByte = UDR0; // Fetch the recieved byte value into the variable "ByteReceived" UDR0 = ReceivedByte; // Echo back the received byte back to the computer } Забыл написть - Мега48 на плате STK48 добавил в бесконечный цикл мигание диодом если закомментироваль глобальное разрешение прерываний - мигает, если нет то нет
×
×
  • Создать...