Jump to content

anton2488

Members
  • Content Count

    9
  • Joined

  • Last visited

Community Reputation

0 Обычный

About anton2488

  • Rank
    Новенький

Электроника

  • Стаж в электронике
    6-10 лет

Recent Profile Visitors

202 profile views
  1. Опять какая то странная ситуация возникла(мега48п) clr r16 out EEARH, r16 out EEARL, r16 sbi eecr,0 in div1,eedr Error 1 Undefined symbol: EEARH вот прямо из даташита копировал ; Set up address (r18:r17) in address register out EEARH, r18 out EEARL, r17 ; Start eeprom read by writing EERE sbi EECR,EERE ; Read data from Data Register in r16,EEDR с EEARL всё нормально работает
  2. Помогло! Дурацкая ошибка. Непонятно, почему бит adsc не загорается в симуляторе, из-за этого пошёл не в том направлении. Есть ли возможность в симуляторе эмитировать прерывания по цап, чтобы проверять вектора? Простая установка флагов ничего не даёт.
  3. ATmega48P .def temp1=r16 .def temp2=r17 .cseg .org 0x0000 rjmp RESET reti//1 reti//2 reti//3 reti//4 reti//5 reti//6 reti//7 reti//8 reti//9 reti//10 reti//11 reti//12 reti//13 reti//14 reti//15 reti//16 reti//17 reti//18 reti//19 reti//20 reti//21 rjmp adcpwm reti//23 reti//24 reti//25 reti//26 RESET: ldi r16, high(RAMEND); Main program start out SPH,r16 ; Set Stack Pointer to top of RAM ldi r16, low(RAMEND) out SPL,r16 ldi temp1,0b00000000 out ddrb,temp1 ldi temp1,0b11100000 out ddrd,temp1 ldi temp1,0b00000000 out ddrc,temp1 ldi temp1,0b00000000 out portb,temp1 ldi temp1,0b00000000 out portc,temp1 //timer ldi temp1,0b10100011 out tccr0a,temp1 ldi temp1,0b00000001 out tccr0b,temp1 //adc ldi temp1,0b00100000//УСТАНОВЛЕН СДВИГ ВЛЕВО sts admux,temp1 ldi temp1,0b00000000 sts adcsrb,temp1 ldi temp1,0b10101111//инициализация без запуска цап sts adcsra,temp1 ldi temp1,0b11101111//инициализация с запуском цап sts adcsra,temp1 sei start: rjmp start adcpwm://запись из цап в шим lds temp1,adcl lds temp2,adch sbi portd,7// проверка прерывания out ocr0a,temp2 reti
  4. А где смотреть нужно? Вот я добавил инициализацию стека. Но указатель стека и раньше и сейчас указывает на то же значение 0x015F :020000020000FC :100000000FC0189518951895189518951895189566 :1000100039C018951895189518951895189518952C :1000200001E00EBF0FE50DBF00E004BF01B50861A0 :1000300001BD00E001BD03E007BB08E108BB03E828 :100040000ABD01E003BF01E207B90FEE06B900E007 :1000500003B928E07894B39B0CC0B49B01C0FBCFDC :10006000B49BFECF2830B9F340FD01C023954395E2 :10007000F2CFB39BFECF222371F340FF01C02A953C :100080004A95E9CF04B115B1322F332361F01695AB :1000900007953A95E1F740FF06C0612F502F66950E :0C00A0005795050F161F19BD18BD1895C7 :00000001FF Спасибо, макросы попробую. Для регистров выше 0x40 требуется sts, в даташите указаны какие то адреса в скобках 0x20 (0x40) EEDR что они означают? Не знаете почему не устанавливается бит ADSC запуска ацп в adcsra на меге48? Даже не знаю куда копать, в даташите о особых условиях запуска ничего не нашёл.
  5. А есть другие команды, которыми можно записать? Я сейчас не могу записать единицу в 6 бит, который запускает цап. ldi temp1,0b11101111 sts adcsra,temp1 а записывается 0b10101111 В чем может быть причина, и как записать бит? В тини всё нормально записывается.
  6. Спасибо, по sreg дельное замечание, могли бы возникнуть проблемы. контроллер тини45 :020000020000FC :100000000FC0189518951895189518951895189566 :1000100035C0189518951895189518951895189530 :1000200000E004BF01B5086101BD00E001BD03E0CF :1000300007BB08E108BB03E80ABD01E003BF01E21A :1000400007B90FEE06B900E003B928E07894B39B36 :100050000CC0B49B01C0FBCFB49BFECF2830B9F3DA :1000600040FD01C023954395F2CFB39BFECF2223E1 :1000700071F340FF01C02A954A95E9CF04B115B14B :10008000322F332361F0169507953A95E1F740FF3B :1000900006C0612F502F66955795050F161F19BD85 :0400A00018BD1895DA :00000001FF Сейчас возникла друга проблема. Пытаюсь перенести программу на мегу48 ldi temp1,0b01100000 out admux,temp1 пишет ошибку Error 1 Operand 1 out of range: 0x7c каким образом вносить данные в эти регистры если in и out не работают с этими адресами? тут случайно банк памяти не нужно переключать? А, нашёл <a name="#top">lds r2, $FF00 ; Загрузить в r2 содержимое SRAM по адресу $FF00 add r2, r1 ; Сложить r1 с r2 sts $FF00, r2 ; Записать обратно
  7. в авр студио 5 и 6 не нужно инициализировать, всё само. всё верно, я перепутал и декременировал регистр div1 где должно постоянно хранится значение, в этом и была проблема. Про сохранение регистров не слышал. Чем это вызвано? Каким образом прерывание может изменить значение регистров, если с ними не работают в прерывании. Но идея хороша, можно сэкономить регистр.
  8. UPD Прошу прощения, нашлась ошибка, производился декремент постоянного регистра. Изучаю авр и столкнулся с непреодолимой для меня проблемой. Простая программа АЦП>програмный делитель>шим. Регистр, в котором постоянно хранится число сдвигов для деления всё время сбрасывается в 0, при этом при этом установленный бит в порте не сбрасывается(сделал для проверки). Не важно, записан ли регистр в РЕСЕТ или в прерывании через кнопку, всё равно происходит сброс. Как такое может быть? Это происходит при моделировании в Протеусе, в симуляторе сброса нет, правда я не знаю как там вызывать прерывания, просто переставляю курсор. Сторожевой таймер вроде отключён и програмно и в протеусе. Что я делаю не так? Помогите новичку. .def temp1=r16 .def temp2=r17 .def div1=r18 .def div2=r19 .cseg .org 0x0000 rjmp RESET reti//1 rjmp vol//2 reti//3 reti//4 reti//5 reti//6 reti//7 rjmp adcpwm reti//9 reti//10 reti//11 reti//12 reti//13 reti//14 reti//15 RESET: ldi r16, (0<<WDRF)// остановка ст. таймера. out MCUSR, r16 ; Write logical one to WDCE and WDE ; Keep old prescaler setting to prevent unintentional Watchdog Reset in r16, WDTCR ori r16, (1<<WDCE)|(1<<WDE) out WDTCR, r16 ; Turn off WDT ldi r16, (0<<WDE) out WDTCR, r16 ldi temp1,0b00000011 out ddrb,temp1 ldi temp1,0b00011000 out portb,temp1 ldi temp1,0b11000011 out tccr0a,temp1 ldi temp1,0b00000001 out tccr0b,temp1 ldi temp1,0b00100001//УСТАНОВЛЕН СДВИГ ВЛЕВО out admux,temp1 ldi temp1,0b11101111 out adcsra,temp1 ldi temp1,0b00000000 out adcsrb,temp1 ldi temp1,0b00000000 out mcucr,temp1 ldi temp1,0b00100000 out gimsk,temp1 ldi temp1,0b00011000 out pcmsk,temp1 ldi div1,3// запись коэф деления в постоянный регистр sei start: rjmp start adcpwm:// прерывание АЦП--------------------------------------------- in temp1,adcl in temp2,adch mov div2,div1 // запись коэф. деления из постоянного рег во временный tst div2//деление breq zap l1: lsr temp2 ror temp1 dec div1 brne l1 zap://запись в шим out ocr0a,temp2 out ocr0b,temp2 reti VOL://прерывание кнопки---------------------------------------------------- ldi div1,3// запись коэф деления в постоянный регистр sbi portb,1//индикатор прерывания reti
×
×
  • Create New...