Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Четырехразрядный Регистр Сдвига Для Atmega8535

Автор: saintgosugod
Дата сообщения: 26.05.2016 14:59
Здравствуйте, люди Добрые. Нужна помощь.

Мне нужно написать на моем контроллере avr atmega8535 четырехразрядный регистр прямого сдвига, то есть параллельный код он преобразует в последовательный и сдвигает его нажатием кнопки вправо( https://youtu.be/93JLAVZWoP4?t=2m50s вот видео, начинать смотреть с 2:50)

http://ideone.com/RzAt9G вот сам код, все вроде правильно, ошибок не вижу, но на контроллере не работает.

Программа задержки нужна для устранения дребезга кнопки.

Пожалуйста, найдите ошибку, будьте добры. Схему попытался нарисовать с протеусе, на ней тоже, как и на настоящем контроллере, ничего не работает, хотя в авр студио все летает.


Автор: NeoAnomaly
Дата сообщения: 27.05.2016 08:50
А что под отладкой в эмуляторе видно? По-моему порт A неправильно сконфигурирован, зачем единицы в порту при нормально разомкнутых кнопках на входе? У тебя получаются всегда единицы на входе, поэтому должны быть всегда единицы на выходе.
Автор: saintgosugod
Дата сообщения: 27.05.2016 18:16
нет, в инициализации портов ввода вывода все правильно
Автор: NeoAnomaly
Дата сообщения: 27.05.2016 19:47

Цитата:
нет, в инициализации портов ввода вывода все правильно

saintgosugod, согласно

Цитата:

When you set bits in DDRx to 0, i.e. make port pins as inputs, then corresponding bits in PORTx register are used to activate/deactivate pull-up registers associated with that pin. In order to activate pull-up resister, set bit in PORTx to 1, and to deactivate (i.e to make port pin tri stated) set it to 0.

In input mode, when pull-up is enabled, default state of pin becomes ‘1’. So even if you don’t connect anything to pin and if you try to read it, it will read as 1. Now, when you externally drive that pin to zero(i.e. connect to ground / or pull-down), only then it will be read as 0.

Ссылка

и коду

Код:
PORTA=0xF1; //na vhod
DDRA=0x00;
Автор: saintgosugod
Дата сообщения: 27.05.2016 19:54
спасибо большое, не знал, что так

Добавлено:
при нажатии кнопки в протеусе не работает сдвиг(
Автор: ne_viens
Дата сообщения: 28.05.2016 14:58
Он и не будет работать, так как при нажатии кнопки вход PA0 подключается к VDD, а не VSS. На вход, на котором единица, подаётся единица. То же самое и с PA4-PA7.
И вообще такое лучше с прерываниями делать примерно так [more]
.include "..\include\m8535def.inc"
.def temp = r16

;----------------------------------------------
.cseg
.org $00
    rjmp start
.org INT0addr
    rjmp int0_vector        ;pin PD2
.org INT1addr
    rjmp int1_vector        ;pin PD3
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti

;----------------------------------------------
int1_vector:                    ;shift PORTB left
    in temp, PORTB
    lsl temp
    out PORTB, temp
reti

;----------------------------------------------
int0_vector:                    ;copy PORTA to PORTB

    in temp, PINA
    out PORTB, temp
reti
;----------------------------------------------

start:        
    ldi temp, low(RAMEND)    ;stack init
    out SPL, temp
    ldi temp, high(RAMEND)
    out SPH, temp
    
    ldi temp, 1 << INT0 | 1 << INT1    ;enable INT0,INT1...
    out GIMSK, temp
    ldi temp, 1 << ISC11 | 1 << ISC01 ;...on falling edge
    out MCUCR, temp

    clr temp                    ;ports A,D in
    out DDRA, temp
    out DDRD, temp        
    ser temp
    out DDRB, temp                ;port B out
    out PORTA, temp            ;ports A,D pullup
    out PORTD, temp    
    sei
    
L0:
rjmp L0 [/more]

Страницы: 1

Предыдущая тема: Применение директив условной компиляции, C#


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.