Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATTiny26, PortB, все пины в единицу
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ADOConnection
Всем привет.

Наткнулся на непонятную мне проблему:

настраиваю все порты на выход:
Код
ldi binding,  0b11111111
out DDRA,     binding
out DDRB,     binding


на прерывании таймера1 отправляю на них все единицы:
Код
ldi binding,  0b11111111
out PortA,    binding
out PortB,    binding


в результате таких действий на портах появляются значения
PortA - 0b11111111 - как и положено
PortB - 0b01111101 - причем пин PB1 мигает, похоже в соответсвии с таймером.

МК перестает прошиваться. В чем проблема? Или я делаю то чего не стоит делать? smile.gif
smac
Цитата(ADOConnection @ Jul 10 2008, 00:09) *
Всем привет.

Наткнулся на непонятную мне проблему:

.....
PortB - 0b01111101 - причем пин PB1 мигает, похоже в соответсвии с таймером.

МК перестает прошиваться. В чем проблема? Или я делаю то чего не стоит делать? smile.gif

Как таймер настраиваете?
Лучше приведите код, чтобы не гадать.
По симптомам - таймер настроен в режим генерации частоты, с автоперезагрузкой по OCR1A, смотрите регистр TCCR1A а заодно и TCCR1B
ADOConnection
код, проблема проявилась при эксперементах с бегущими огоньками

Код
.include "tiny26def.inc"

.def    temp=R16
.def    binding=R17
.def    output=R18
.def    counter=R19

.cseg
.org 0

            rjmp Reset      
            rjmp INT_0
            rjmp INT_1
            rjmp Timer1_CompareA
            rjmp Timer1_CompareB
            rjmp Timer1_Overflow
            rjmp Timer0_Overflow
            rjmp UART_RX
            rjmp UART_UDRE
            rjmp UART_TX
            rjmp ANA_COMP

INT_0:
INT_1:
Timer1_CompareB:
Timer1_Overflow:
Timer0_Overflow:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
              reti

        
/* Initialization */

Reset:       ldi temp,        RamEnd        
             out SP,          temp
        
             ldi temp,         0b11111111
             out DDRA,         temp
             out DDRB,         temp

            ldi temp,         0b01000000  
            out TCCR1A,        temp

            ldi temp,         0b00001010
            out TCCR1B,        temp

            ldi temp,        0b11111110    
            out OCR1A,        temp

            ldi temp,        0b01000000  
            out TIMSK,        temp
            
            sei                             


/* Main loop */

Main:        rjmp Main



/* Functions */

ResetTimer:
            ldi temp,        0            
            out TCNT1,        temp
            ret

ResetCounter:
            ldi counter,    0              
             ret

DataBind:   out PortA,         output
            ldi output,        0b11111111  
            out PortB,         output;<---- проблема тут
            ret


/* Timer interrupt handling */

Timer1_CompareA:

            rcall ResetTimer

            cpi counter,    14             
            brne Timer1_CompareA_continue  

            rcall ResetCounter

Timer1_CompareA_continue:

            ldi ZH,            High(Program1 * 2)  
             ldi ZL,            Low(Program1 * 2)

            ldi temp,        0          
            add ZL,            counter
            adc ZH,            temp

            lpm

            mov output,        R0
            inc counter

            rcall DataBind
            
            reti

Program1:

.db         0b00000000,        0b00000001
.db         0b00000011,        0b00000111
.db         0b00001110,        0b00011100
.db         0b00111000,        0b01110000    
.db         0b11100000,        0b11000000
.db         0b10000000,        0b00000000
.db         0,                0




UPD:
Проявил военнцую смекалку -- почитал референс smile.gif

С помощью тыкания на ресет удалось микроконтроллер прошить и он типо "починился".
Qwertty
Цитата(ADOConnection @ Jul 10 2008, 02:16) *
ldi temp, 0b01000000
out TCCR1A, temp

Замените на :
Код
            ldi temp,         0  
            out TCCR1A,        temp

А вообще отучайтесь так писать, надо примерно так:
Код
   ldi temp,         (1<<COM1A0)|(1<<COM1B0)
ADOConnection
Qwertty, ок, спасибо, разобрался.

Цитата(Qwertty @ Jul 10 2008, 04:19) *
А вообще отучайтесь так писать, надо примерно так:
Код
   ldi temp,         (1<<COM1A0)|(1<<COM1B0)

В чем приемущество записи?
Палыч
Цитата(ADOConnection @ Jul 10 2008, 11:27) *
В чем приемущество записи?
В "самодокументированности". Не каждый человек помнит разряды регистров МК - приходится постоянно заглядывать в DS, в особенности, если в программе нет коментариев. Но, скорее всего, помнит как обозначены некоторые из них, потому что обозначения разрядов регистров - сокращения от английских названий.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.