|
Светофор в "Си"для контроллера с SIG_INTERRUPT0 |
|
|
|
Feb 1 2009, 18:04
|
Участник

Группа: Новичок
Сообщений: 18
Регистрация: 31-01-09
Пользователь №: 44 210

|
Цитата(SysRq @ Feb 1 2009, 20:52)  Я углядел что на картинке m48 и выше, а m8 не заметил, и написал здоровенный пост, но потом заметил и m8, и написанное стер  Определитесь какой у вас там МК, ибо разница есть, я как раз ее и описал. Или вы без железа проверяете?.. PS: cntr тоже надо сделать глобальной. Если я вас понял правильно то MK это микроконтроллер, в описании стоит Prozessor ATmega8На всякий случай выложу полное описание запчастей : # 1 Prozessor ATmega8 # 1 RS232Treiber # 1 Bustreiber 74HC 125N # 1 Drosselspule 10 µH # 1 Gleichrichter # 5 Diode 100mA # 1 Diode 1A # 1 gelbe LED 2mA # 2 grьne LED 2mA # 1 rote LED 2mA # 4 Kondensator 1µF # 4 Kondensator 100nF # 1 Kondensator 220µF # 2 Kondensator 33pF # 1 Kondensator 47µF # 4 Widerstand 1,2 kOhm # 2 Widerstand 10,5 kOhm # 2 Potentiometer # 2 Miniaturtaster # 1 IC-Sockel # 1 Buchse 9-polig SUBD # 1 Buchse 25-polig SUBD # 2,25 Sockelleiste SPL20, einreihig # 1 Piezoschallwandler # 1 Printstecker # 1 Standardquarz # 1 20polig einreihig, abgewinkelt # 1 Stiftleiste # 2 PSK-Kontakt # 1 Kupplungs-Leergehдuse Страница производителя Прошу прощения за мою безграмотность. cntr уже посадил как глобальную.
Сообщение отредактировал konstatinopol - Feb 1 2009, 18:06
|
|
|
|
|
Feb 1 2009, 22:15
|
Участник

Группа: Новичок
Сообщений: 18
Регистрация: 31-01-09
Пользователь №: 44 210

|
Цитата(aesok @ Feb 2 2009, 01:11)  У Вас прерывание настроенно по обеим фронтам MCUCR = 1; => ISC01:ISC00 = 01 => Any logical change on INT1 generates an interrupt request.
Нужно скорее всего по одному.
Анатолий. Значит ли это что MCUCR я должен прировнять к 2 ?? Или я ошибаюсь. Я просто запись => ISC01:ISC00 = 01 => неочень понял
|
|
|
|
|
Feb 1 2009, 22:34
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(konstatinopol @ Feb 2 2009, 01:15)  Значит ли это что MCUCR я должен прировнять к 2 ?? Или 2 или 3 в зависимость от того переходом PC1 из 1->0 или 0->1 Вы хотите запускать второй сфетофор. Цитата(konstatinopol @ Feb 2 2009, 01:15)  Я просто запись => ISC01:ISC00 = 01 => неочень понял Таблица 31 в даташите на ATmega8. Биты ISC01 и ISC00 регистра MCUCR задают условия срабатывания прерывания. Можно написать ISC01, = 0 ISC00 = 1 а можно объединить эти 2 бита записав ISC01:ISC00 = 10. Анатолий
Сообщение отредактировал aesok - Feb 1 2009, 22:35
|
|
|
|
|
Feb 1 2009, 23:10
|
Участник

Группа: Новичок
Сообщений: 18
Регистрация: 31-01-09
Пользователь №: 44 210

|
Цитата(aesok @ Feb 2 2009, 01:34)  Биты ISC01 и ISC00 регистра MCUCR задают условия срабатывания прерывания. Можно написать ISC01, = 0 ISC00 = 1 а можно объединить эти 2 бита записав ISC01:ISC00 = 10. Напишу как понял. Это значит что в одной программе(на одном борту) должно быть MCUCR=2, а на другом MCUCR=3. Или мне туда ещё ISC01:ISC00 = 10 вписать нужно?? Программу надо представить уже завтра а я смотрю на неё и немогу понять что в ней надо подправить чтобы она работала.
Причина редактирования: Уменьшение размера цитируемого сообщения.
|
|
|
|
|
Feb 1 2009, 23:27
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(konstatinopol @ Feb 2 2009, 03:10)  Или мне туда ещё ISC01:ISC00 = 10 вписать нужно?? Надо так: Код MCUCR = (1 << ISC01); Если бы Вы написали что-нить в таком стиле (с симв. именами) изначально, то этот косяк ужЕ вчера бы кому-то на глаза попался.
|
|
|
|
|
Feb 2 2009, 13:09
|
Участник

Группа: Новичок
Сообщений: 18
Регистрация: 31-01-09
Пользователь №: 44 210

|
Господа благодарю всех за содействие программа работает без ошибок. Проблемма была в том месте где мы закрывали PORTC. Я просто поменял место где его закрываю. Вот так выглядит готовая программа светофора. CODE #include <stdint.h> #include <avr/io.h> #include <avr/wdt.h> #include <avr/signal.h> #include <avr/interrupt.h>
short cntr = 0; int a=0;
void lampochki() { if(PORTB==1) { PORTB=3; } else if(PORTB==3){ PORTB=4; }else if(PORTB==4) { PORTB=2; }else if(PORTB==2) { PORTB=1; a=1; PORTC = 1; } }
int main() { DDRB=7; DDRD=0; PORTD=4; PORTB=1; DDRC = 7; PORTC=0; TCNT0 = 244; cntr = 28; TCCR0 = 5; TIMSK = 1; GICR = 64; MCUCR = 3; sei();
while(1){} }
SIGNAL(SIG_OVERFLOW0){ if(!(cntr--)) { TCNT0=244; cntr=28; if(a==0) lampochki(); } PORTC = 0; }
SIGNAL(SIG_INTERRUPT0){ a=0; } И если борты разсоединить то они оба останавливаются на крассной лампочке.
Сообщение отредактировал rezident - Feb 2 2009, 17:54
Причина редактирования: Тег code заменен на codebox. Весьма объемный исходник.
|
|
|
|
|
Feb 2 2009, 17:28
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Код #include <stdint.h> #include <avr/io.h> #include <avr/wdt.h> #include <avr/signal.h> #include <avr/interrupt.h>
short cntr = 0; int a=0; Ах..... не умеете Вы учиться на чужих ошибках. Будете учиться на своих, по крайней мере как делать правильно Вам расказали. Анатолий.
|
|
|
|
|
Feb 2 2009, 18:24
|
Участник

Группа: Новичок
Сообщений: 18
Регистрация: 31-01-09
Пользователь №: 44 210

|
Цитата(aesok @ Feb 2 2009, 21:28)  Ах..... не умеете Вы учиться на чужих ошибках. Будете учиться на своих, по крайней мере как делать правильно Вам расказали. На своих всегда интерестнее ... Всёравно спасибо, для меня щас главное что всё работает!!!!
Причина редактирования: Уменьшение размера цитаты. Цитируя всего два предложения убирайте из цитаты ненужный исходник!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|