Отговори на тема  [ 45 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща
Прекъсване от USART 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Стига де, не с такъв снисходителен тон...верно че си по-голям и с повече опит ама... :lol: Шега...утре ще пусна сорса да гледате кви глупости съм писал :roll:


Чет Окт 28, 2004 5:02 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Пък и самият факт, че кода работи без използването на прекъсвания говори достатъчно: така или иначе със сигурност PIC-а приема нещо, със сигурност флага RCIF се вдига //поне така става при тестовете//. Банкирането ми е вред със сигурност, процедурите за push/pop са от стандартен template на MPLAB, използвал съм ги десетки пъти по същия начин. Айде стига съм дрънкал глупости, довечера ако не го подкарам, утре ще паст-на кода


Чет Окт 28, 2004 5:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Не се засягай, просто се пошегувах. Всички грешим, а аз вероятно доста повече пъти от тебе.


Чет Окт 28, 2004 5:10 pm
Профил ICQ
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Сря Окт 13, 2004 11:24 pm
Мнения: 500
Местоположение: Стара Загора
Мнение 
Това имаш ли го в кода?
Код:
          org   0x00
          goto  begin_program

          org  0x04
          ....
          .... ; твоят код
          retfie

begin_program
          ......
          ......
          .......
           и т.н.


Чет Окт 28, 2004 6:18 pm
Профил YIM
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Никакви грижи нямам бе ... при мен си работи .... в момента позлвам каквит са сетиш прекъсвания накуп ... никакъв проблем ... даже съм оставил тъпия компилатор да ми оправи прекъсването ... само вчера пипнах малко че свини на rb change ... иначе и с asm съм го позлвал и всичко е ОК .... не знам при теб акво става ...виж да не си в друга банка ..... и един съвет .. катоимаш прекъсвания гледаи да не се застояваш в тях, ако обработваш данни от RS примерно направи си един буфер, пълни го от прекъсването и го обработвай външно ... така нито ще изтърваш байтове нито ще си забавяш останалата програма .... множе и да го знаеш де .. но да спомена ...


Чет Окт 28, 2004 8:34 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Ъ тва с буфера е много резонно. И аз така правя - едно 16 до 256 байтово кръгово буферче играе перфектно. Оставяш прекъсването да се грижи само за него, пък отвън га ти е кеф, тогава го обработваш ( е не баш)


Пет Окт 29, 2004 9:37 am
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Съб Сеп 25, 2004 4:33 pm
Мнения: 273
Местоположение: София
Мнение 
Мдаа и аз така :)

_________________
Adios
Mozfet


Пет Окт 29, 2004 9:45 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
С риск да си издам мега-хипер-свръх-топ-секретния код:

Код:
   ORG     0x0000             ; processor reset vector
   nop                    ; nop required for icd
     goto    INIT                    ; go to beginning of program

   ORG     0x0004             ;interrupt vector location
PUSH
   movwf   w_temp          ; save off current W register contents
   movf   STATUS,w      ; move status register into W register
   movwf   status_temp       ; save off contents of STATUS register
   movf   PCLATH,w     ; move pclath register into w register
   movwf   pclath_temp     ; save off contents of PCLATH register
   movf   FSR,w
   movwf   fsr_temp
                     ..
   btfss   PIR1,RCIF
   goto   POP
   BANKSEL   PIE1
   bcf   PIE1,RCIE   ; Disable USART interrupt
   bcf   STATUS,RP0
   goto   USART_ISR
                     ..

POP
   movf   fsr_temp,w
   movwf   FSR
   movf   pclath_temp,w     ; retrieve copy of PCLATH register
   movwf   PCLATH        ; restore pre-isr PCLATH register contents
   movf    status_temp,w     ; retrieve copy of STATUS register
   movwf   STATUS            ; restore pre-isr STATUS register contents
   swapf   w_temp,f
   swapf   w_temp,w          ; restore pre-isr W register contents
   retfie                    ; return from interrupt
   
USART_ISR
   btfsc   msg_status,4  ; Check if device is executing a command 
   goto   USART_busy
   btfsc   msg_status,5  ; Check if this is new packet
   goto   next_pack_byte
   movlw   0xFF
   movwf   TEMP1
   movlw   0xFF
   movwf   TEMP2
   movlw   0xA0   ; Yes, new packet, start from FSR 0xA0
   movwf   FSR
   movf   RCREG,w
   movwf   INDF
poll_id
   btfsc   PIR1,RCIF      ; Wait here for second ID byte
   goto   sec_id         
   decf
sz   TEMP1,f      ; Poll next 51uS
   goto   poll_id
   decfsz   TEMP2,f
   goto   poll_id
goto   POP
sec_id   
   incf   FSR,f
   movf   RCREG,w
   movwf   INDF
   movlw   0xA0
   movwf   FSR
   movf   INDF,w
   call   check_header
   banksel   msg_status
   btfsc   msg_status,0   ; ;Ceckfor ID reception   
   bsf   msg_status,5   ; ID recieved -- recording started
   btfsc   msg_status,0
   goto   USART_busy
goto   POP
next_pack_byte
   incf   FSR,f
   movf   RCREG,w
   movwf   INDF
goto   POP
USART_busy
                     send             'wait'
goto POP


Самият протокол:
Код:
check_header
   bsf      STATUS,RP0
   clrf      msg_status
   movlw   0xA0      ; Location of ID_H if reception is successful
   movwf   FSR      ; Compare ID_H with IDH (first header byte must be "I")
   movlw   IDH
   subwf   INDF,w
   btfss   STATUS,Z
   goto   no_header   ; Header not found
   incf   FSR,f      ; Location of ID_L
   movlw   IDL
   subwf   INDF,w
   btfss   STATUS,Z
   goto   no_header   ; Header not found
header_found
   bsf   msg_status,0   ; Set header_found bit
   bcf   STATUS,RP0
   return
no_header
   bcf      msg_status,0
   bcf      STATUS,RP0
   return
;====================================
   
;======= Get DATA Lenght ==================
;   OUTPUT:          packet_lenght
; If lenght = 0 then
; msg_status,1 = 0
; else
; msg_status,1 = 1
check_data_lenght      
   bsf   STATUS,RP0
   btfss   msg_status,0
   goto   bad_id   
   movlw   0xA2
   movwf   FSR
   movf   INDF,w
   movwf   packet_lenght
   bcf   STATUS,Z
   xorlw   0x00
   btfss   STATUS,Z         
   bsf   msg_status,1
   btfsc   STATUS,Z
   bcf   msg_status,1   
   bcf   STATUS,RP0   
return
bad_id
   bsf   msg_status,3         ; ;SET ;MASTER ERROR ON
RECIEVED STRING
   bcf      STATUS,RP0   
return
;======================================   
   
   
;========= Verify CHECKSUM ================
; INPUT:      CHKSUM1, CHKSUM2
; OUTPUT:      IF CHKSUM(OK) then msg_status,2 = 1
;1.   CHKS1 = Value(Data[1] + Data[2] +..+ Data[N])
;2.   CHKS2 = COM(Value(HEADER + packet_size + CHKSUM1))

verify_chksum
   bsf   STATUS,RP0
   btfss   msg_status,1      ; Check for valid data lenght
   goto   bad_chksum
   btfsc   msg_status,3      ; Check for master error
   goto   bad_chksum
   movlw   0xA3
   movwf   FSR
   movf   packet_lenght,w
   addwf   FSR,f      ; FSR now points to CHKSUM1
   movf   INDF,w
   movwf   chksum1
   incf   FSR,f
   movf   INDF,w
   movwf   chksum2
   movlw   0xA3
   movwf   FSR
   movf   packet_lenght,w
   movwf   BTEMP1
   clrf   BTEMP2
ver_calc
   movf   INDF,w
   addwf   BTEMP2
   incf   FSR,f
   decfsz   BTEMP1,f
   goto   ver_calc         
ver_start      ; Verify calculated CHKSUM with recieved   
   movf   BTEMP2,w
   xorwf   chksum1,w
   btfss   STATUS,Z
   goto   bad_chksum      
   movlw   IDH+IDL
   addwf   packet_lenght,w
   addwf   chksum1,w
   movwf   BTEMP2
   comf   BTEMP2,w
   xorwf   chksum2,w
   btfss   STATUS,Z
   goto   bad_chksum
   bsf      msg_status,2
   bcf      STATUS,RP0      
   return
bad_chksum
   bcf      msg_status,2
   bcf      STATUS,RP0   
   return


И не се присмивайте много... :lol: Така де, проблема се оказа във влаг CREN (забравям да го вдигна).


Пет Окт 29, 2004 10:54 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Няма да го гледам, щом си се оправил - ОК. Черпиш. Между другото, защо не ползваш C ?


Пет Окт 29, 2004 11:15 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Ами и аз не знам, почнах го на АСМ, реших така да го напиша...Понеже не съм експерт, а и не съм учил за такъв, кажете си мнението - тежко ли е или е добре като решение...


Пет Окт 29, 2004 11:20 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Съб Сеп 25, 2004 4:33 pm
Мнения: 273
Местоположение: София
Мнение 
Как да ти кажа... :)
Другия път вземи го напиши с компилатор. Така много ме узорваш.

_________________
Adios
Mozfet


Пет Окт 29, 2004 11:33 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Добре де, ето как работи:
Устроиството си работи в някакъв цикъл...При приемане на някакви пакети или думи по USART, устройството влиза в режим на прекъсване, като проверява първите два байта от пакета съвпадат ли с ID-то на устройството. Ако е получен само един байт по USART, устройството изчаква малко време за втори байт. Ако втория байт е получен, и ID-to съвпада, при следващи прекъсвания на USART всичко получено се записва в кръгов буфер (е, не е точно кръгов)...


Пет Окт 29, 2004 11:41 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Съб Сеп 25, 2004 4:33 pm
Мнения: 273
Местоположение: София
Мнение 
Ами хубаво е първите два байта да ти бъдат preamble bytes т.е. 10101010. След тях не е лошо да имаш и 1 хедър байт: 10101011. И тогава слагаш адреса на търсеното устройство.
Ако ти се занимава можеш да го усложниш, ако прибавиш ACK/NAK request.
Може пък да пробваш с CAN мрежа. Има едни CAN контролерчета, които ти организират пакета, буферите, проверките и т.н. Ти само вкарваш самите данни и ги изкарваш по SPI.

_________________
Adios
Mozfet


Пет Окт 29, 2004 12:51 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
По принцип преамбъла е нещо, което по никакъв начин не може да се срещне в тялото на съобщението. Иначе е безсмислен. В 485 мрежи обикновено се слага 1 dummy байт отпред, за да ти завърти правилно посоката на буферите ( ако не го правиш "ръчно")


Пет Окт 29, 2004 12:56 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Първо отговора после въпроса... Значи тоя протокол дет съм го направил проверява чексумите (в края на пакета), ако са ОК - праща ACK, else, NACK... В началото на пакета имам хедър (т.е. аз наричам ID думата хедър).
Въпроса: Preamble за какво е? Да не за да даде време на приемника да се подготви?


Пет Окт 29, 2004 12:56 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 45 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни