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

Atmega16 Bascom-Avr Работает С Перебоями


virus-error

Рекомендуемые сообщения

здраствуйте господа , вот набросал в bascom-avr часики но они работают с перебоями , в начале он запускается все хорошо , а потом сбрасывается и все по новой , сброс происходит в разное время , еще проблема не считывает данные с ds1307 а если и считало то отоброжает 5часов 55 минут , секунды не знаю не выводил, думал проблема с кварцам он на 10МГц установил от внутреннего на 1 МГц внес изменения в программу поставил фьюзы то же самое , питание не просидает , остается касяк в коде , где не пойму , подскажите

$regfile = "m16def.dat"

$crystal = 10000000

Dim A As Byte

Dim B As Byte

Dim C As Byte

Dim D As Byte

Dim E As Byte

Dim F As Byte

Dim G As Byte

Dim H As Byte

Dim Ma As Byte

Dim Mb As Byte

Dim Mc As Byte

Dim Md As Byte

Dim Me As Byte

Dim Mf As Byte

Dim Mg As Byte

Dim Mh As Byte

Dim X As Byte

Dim Y As Integer

Dim Z As Byte

Config Porta = Output

Config Portd = Output

Config Portc.2 = Input

Config Portc.3 = Input

Config Sda = Portc.1

Config Scl = Portc.0

A = &B11111110

B = &B11111101

C = &B11111011

D = &B11110111

E = &B11101111

F = &B11011111

G = &B10111111

H = &B01111111

X = 8

Gosub Led

Portd = A

Waitms 500

Portd = B

Waitms 500

Portd = C

Waitms 500

Portd = D

Waitms 500

Portd = E

Waitms 500

Portd = F

Waitms 500

Portd = G

Waitms 500

Portd = H

Waitms 500

Portd = &B00000000

Porta = &B00000000

Do

Gosub Ds1307

Gosub Led2

Loop

Led:

Select Case X

Case 0 : Porta = &B00111111

Case 1 : Porta = &B00000110

Case 2 : Porta = &B01011011

Case 3 : Porta = &B01001111

Case 4 : Porta = &B01100110

Case 5 : Porta = &B01101101

Case 6 : Porta = &B01111101

Case 7 : Porta = &B00000111

Case 8 : Porta = &B01111111

Case 9 : Porta = &B01101111

End Select

Waitms 5

Return

Led2:

Portd = A

X = Ma

Gosub Led

Portd = B

X = Mb

Gosub Led

Portd = C

X = Mc

Gosub Led

Portd = D

X = Md

Gosub Led

Portd = E

X = Me

Gosub Led

Portd = F

X = Mf

Gosub Led

Portd = G

X = Mg

Gosub Led

Portd = H

X = Mg

Gosub Led

Return

Ds1307:

Dim Seco As Byte

Dim Mine As Byte

Dim Hour As Byte

Dim Day As Byte

Dim Dat As Byte

Dim Month As Byte

Dim Year As Byte

I2cstart

I2cwbyte &HD0

I2cwbyte &H00

I2cstart

I2cwbyte &HD1

I2crbyte Seco , Ask

I2crbyte Mine , Ask

I2crbyte Hour , Ask

I2crbyte Day , Ask

I2crbyte Dat , Ask

I2crbyte Month , Ask

I2crbyte Year , Nack

I2cstop

Seco = Makedec(seco)

Mine = Makedec(mine)

Hour = Makedec(hour)

Day = Makedec(day)

Dat = Makedec(dat)

Month = Makedec(month)

Year = Makedec(year)

If Seco = 80 Then

Seco = 10

Seco = Makebcd(seco)

I2cstart

I2cwbyte &HD0

I2cwbyte 0

I2cwbyte Seco

I2cstop

End If

If Hour > 9 Then

Y = Hour / 10

Mc = Abs(y)

Md = Hour Mod 10

Else

Mc = &B00000000

Md = Hour

End If

If Mine > 9 Then

Y = Mine / 10

Me = Abs(y)

Mf = Mine Mod 10

Else

Me = 0

Mf = Mine

End If

Ma = &B00000000

Mb = &B00000000

Mg = &B00000000

Mh = &B00000000

If Pinc.2 = 0 Then

Incr Mine 'увеличить менуты на еденицу

Mine = Makebcd(mine) 'конвертировать из десетичного в двоично-десетичный форма

I2cstart 'запускаем I2c линию связи

I2cwbyte &HD0 'обращаемся к микросхеме DS1307

I2cwbyte 1 'отпровляем в микросхему DS1307 в минуты

I2cwbyte Mine 'отпровляем увеличиную еденицу в минутах и переконвертированную в двоично-десетичном формате в микросхему DS1307

I2cstop 'останавливаем передачу данных и освобождаем I2C

Waitms 100 'задержка 100мили секунд

End If 'конец условия

If Pinc.3 = 0 Then

Incr Hour

Hour = Makebcd(hour)

I2cstart

I2cwbyte &HD0

I2cwbyte 2

I2cwbyte Hour

I2cstop

Waitms 100

End If

Return

End

код еще не даписан он сырой

к порту d я подключил общий провод (катод) симисегментного индикатора

к порту a сами цифры

в начале программа по очереди проверяет индикацию затем считывает температуру и выводит на индикаторы (так плонировалось)

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

совет: сперва нарисуйте алгоритм

а потом сравнитеего с тем, что вы написали

неплохо бы положить схему и фото того, что собрали

' =============================================================================
Getdatetime:
  'Print "Запуск часов DS1307"
  ' ''---- Запуск часов DS1307 --- Для перестраховки, вдруг батарейку меняли и часы не работают...
  I2cstart : I2cwbyte Ds1307w : I2cwbyte 0
  I2cstart : I2cwbyte Ds1307r : I2crbyte Seco , Nack : I2cstop
  Seco = Seco And &B_0111_1111				   ' Сброс Бита7  = Запуск тактового генератора часов
  Waitms 10									  ' обязательно для DS1307 !!!
  I2cstart : I2cwbyte Ds1307w
  I2cwbyte 0									 ' Адрес начала записи
  I2cwbyte Seco								  ' запуск часов, если меняли батарейку
  I2cstop
  '   Mine = 29
  '   Hour = 14
  '   Dat = 5
  '   Month = 11
  '   Year = 14
  'Gosub Save_time												  ' Сохраним дату и время

  'I2cstart										  ' Generate start code
  'I2cwbyte Ds1307w								  ' send address
  'I2cwbyte 0									    ' start address in 1307
  'I2cstart										  ' Generate start code
  'I2cwbyte Ds1307r								  ' send address
  'I2crbyte _sec , Ack
  'I2crbyte _min , Ack							   ' MINUTES
  'I2crbyte _hour , Ack							  ' Hours
  'I2crbyte Weekday , Ack						    ' Day of Week
  'I2crbyte _day , Ack							   ' Day of Month
  'I2crbyte _month , Ack							 ' Month of Year
  'I2crbyte _year , Nack							 ' Year
  'I2cstop
  ' _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  ' _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

' =============================================================================
Read_time:									    ' ---  узнаем время и дату  ---
  'Print "Read TIME"
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cstart
  I2cwbyte Ds1307r
  I2crbyte Seco , Ack
  I2crbyte Mine , Ack
  I2crbyte Hour , Ack
  I2crbyte Weekday , Ack
  I2crbyte Dat , Ack
  I2crbyte Month , Ack
  I2crbyte Year , Nack
  I2cstop
  Seco = Makedec(seco)
  Mine = Makedec(mine)
  Hour = Makedec(hour)
  Dat = Makedec(dat)
  Month = Makedec(month)
  Year = Makedec(year)
  'Print Hour ; ":" ; Mine ; ":" ; Seco ; "    "
  'Print "20" ; Year ; "-" ; Month ; "-" ; Dat
Return

' =============================================================================
Save_time:									    ' Сохраним дату и время
  Mine = Makebcd(mine)						   ' всё преобразуем в 2/10 код
  Hour = Makebcd(hour)
  Dat = Makebcd(dat)
  Month = Makebcd(month)
  Year = Makebcd(year)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0									 ' Стартовый байт начала записи
  I2cwbyte 255								   ' запуск часов, если меняли батарейку
  Waitms 10
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0									 ' Стартовый байт начала записи
  I2cwbyte 1									 ' Секунды всегда =0  - чтобы сбросить флаги и запустить питание от батарейки
  I2cwbyte Mine
  I2cwbyte Hour
  I2cwbyte 0
  I2cstop
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 4									 ' Стартовый байт начала записи
  I2cwbyte Dat
  I2cwbyte Month
  I2cwbyte Year
  I2cstop
Return

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Нет, кроме того что перечислял выше больше ничего менять не надо. 
    • @nekrylov Кулер на малых оборотах по центру радиатора решит все проблемы, при толщине основания 10 мм такое расположение выходников ничем плохим не грозит, при условии обдува. Радиатор выше 50-60 градусов вряд-ли нагреется когда-нибудь, его температура, скорее всего, будет от силы градусов на 10-15 выше температуры окружающего воздуха... Но схемка термоконтроля все же не повредит, на всякий пожарный.
    • двухтактный полумостовой импульсный преобразователь.   Качество монтажа ужасное, половина элементов, как этот конденсатор. Про сами детали сказать ничего не могу.   Пиковый ток из розетки? У меня есть осциллограф, если нужно могу провести замеры.    
    • Попробуйте скачать ГОСТ 16745-83 про конденсаторную бумагу. Там понятные слова, русские... :-)
    • Так ладно в общем нужно до конца разобраться с UART. Сейчас я выкладываю весь код и всю информацию что у меня есть. Сначала поясню что по схеме. Микроконтроллер у меня ATMEGA16. На PD2 и PD3 установлены светодиоды, На PC0 и PC1 установлены кнопки. Также установлен внешний кварц на частоту 7.3728 MHz. Теперь собственно сам код по UART. Код был взят из одного примера в просторах инета. Первоначально он был под ATMEGA8, но он вполне подошёл и на ATMEGA16. #define F_CPU 7372800UL #define BAUND 9600L #define UBRRL_value (F_CPU/(BAUND*16))-1 #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> void init_pin(void); #define C_PC0 (~PINC&(1<<PC0)) #define C_PC1 (~PINC&(1<<PC1)) #define LED_1_ON() PORTD|=(1<<PD2) #define LED_1_OFF() PORTD&=~(1<<PD2) #define LED_2_ON() PORTD|=(1<<PD3) #define LED_2_OFF() PORTD&=~(1<<PD3) volatile start=1; char b; ISR(USART_RXC_vect) { b=UDR; } void init_UART() { UBRRL = UBRRL_value; UBRRH = UBRRL_value>>8; UCSRB|=(1<<TXEN); UCSRB|=(1<<RXEN); UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)); UCSRB|=(1<<RXCIE); sei(); } void send_UART(char value) { while(!(UCSRA&(1<<UDRE))); UDR=value; } int main(void) { init_pin(); init_UART(); while(1) { if (start==1) { _delay_ms(500); send_UART('O'); send_UART('K'); send_UART('!'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); start=0; } if (b == '0') { LED_1_ON(); LED_2_OFF(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '1') { LED_1_OFF(); LED_2_ON(); send_UART('N'); send_UART('+'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '2') { LED_1_ON(); LED_2_ON(); send_UART('N'); send_UART('+'); send_UART('2'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '3') { LED_1_OFF(); LED_2_OFF(); send_UART('N'); send_UART('+'); send_UART('3'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (C_PC0) { send_UART('P'); send_UART('C'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); } if (C_PC1) { send_UART('P'); send_UART('C'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); } } } void init_pin(void) { DDRC = 0b00000000; PORTC = 0b11111111; DDRD |= ((1<<2)|(1<<3)); PORTD &=~ ((1<<2)|(1<<3)); } Здесь я пробовал этот код UART конечно в таком виде работает, но здесь есть некоторая непонятная ситуация. На микроконтроллер почему то принимаются значения только в цифровом виде. По другому он отказывается работать. Возможно нужно как то перенастроить что то не совсем это понимаю. А UART эта вещь такая очень нужна без него не сделать управление плеером.
    • Заходишь в даташит усилителя, ищешь вход, обычно конденсаторы, туда и подпаиваешь. Выводишь 5 проводов: входы 4 каналов, и земля входа. Потом: провод левого переднего входа (in1) соединяешь с левым задним (in3), по аналогии с правой стороной делай так же. Получается 2 контакта и земля. Ищешь распиновку своего разъёма и паяешь. Распиновку могу объяснить, если фото будет. Что бы включить, Подключи разъём в телефон и вставь, например, диск с записанной тишиной. Именно с записанной тишиной. То есть со звуком. Например, скачиваешь аудиосигнал 100 гц, и в аудиоредакторе делаешь громкость этого звука на минимум и сохраняешь на диск. Тогда вроде песня будет, но не будет её слышно. И когда этот звук с диска будет воспроизводиться, включи музыку с аукса. 
×
×
  • Создать...