Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: жутко глючит мк
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Страницы: 1, 2, 3
domowoj
А рекомедации побоку да?
AVR182: Zero Cross Detector
Ищи в гугле, там все подробно разжевано
в картинках.
_Ivan_33
я фигово знаю технический английский
но там было написано что подключать просто через 1 мегоом?
_Ivan_33
охохохохохох не получается у меня управлять лампочкой накаливания ...
цепь управления нога мк 220 ом оптопара moс3021 симистор BT138
придется переходить к менее силовому проекту ...

хотя блин никто из вас разработчиков электроники не делал такого чуда??? что никто не может мне помочь???
domowoj
Цитата(_Ivan_33 @ May 26 2008, 03:05) *
охохохохохох не получается у меня управлять лампочкой накаливания ...
цепь управления нога мк 220 ом оптопара moс3021 симистор BT138
придется переходить к менее силовому проекту ...

хотя блин никто из вас разработчиков электроники не делал такого чуда??? что никто не может мне помочь???

Приведенный тобой выше код должен заставить мигать светодиод(соответственно включенный)
этим самым ты научишься ловить переход через 0.
Затем нужно научиться (или научить) синхронизировать таймер с сетью. те в момент перехода
сбрасывать его. Период полного счета его должен быть близок к 10мсек(100Гц).
Потом освоить работу компараторов таймера.
Без осциллографа вслепую это сделать очень трудно!
Ты просто не увидишь результатов работы своей программы.

Вышеуказанная прогр. работает???
_Ivan_33
на лампочке не получается - на светиодиоде не проверял....
XVR
Цитата(_Ivan_33 @ May 25 2008, 19:24) *
вот пишу опять сюда... ничего не получается... тот же самый случай

опять ничто не получается... я уже просто не знаю что делать ...
Исправлять программу 1111493779.gif



Код
#include <tiny2313.h>
#include <delay.h>
int a=0;
void main(void) {
#asm("sei");
DDRB=2;
GIMSK|=(1<<5);
PCMSK|=(1<<7);
while(1) {
  if (a==200) // <<< Сюда попадаем, если a == 200

   {a=0;        // <<< Сбрасываем а в 0
    PORTB=2; // <<< Взводим бит в порте, таким он и остается (навсегда)
    if(a==200)  // <<< Сюда никогда не попадаем, так как 2мя строками выше мы обнулили а

     {a=0;
      PORTB=0;

     };

   };

};

}


interrupt [PCINT] void pin_change_isr0(void) {
a++;

}
_Ivan_33
там будет volative int a;
и почему туда мы не попадем ведь будет а++ много раз

#include <tiny2313.h>
#include <delay.h>
volatile int a=0;
void main(void) {
#asm("sei");
DDRB=2;
GIMSK|=(1<<5);
PCMSK|=(1<<7);
while(1) {
if (a==200) // <<< Ñþäà ïîïàäàåì, åñëè a == 200

{a=0; // <<< Ñáðàñûâàåì à â 0
PORTB=2;}; // <<< Âçâîäèì áèò â ïîðòå, òàêèì îí è îñòàåòñÿ (íàâñåãäà)
if(a==200) // <<< Ñþäà íèêîãäà íå ïîïàäàåì, òàê êàê 2ìÿ ñòðîêàìè âûøå ìû îáíóëèëè à

{a=0;
PORTB=0;

};};

}


interrupt [PCINT] void pin_change_isr0(void) {
a++;

} так?

#include <tiny2313.h>
#include <delay.h>
void main(void) {
DDRB.5=1;
DDRB.4=1;
PORTB.4=1;
PORTB.5=1;}


и в этом на 4 выводе 1 вольт на 5 выводе 1,25 вольт ... питание может плохое???
vet
Насчет volatile не беспокойтесь - в CVAVR все переменные volatile по умолчанию.
А вот от объявления переменной, как int - лучше откажитесь в пользу char. AVR - 8-битный м/к, поэтому атомарный доступ к многобайтным переменным нужно обеспечивать вручную. В вашем случае дальше 200 считать не нужно, так что хватит и char.

Касательно программы - в нынешнем виде прерывание вполне может изменить "a" дважды подряд - со 199 на 201 - и программа этого не заметит. Пишите по крайней мере >= вместо == , а лучше проверяйте переполнение счётчика прямо в прерывании.
_Ivan_33
на всех ногах по 1 или 1,25 вольт
...
XVR
Цитата(_Ivan_33 @ May 26 2008, 15:41) *
там будет volative int a;
и почему туда мы не попадем ведь будет а++ много раз


Потому что первый if сбросит переменную в 0, и то, что она успеет досчитаться до 200 до второго if невероятно.
_Ivan_33
почему она не сможет досчитать???
XVR
Цитата(_Ivan_33 @ May 26 2008, 20:26) *
почему она не сможет досчитать???
На программу свою посмотри:

Код
  

if (a==200) a=0;

if (a==200) ...
Как может a во втором if'е быть равна 200, если ее сбросят в 0 в первом if'е? Или - чему должна быть равна a при входе в цикл, что бы сработал второй if?
_Ivan_33
у меня существенный прогресс!!!
я заставил лампочку гореть!!!
Цитата
#include <tiny2313.h>
#include "delay.h"
volatile int a=0;
interrupt [PCINT] void pin_change_isr0(void)
{PORTB.1=0;
TIMSK=0x01;
TCNT0=0x00;
if(a==3) {PORTB.1=1;
OCR0A=0xFF;};
}

// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
PORTB.1=1;// Place your code here
TIMSK=0x00;}

// Declare your global variables here

void main(void)
{
// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// 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=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=0
PORTB=0x01;
DDRB=0x1E;

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// 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: 15,625 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x03;
TCNT0=0x00;
OCR0B=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;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: On
GIMSK=0x20;
MCUCR=0x00;
PCMSK=0x20;

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

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

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

// Global enable interrupts
#asm("sei")

while (1)
{
if(PINB==0x00) {
delay_ms(50);
if(PINB==0x00) {a++;};};
switch(a) {
case 0 : OCR0A=27; break;
case 1 : OCR0A=4E; break;
case 2 : OCR0A=75; break;
case 3 : OCR0A=0xFF; break;
case 4 : a=0; };
};}

но чета на кнопку она не реагирует - она изменяет мощность горения лампочки ...
и программа поработает секунд десять и выключится ...


дальше ... как мне реализовать следущую фигню:
у меня будет мигать 4 лампочками ... будет n программ мигания и 8 скоростей мигания лампочкой ...
и 4 вида мощности горения лампочки то есть будет 3 кнопки ... как мне с помощью них управлять этими параметрами ???
заранее благодарен!!!
_Ivan_33
имеет ли смысл такая запись что в прерывании объявляется от какого значение отталкивается функция??
то есть идет прерывание а в ним типо написано functionn(2);
и после обработчика идет сама функция????
Dog Pawlowa
Цитата(_Ivan_33 @ Jun 2 2008, 21:35) *
имеет ли смысл такая запись что в прерывании объявляется от какого значение отталкивается функция??
то есть идет прерывание а в ним типо написано functionn(2);
и после обработчика идет сама функция????

Если стека достаточно, то не проблем никаких. Если мало - можно определить функцию как inline.
_Ivan_33
а у меня так много будет раз - как стек очищать??? и что за inline???
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.