Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Входы и выходы на AT90s4433
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
KAMASUTR
Код
#include "4433def.inc"

.def ZERO=r22
.def INPUT=r0
.def TEMP=r20
.def COUNTER=r18

ldi ZERO, 0
out ADCSR, ZERO;disable ADC
ldi TEMP, 1
out DDRB, TEMP;set first 1 bits of portb to output
ldi TEMP, 2
out DDRC, TEMP;set portc to input

check:
ldi COUNTER, 0
out PORTB, COUNTER
check1:
in INPUT, PINC;get input
ror INPUT;check first bit (0 = input)
brcs check
ldi COUNTER, 3
out PORTB, COUNTER
rjmp check1

У меня есть вход порт PC0 и выход PB0, проблема в том что если я хочу повесить вход еще на PC1 или PC2 то на выходе PB0 нечего не выходит, помогите! КАк правильно подключать несколько входов и несколько выходов?
demiurg_spb
Попробуйте для начала
Код
    ldi r16, 255
    out PORTC,r16; inputs with pullups
    out DDRB,r16; outputs

LOOP:
    in r16,PINC
    out PORTB,r16
    wdr
    rjmp LOOP
Для проверки работоспособности замыкайте на землю пины PORTC и наблюдайте за PORTB.
И еще изучите все инструкции avr-asm:
http://www.atmel.com/dyn/resources/prod_do...nts/doc0856.pdf
http://www.atmel.com/dyn/resources/prod_do...nts/doc1022.pdf
KAMASUTR
Так как вы написали не работает! За ПДФ-ки спосибо
demiurg_spb
Цитата(KAMASUTR @ Dec 3 2009, 15:39) *
Так как вы написали не работает! За ПДФ-ки спосибо
Не верюsmile.gif
CODE
.NOLIST
.INCLUDE "4433def.inc"
.LIST

.CSEG
.ORG 0x00

ldi r16,low(RAMEND)
out SP,r16

ldi r16,0xff
out PORTC,r16 ; inputs with pullups
out DDRB,r16 ; outputs

LOOP:
in r16,PINC
out PORTB,r16
wdr
rjmp LOOP

.EXIT
Проверил в avrstudio - точно работает. За 10 лет ничего не изменилось.
KAMASUTR
Спосибо, но я нашел другой способ)))
если интересно

CODE
#include "4433def.inc"

.def ZERO=r22
.def INPUT=r0
.def TEMP=r20
.def COUNTER=r18

ldi ZERO, 0
out ADCSR, ZERO;disable ADC
ldi TEMP, 1
out DDRB, TEMP;set first 1 bits of portb to output
ldi TEMP, 255
out PORTC, TEMP;set portc to input

check:
ldi COUNTER, 0
out PORTB, COUNTER
check1:
in INPUT, PINC;get input
ror INPUT;check first bit (0 = input)
brcs check2; if no input
brcc check3; if is input
check2:
ror INPUT;check first bit (0 = input)
brcs check
check3:
ldi COUNTER, 3
out PORTB, COUNTER
rjmp check1
ae_
KAMASUTR, Ваш исходник реализует вот эту программу:
если (PINC0=1 и PINC1=1), то PORTB=0, иначе PORTB=3

вот один из вариантов реализации:
Код
check:
      in   temp, PINC;читаем состояние кнопок
      andi temp, 1<<PINC1|1<<PINC0;обнуляем все биты, кроме двух кнопок
      cpi  temp, 1<<PINC1|1<<PINC0;нажата ли хоть одна кнопка?

      ldi  temp, 3;значение для PORTB, если нет ввода
      breq no_input;нет, не нажата, переход на "нет ввода"

      ldi  temp, 0;нажата одна или обе кнопки, значение для PORTB
no_input:
      out  PORTB, temp;вывести значение в PORTB
      rjmp check;перейти в начало цикла опроса
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.