роботы робототехника микроконтроллеры


 Страниц (1): [1]   

> Описание: Illegal attempt to re-use 'OC1Aaddr' as label
ilnur888 Post Id



Маршал


Сообщений всего: 103
Дата рег-ции: Окт. 2010  



Всем добрый вечер! Улыбка
Уважаемые форумчане, пожалуйста помогите разобраться с ошибкой. Я еще начинающий по ассемблеру для МК-ов, делаю все по книге, но ошибки за ошибкой, а вроде делаю все как надо.
Сама ошибка:
CODE:
D:\Program Files\Atmel\prj\prjInter\prjInter.asm(28): error: Illegal attempt to re-use 'OC1Aaddr' as label

Вообщем вот вам код:
CODE:
.include "E:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8515def.inc"
;.def Razr0=r17
;.def Razr1=r18
;.def Razr2=r19
.def tmp=r20
.def tmp2=r21
.def tmp3=r22
;.CSEG
;.org 0
rjmp RESET
;rjmp INT0addr ;External Interrupt0 Vector Address
;rjmp INT1addr ;External Interrupt1 Vector Address
;rjmp ICP1addr ;Input Capture1 Interrupt Vector Address
rjmp OC1Aaddr ;Output Compare1A Interrupt Vector Address
;rjmp OC1Baddr ;Output Compare1B Interrupt Vector Address
;rjmp OVF1addr ;Overflow1 Interrupt Vector Address
;rjmp OVF0addr ;Overflow0 Interrupt Vector Address
;rjmp SPIaddr ;SPI Interrupt Vector Address
;rjmp URXCaddr ;UART Receive Complete Interrupt Vector Address
;rjmp UDREaddr ;UART Data Register Empty Interrupt Vector Address
;rjmp UTXCaddr ;UART Transmit Complete Interrupt Vector Address
;rjmp ACIaddr ;Analog Comparator Interrupt Vector Address
;rjmp INT2addr ;External Interrupt2 Vector Address
;rjmp OC0addr ;Output Compare0 Interrupt Vector Address
;rjmp ERDYaddr ; EEPROM Interrupt Vector Address
;rjmp SPMaddr ; SPM complete Interrupt Vector Address
;rjmp SPMRaddr ; SPM complete Interrupt Vector Address

OC1AADDR: ;ЗДЕСЬ УКАЗЫВАЕТ НА ОШИБКУ

ldi tmp,0
out TCNT1H,tmp
out TCNT1L,tmp
Shift:
cpi tmp2,0b10000000 ;сравнить с крайним значением
breq Init ;если равно - загр. нач. знач.
lsl tmp2 ;иначе - сдвиг влево
rjmp Output ;перейти на вывод в порт
Init:
ldi tmp2,0b00000001 ;загрузить нач значение
Output:
out PORTB,tmp2 ;вывод в порт
reti

reset:
ldi tmp,0b11111111 ;разрешить прерывание компаратора
out DDRB,tmp

ldi tmp,0b00000011 ;тактовый сигнал=СК/64
out TIMSK,tmp

ldi tmp,0x4C ;инициализация компаратора
out OCR1AH,tmp
ldi tmp,0x4B
out OCR1AL,tmp
;========
ldi tmp,HIGH(RAMEND)
out SPH,tmp
ldi tmp,LOW(RAMEND)
out SPL,tmp
;========
ldi tmp2,0b00000001 ;инициализация индикатора
ldi tmp,0 ;обнуление таймера
out TCNT1H,tmp
out TCNT1L,tmp
sei
;========
;основной цикл
;========
Inf: ;бесконечный цикл
rjmp Inf ;можно выполн любые действия


На всякий:
1)AVR Studio 4.18.684
GUI Version 4, 18, 0, 670
AVR Simulator 1, 0, 2, 1
ATMEGA8515 233

Operating System
Major 5
Minor 1
PlatformID 2
Build 2600
Service Pack 3

Plugins:

VDMAvrGUI
AvrPluginAvrAsmObject 1, 0, 0, 48
AvrPluginavrgccplugin 1, 0, 0, 11
Stk500Dll 1, 0, 1, 13
2)Windows XP Pro SP3 ну вряд ли здесь

я думаю может все дело в includ`ном файле??? Замешательство
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



откуда вы взяли этот код?
 
 Top
ilnur888 Post Id



Маршал


Сообщений всего: 103
Дата рег-ции: Окт. 2010  



nest пишет:
откуда вы взяли этот код?


Улыбка
у нас лабораторные по МПЦ, проги всякие разбираем, ошибки ищем, находим,
исправляем. Поэтому эта прога не претендует на правильность Голливудская улыбка
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



1. раскомментируйте это:
;.CSEG
;.org 0

вы ведь должны сказать транслятору, где вы ему что подаёте.

2. если вы прерывания не используете:
rjmp RESET
;rjmp INT0addr ;External Interrupt0 Vector Address
;rjmp INT1addr ;External Interrupt1 Vector Address
;rjmp ICP1addr ;Input Capture1 Interrupt Vector Address

(и т.д.)
то ставте на их место затычку "RETI":
reti ; rjmp INT0addr ;External Interrupt0 Vector Address
reti ; rjmp INT1addr ;External Interrupt1 Vector Address
reti ; rjmp ICP1addr ;Input Capture1 Interrupt Vector Address

иногда (как тут) строку с меткой прерывания ставить в комментарии, так иногда удобно быстро это прерывание всё таки заюзать позже.

если списком не нравится, то прерывания можно описывать так:
CODE:
.CSEG
.org $0000
jmp RESET
.org $00B ; тут пишем адрес прерывания
rjmp USART_TXC ; USART TX Complete Handler


наверняка можно и так:
CODE:
.CSEG
.org $0000
jmp RESET
.org UTXCaddr ; тут пишем имя адреса прерывания, который определён в "инклюднике"
rjmp USART_TXC ; USART TX Complete Handler


Я бы брал имена меток прерываний с даташита:
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 Compare A Handler
rjmp TIM1_COMPB ; Timer1 Compare B Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
rjmp USART_RXC ; USART RX Complete Handler
rjmp USART_UDRE ; UDR0 Empty Handler
rjmp USART_TXC ; USART TX Complete Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp EXT_INT2 ; IRQ2 Handler
rjmp TIM0_COMP ; Timer0 Compare Handler
rjmp EE_RDY ; EEPROM Ready Handler
rjmp SPM_RDY ; Store Program memory Ready Handler


Ваша ошибка скорее всего была из за пунктов 1 и 2.
 
 Top
ilnur888 Post Id



Маршал


Сообщений всего: 103
Дата рег-ции: Окт. 2010  



Так, два пункта сделал как вы сказали - нет результата...
Имена меток прерывания я брал с m8515def.inc, уж не знаю не там ли ошибка...
(Добавление)
CODE:

...
...
.CSEG
.org 0
rjmp RESET
reti;rjmp INT0addr ;External Interrupt0 Vector Address
reti;rjmp INT1addr ;External Interrupt1 Vector Address
reti;rjmp ICP1addr ;Input Capture1 Interrupt Vector Address
rjmp OC1Aaddr ;Output Compare1A Interrupt Vector Address
reti;rjmp OC1Baddr ;Output Compare1B Interrupt Vector Address
reti;rjmp OVF1addr ;Overflow1 Interrupt Vector Address
reti;rjmp OVF0addr ;Overflow0 Interrupt Vector Address
reti;rjmp SPIaddr ;SPI Interrupt Vector Address
reti;rjmp URXCaddr ;UART Receive Complete Interrupt Vector Address
reti;rjmp UDREaddr ;UART Data Register Empty Interrupt Vector Address
reti;rjmp UTXCaddr ;UART Transmit Complete Interrupt Vector Address
reti;rjmp ACIaddr ;Analog Comparator Interrupt Vector Address
reti;rjmp INT2addr ;External Interrupt2 Vector Address
reti;rjmp OC0addr ;Output Compare0 Interrupt Vector Address
reti;rjmp ERDYaddr ; EEPROM Interrupt Vector Address
reti;rjmp SPMaddr ; SPM complete Interrupt Vector Address
reti;rjmp SPMRaddr ; SPM complete Interrupt Vector Address
OC1AADDR:
...
...

исправил
(Добавление)
та же часть, но как вы сказали:
CODE:
...
...
.CSEG
.org 0
rjmp RESET
.org $004 ;Output Compare1A Interrupt Vector Address
OC1AADDR:
...
...

(Добавление)
А вы не пробовали у себя ч/з ассемблер скомпилировать? Может это только у меня такие проблемы??? Просто я и другие проги пробовал с прерываниями делать - та же ошибка!
Как будто AVRStudio перестал прерывания узнавать...
Кстати, при первом запуске AVR Studio показал, что в самом includ`ном файле m8515def.inc ОШИБКА!, а потом как-то пропало все... вообщем чудеса да и только!

(Отредактировано автором: 20 Марта, 2011 - 23:48:54)

 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



ilnur888 пишет:
Кстати, при первом запуске AVR Studio показал, что в самом includ`ном файле m8515def.inc ОШИБКА

откомментируйте строку в m8515def.inc :
;.equ OR =3 ; old name kept for compatibilty

В след. раз не берите имена меток, которые уже определены в инклюднике.
И заглядывайте в даташит почаще, там очень много примеров.
И снабжайте комментариями блоки кода, что б каши не получалось.

Так работает:

CODE:
.CSEG
.org 0
rjmp RESET ; Reset Handler
RETI; rjmp EXT_INT0 ; IRQ0 Handler
RETI; rjmp EXT_INT1 ; IRQ1 Handler
RETI; rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 Compare A Handler
RETI; rjmp TIM1_COMPB ; Timer1 Compare B Handler
RETI; rjmp TIM1_OVF ; Timer1 Overflow Handler
RETI; rjmp TIM0_OVF ; Timer0 Overflow Handler
RETI; rjmp SPI_STC ; SPI Transfer Complete Handler
RETI; rjmp USART_RXC ; USART RX Complete Handler
RETI; rjmp USART_UDRE ; UDR0 Empty Handler
RETI; rjmp USART_TXC ; USART TX Complete Handler
RETI; rjmp ANA_COMP ; Analog Comparator Handler
RETI; rjmp EXT_INT2 ; IRQ2 Handler
RETI; rjmp TIM0_COMP ; Timer0 Compare Handler
RETI; rjmp EE_RDY ; EEPROM Ready Handler
RETI; rjmp SPM_RDY ; Store Program memory Ready Handler


TIM1_COMPA:
ldi tmp,0
out TCNT1H,tmp
out TCNT1L,tmp
Shift:
cpi tmp2,0b10000000 ;сравнить с крайним значением
breq Init ;если равно - загр. нач. знач.
lsl tmp2 ;иначе - сдвиг влево
rjmp Output ;перейти на вывод в порт
Init:
ldi tmp2,0b00000001 ;загрузить нач значение
Output:
out PORTB,tmp2 ;вывод в порт
reti

reset:
ldi tmp,0b11111111 ;разрешить прерывание компаратора
out DDRB,tmp

ldi tmp,0b00000011 ;тактовый сигнал=СК/64
out TIMSK,tmp

ldi tmp,0x4C ;инициализация компаратора
out OCR1AH,tmp
ldi tmp,0x4B
out OCR1AL,tmp
;========
ldi tmp,HIGH(RAMEND)
out SPH,tmp
ldi tmp,LOW(RAMEND)
out SPL,tmp
;========
ldi tmp2,0b00000001 ;инициализация индикатора
ldi tmp,0 ;обнуление таймера
out TCNT1H,tmp
out TCNT1L,tmp
sei
;========
;основной цикл
;========
Inf: ;бесконечный цикл
rjmp Inf ;можно выполн любые действия
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



ну как раз про таблицу прерываний и хотел написать...
первый вариант был не правильный.
(Добавление)
32 прерывания у авр
значит писать программу нужно с

.org 20
 
 Top
ilnur888 Post Id



Маршал


Сообщений всего: 103
Дата рег-ции: Окт. 2010  



Всем привет!
Ребята, спасибо что подсказали, помогли, как-то как непонятно как все заработало...
Улыбка
Обязательно попробую как вы сказали!
Спасибо всем большое!
 
 Top
Страниц (1): [1]
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru