Порты ввода/вывода

Обсуждаем контроллеры компании Atmel.
Ответить
PLATON
Родился
Сообщения: 9
Зарегистрирован: Ср июл 23, 2014 16:23:27

Порты ввода/вывода

Сообщение PLATON »

Здравствуйте! Зашёл в тупик не могу настроить порт С (PC0) atmega16 на ввод, вернее настроил а неработает.
Меня интересует физическая величина c практической стороны типа подал +5В на вывод PC0 и должно произойти определённое действие! В симуляторе AVR Studio при установки бита0 в PortC всё срабатывает а в Протеусе не работает!!
Может что-то не так делаю - я только учусь! Код прилагается.
Спойлер

Код: Выделить всё

/*
 * FAST_shim.asm
 *
 *  Created: 19.08.2014 14:18:20
 *   Author: PLATON
 */ 

 
 .def     Temp=R16
 .def     Temp1=R17
 .def     Temp2=R18
 .def     Temp3=R19
 .def     Temp4=R21
 .def     Temp5=R22
 .def     ResCnt=R20
 
 .cseg
 .org 0


 ;Вектора прерываний
 
jmp RESET      ; Reset Handler
jmp EXT_INT0   ; IRQ0 Handler
jmp EXT_INT1   ; IRQ1 Handler
jmp TIM2_COMP  ; Timer2 Compare Handler
jmp TIM2_OVF   ; Timer2 Overflow Handler
jmp TIM1_CAPT  ; Timer1 Capture Handler
jmp TIM1_COMPA ; Timer1 CompareA Handler
jmp TIM1_COMPB ; Timer1 CompareB Handler
jmp TIM1_OVF   ; Timer1 Overflow Handler
jmp TIM0_OVF   ; Timer0 Overflow Handler
jmp SPI_STC    ; SPI Transfer Complete Handler
jmp USART_RXC  ; USART RX Complete Handler
jmp USART_UDRE ; UDR Empty Handler
jmp USART_TXC  ; USART TX Complete Handler
jmp ADCM       ; ADC Conversion Complete Handler
jmp EE_RDY     ; EEPROM Ready Handler
jmp ANA_COMP   ; Analog Comparator Handler
jmp TWSI       ; Two-wire Serial Interface Handler
jmp EXT_INT2   ; IRQ2 Handler
jmp TIM0_COMP  ; Timer0 Compare Handler
jmp SPM_RDY

;RESET:      
;EXT_INT0:  
;EXT_INT1:  
TIM2_COMP:  
TIM2_OVF:   
TIM1_CAPT:  
TIM1_COMPA: 
TIM1_COMPB: 
TIM1_OVF:   
TIM0_OVF:   
SPI_STC:    
USART_RXC:  
USART_UDRE: 
USART_TXC:  
ADCM:        
EE_RDY:     
ANA_COMP:   
TWSI:       
;EXT_INT2:
TIM0_COMP:
SPM_RDY:
 
 reti
 

;****************************************************
; ИНИЦИАЛИЗАЦИЯ
;****************************************************

 Reset:
                                ; инициализация стека         
		  LDI Temp1,Low(RAMEND)      
          OUT SPL,Temp1         
          LDI Temp1,High(RAMEND)
          OUT SPH,Temp1

          ldi Temp,0b11111110   ;настройка портов
          out DDRC,Temp
		  out PORTC,Temp
		  
          
          ldi Temp,0b10000000    ;настройка портов
          out DDRD,Temp

		  ldi Temp,0b11111000    ;настройка портов
          out DDRB,Temp
		 

		  ldi Temp,0b00100000    ; Разрешение прерывания INT2
          out GICR,Temp

		  ldi Temp,0b01000000    ; По нарастающему фронту
          out MCUCSR,Temp

		  sei                    ; Разрешить прерывания
Pusk:
		  jmp Pusk

EXT_INT2:		                         
                                 ;настройка противофазы OC0 и OC2  
		  ldi Temp,0b00000001    ;инициализация таймера0
          out TCNT0,Temp         
		                         
		  ldi Temp,0b10000011    ;инициализация таймера2
          out TCNT2,Temp

		 
	      ldi Temp,0b01111001    ;фаст шим0 настройка, запуск таймера
          out TCCR0,Temp

		  ldi Temp,0b01111001    ;фаст шим2 настройка, запуск таймера
          out TCCR2,Temp
		  

		  
EEPROM_read:                     ;Чтение данных с EEPROM
          sbic EECR,EEWE         ;Ждать завершения предыдущей записи
          jmp EEPROM_read
          sbi EECR,EERE          ;Начать чтение
          in Temp4,EEDR          ;Сохранить данные
          
		  out OCR0,Temp4         ;Вывести в регистр сравнения счётчика 
          out OCR2,Temp4         ;Вывести в регистр сравнения счётчика 


		  ldi Temp,0b11000000    ; Разрешение прерывания INT0, INT1
          out GICR,Temp

		  ldi Temp,0b00000000    ; По низкому уровню
          out MCUCR,Temp

		  sei	                         

cikl:                            ; бесконечный цикл
          nop
		  in Temp,PORTC
		  CPI Temp,0b11111110
		  brne Reset
		  jmp cikl         

  
                                 ; обработчик внешнего прерывания  
	   
EXT_INT0:            
	   
	      ldi Temp3,0
          ldi Temp2,0

l_res:
          dec Temp3               ; Антидребезг
          brne l_res

          dec Temp2
          brne l_res

          inc ResCnt   		 		            

		  CPI Temp4,0b11111000    ; сравним с крайним значением
		  BRSH m1                 ; если больше или равно перейдём на метку

	      inc Temp4
	      inc Temp4
	      inc Temp4
	      inc Temp4
	      inc Temp4
		  inc Temp4               ; Уменьшаем Ширину импульса
		  inc Temp4
		  inc Temp4          
		  out OCR0,Temp4
		  out OCR2,Temp4 

 EEPROM_write1:                     ;Запись данных в EEPROM
          sbic EECR,EEWE            ;Ждать завершения предыдущей записи
          jmp EEPROM_write1
         
          out EEDR,Temp4            ;Записать данные в регистр данных
          sbi EECR,EEMWE            ;Установить флаг EEMWE
          sbi EECR,EEWE             ;Начать запись в EEPROM
		 	 
m1:

		  reti
		 

EXT_INT1:
  
	      ldi Temp3,0
          ldi Temp2,0

l_res2:
          dec Temp3                ; Антидребезг
          brne l_res2

          dec Temp2
          brne l_res2

          inc ResCnt 
		  	  
		  CPI Temp4,0b10001100     ; сравним с крайним значением
		  BRLO m2                  ; если меньше или равно перейдём на метку

	      dec Temp4                ; Увеличиваем Ширину импульса 
		  dec Temp4
		  dec Temp4
		  dec Temp4
		  dec Temp4
		  dec Temp4
		  dec Temp4
		  dec Temp4
	      out OCR0,Temp4
		  out OCR2,Temp4

EEPROM_write:                      ;Запись данных в EEPROM
         sbic EECR,EEWE            ;Ждать завершения предыдущей записи
         jmp EEPROM_write 
         out EEDR,Temp4            ;Записать данные в регистр данных
         sbi EECR,EEMWE            ;Установить флаг EEMWE
         sbi EECR,EEWE             ;Начать запись в EEPROM

		 
m2:

		  reti
Реклама
Реклама
bob1
Мучитель микросхем
Сообщения: 453
Зарегистрирован: Ср июн 08, 2011 20:25:20
Контактная информация:

Re: Порты ввода/вывода

Сообщение bob1 »

Пробовал протеус несколько лет назад для AVR, глючил безбожно....перешел на тестирование в железе.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Порты ввода/вывода

Сообщение Pink-Pank »

подтяжку вывода к земле через резистор 10 кОм сделай. Протеус при свободно болтающемся выводе по умолчанию считает, что на нем присутствует некий +. У реальной схемы на свободно болтающемся выводе может быть что угодно - состояние не определено и может хаотично меняться под действием наводок и тепловых шумов.
Fucking static initialization order fiasco
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Порты ввода/вывода

Сообщение Engineer_Keen »

PLATON писал(а):не могу настроить порт С (PC0) atmega16 на ввод, вернее настроил а неработает.
входной регистр порта называется PINC а не PORTC, с PORTC вы всегда прочтете то, что сами выставили, независимо от ситуации на входе, см. рисунок 23 даташита.

И не обязательно читать весь порт, для проверки отдельной ноги есть SBIC/SBIS.
bob1 писал(а):Пробовал протеус несколько лет назад для AVR, глючил безбожно....перешел на тестирование в железе.
Железо штука хорошая, но протеус не на столько глючный, чтобы такие простые вещи не работали.

nirq, JTAG в середине порта C висит, а прочитать пытаются младший бит...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Реклама
PLATON
Родился
Сообщения: 9
Зарегистрирован: Ср июл 23, 2014 16:23:27

Re: Порты ввода/вывода

Сообщение PLATON »

входной регистр порта называется PINC а не PORTC, с PORTC вы всегда прочтете то, что сами выставили, независимо от ситуации на входе, см. рисунок 23 даташита.

Я и PINC пытался прочитать, но ничего не получилось.
Можеть в коде что-то не верно?
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Порты ввода/вывода

Сообщение Jack_A »

Весь код читать неохота, но если анализируется только бит 0, то его и надо сравнивать.

Код: Выделить всё

 
       in Temp,PINC
       ori  Temp,0b11111110
        CPI Temp,0b11111110
        brne Reset


     или  :

      andi  Temp,1
        CPI Temp,0    ;   или   TST   Temp


А то на остальных лапках С хз что висит.
Последний раз редактировалось Jack_A Вт авг 26, 2014 20:47:08, всего редактировалось 1 раз.
bob1
Мучитель микросхем
Сообщения: 453
Зарегистрирован: Ср июн 08, 2011 20:25:20
Контактная информация:

Re: Порты ввода/вывода

Сообщение bob1 »

Кусок кода зачем нужен???!!!

Код: Выделить всё

          nop
        in Temp,PORTC
        CPI Temp,0b11111110
        brne Reset
В начале проги выставляется DDRC и PORTC=0b11111110.
Замена на PINC при смене уровня вызовет переход на Reset. А зачем он нужен?
PLATON
Родился
Сообщения: 9
Зарегистрирован: Ср июл 23, 2014 16:23:27

Re: Порты ввода/вывода

Сообщение PLATON »

В начале проги выставляется DDRC и PORTC=0b11111110.
Замена на PINC при смене уровня вызовет переход на Reset. А зачем он нужен?[/quote]

При смене уровня выполнение программы перейдёт на метку Reset и произойдёт остановка генерации ШИМ т.е (кнопка выкл).
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Порты ввода/вывода

Сообщение YS »

Можеть в коде что-то не верно?
Вам nirq уже писал, что, видимо, в этом кристалле часть порта С по умолчанию зарезервирована под JTAG. Почитайте в даташите, как его отключить. Я на память не помню, по-моему это фьюз JTAGEN.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Ответить

Вернуться в «AVR»