|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 12:09 am
| Автор |
Съобщение |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Стига де, не с такъв снисходителен тон...верно че си по-голям и с повече опит ама...  Шега...утре ще пусна сорса да гледате кви глупости съм писал 
|
| Чет Окт 28, 2004 5:02 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Пък и самият факт, че кода работи без използването на прекъсвания говори достатъчно: така или иначе със сигурност PIC-а приема нещо, със сигурност флага RCIF се вдига //поне така става при тестовете//. Банкирането ми е вред със сигурност, процедурите за push/pop са от стандартен template на MPLAB, използвал съм ги десетки пъти по същия начин. Айде стига съм дрънкал глупости, довечера ако не го подкарам, утре ще паст-на кода
|
| Чет Окт 28, 2004 5:07 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Не се засягай, просто се пошегувах. Всички грешим, а аз вероятно доста повече пъти от тебе.
|
| Чет Окт 28, 2004 5:10 pm |
|
 |
|
forest_gump
Ранг: Професионалист
Регистриран на: Сря Окт 13, 2004 11:24 pm Мнения: 500 Местоположение: Стара Загора
|
|
| Чет Окт 28, 2004 6:18 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 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 |
|
 |
|
Mozfet
Ранг: Ориентиран
Регистриран на: Съб Сеп 25, 2004 4:33 pm Мнения: 273 Местоположение: София
|
Мдаа и аз така 
_________________ Adios
Mozfet
|
| Пет Окт 29, 2004 9:45 am |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 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 |  |  |  |  |
И не се присмивайте много...  Така де, проблема се оказа във влаг CREN (забравям да го вдигна).
|
| Пет Окт 29, 2004 10:54 am |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Няма да го гледам, щом си се оправил - ОК. Черпиш. Между другото, защо не ползваш C ?
|
| Пет Окт 29, 2004 11:15 am |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Ами и аз не знам, почнах го на АСМ, реших така да го напиша...Понеже не съм експерт, а и не съм учил за такъв, кажете си мнението - тежко ли е или е добре като решение...
|
| Пет Окт 29, 2004 11:20 am |
|
 |
|
Mozfet
Ранг: Ориентиран
Регистриран на: Съб Сеп 25, 2004 4:33 pm Мнения: 273 Местоположение: София
|
Как да ти кажа...
Другия път вземи го напиши с компилатор. Така много ме узорваш.
_________________ Adios
Mozfet
|
| Пет Окт 29, 2004 11:33 am |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Добре де, ето как работи:
Устроиството си работи в някакъв цикъл...При приемане на някакви пакети или думи по USART, устройството влиза в режим на прекъсване, като проверява първите два байта от пакета съвпадат ли с ID-то на устройството. Ако е получен само един байт по USART, устройството изчаква малко време за втори байт. Ако втория байт е получен, и ID-to съвпада, при следващи прекъсвания на USART всичко получено се записва в кръгов буфер (е, не е точно кръгов)...
|
| Пет Окт 29, 2004 11:41 am |
|
 |
|
Mozfet
Ранг: Ориентиран
Регистриран на: Съб Сеп 25, 2004 4:33 pm Мнения: 273 Местоположение: София
|
Ами хубаво е първите два байта да ти бъдат preamble bytes т.е. 10101010. След тях не е лошо да имаш и 1 хедър байт: 10101011. И тогава слагаш адреса на търсеното устройство.
Ако ти се занимава можеш да го усложниш, ако прибавиш ACK/NAK request.
Може пък да пробваш с CAN мрежа. Има едни CAN контролерчета, които ти организират пакета, буферите, проверките и т.н. Ти само вкарваш самите данни и ги изкарваш по SPI.
_________________ Adios
Mozfet
|
| Пет Окт 29, 2004 12:51 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
По принцип преамбъла е нещо, което по никакъв начин не може да се срещне в тялото на съобщението. Иначе е безсмислен. В 485 мрежи обикновено се слага 1 dummy байт отпред, за да ти завърти правилно посоката на буферите ( ако не го правиш "ръчно")
|
| Пет Окт 29, 2004 12:56 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Първо отговора после въпроса... Значи тоя протокол дет съм го направил проверява чексумите (в края на пакета), ако са ОК - праща ACK, else, NACK... В началото на пакета имам хедър (т.е. аз наричам ID думата хедър).
Въпроса: Preamble за какво е? Да не за да даде време на приемника да се подготви?
|
| Пет Окт 29, 2004 12:56 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|