Zakladna poziadavka, ktoru som mal, bola, aby Display komunikoval s ladenym uP pomocov jedneho lubovolneho pinu.
Vytvoril som si protokol, ktory:
- komunikuje po jednej zbernici
- rozlisuje instrukcie a data
- Master a Slave na seba cakaju. Asi takym sposobom, ze vysielac vysiela stale do okola jeden Bit, kym prijimac nepotvrdi, ze ho prijal.
Co sa tyka ladenia:
- po instrukcii dbgInfo vypise obsah zakladnych registrov. Tato instrukcia ma varianty pre regitre napr. HL, ako je na screenshote.
- po instrukcii dbgPoint [123] vypise na displeju POINT:123. Teda ked si tak pooznackujem program, vidim, kade prechadza.
Kedze je to obojsmerna zbernica, mozno casom spravim, ze sa bude dat na tychno znackach program pozastavit a zmenit hodnotu registrov, alebo aj meriat cas medzi dvoma pointami. No zatial to nepotrebujem.
Srdieckom je ATTiny24 (DSP je ta ista ako pri predchadzajucom teplomeru). ATTiny inicializuje display a caka na instrukcie. Este podotknem, ze v nom sa konvertuje cislo na retazec. Aby sa v ladiaci uP cim viac odlahcil.
Takze ladeny uP posiela napriklad takuto sekvenciu:
ResetBit <- vynuluje prijimacie registre
InstrukcnyBit <- Bude odoslana instrukcia
Byte "c" <- Zmaze display
InstrukcnyBit <- Bude odoslana dalsia instrukcia
Byte "s" <- Bude odoslany text
Byte ".." <- Data textu
Byte ".." <- Data textu
ResetBit <- Ukoncenie posielanie textu
InstrukcnyBit <- Bude odoslana instrukcia
Byte "l" <- Nastav kurzor na zaciatok..
Byte 0x02 <- .. druheho riadku
InstrukcnyBit <- Nasleduje instrukcia
Byte "h" <- Vypis bytu v Hexe. "b" je binarne a "d' v desiatkovej sustave
Byte 0xXX <- byte, ktory zobrazi
ResetBit
Nahliadnutie do kniznice wBus
Kód: Vybrať všetko
; Procedury / Funkcie
; dbg_Init
; dbg_Reset
; dbg_Instruction
; dbg_Master
; dbg_Decode ( vystup -> dbgFlag : Byte; Alebo aj v Acc )
; dbg_SendByte [Byte]
; dbg_ReceiveByte ( vystup -> Acc : Byte )
; dbg_Control ( pri chybe ukoncuje proceduru RET )
; dbg_Server (pri detekovani instrukcii vola "dbgEvent_Instruction")
; dbg_SendFromFlash ( Z: Adresa Flash )
; Nastavenie Portu a Pinu
;.Equ dbgPin = 0
;.Equ dbgPort= PortB
;.Def dbgFlag= R15
; 0: H/L
; 1: Platne data H/L
; 2: Instrukcia
; 3: Master
; 4: Reset
; 5: Chyba
; Nastavenie rozhrania
.Equ dbgSend_Instruction = 50
.Equ dbgSend_L = 100
.Equ dbgSend_H = 150
.Equ dbgSend_Master = 200
.Equ dbgSend_Reset = 250
.Equ dbgReceive_Instruction = 25
.Equ dbgReceive_L = 75
.Equ dbgReceive_H = 125
.Equ dbgReceive_Master = 175
.Equ dbgReceive_Reset = 225
; Skok na koniec
Rjmp dbg_End
; Zakladne makra pre komunikaciu
; Makro nastavenie portu
.Macro dbg_SetPort
Cbi dbgPort-1 , dbgPin
Cbi dbgPort , dbgPin
.EndMacro
; Urovne
.Macro dbg_L
Sbi dbgPort-1 , dbgPin
.EndMacro
.Macro dbg_H
Cbi dbgPort-1 , dbgPin
.EndMacro
; Cakanie
.Macro dbg_Wait
Nop ; 1Mhz
Nop
Nop
Nop ; 4Mhz
Nop
Nop
Nop
Nop ; 8Mhz
.EndMacro
; Inicializacna procedura
adbg_Init:
dbg_SetPort
Acc [0]
Mov dbgFlag , A
Ret
.Macro dbg_Init
Rcall adbg_Init
.EndMacro
; Odoslanie bitu (parameter je A)
adbg_SendBite:
Mov T , A
; Zistenie stavu zbernice a pockanie, kym sa uvolni
Sbis dbgPort-2, dbgPin
Rjmp adbg_SendBite
; Zbernica je volna. Stiahnutie zbernice na L
dbg_L
; Cakacia slucka, na kolko ma byt zbernica stiahnuta
adbg_SendBite_Loop:
dbg_Wait
Nop
Dec T
Brne adbg_SendBite_Loop
dbg_H
; Cakanie na odozvu
adbg_SendBite_WaitLoop:
dbg_Wait
Dec T
Breq adbg_SendBite
; Zistenie stavu zbernice. Pokracuj ked sa stiahne
Sbic dbgPort-2, dbgPin
Rjmp adbg_SendBite_WaitLoop
; Koniec
;Cbi PortC , 5
Ret
.Macro dbg_SendBite
Rcall adbg_SendBite
.EndMacro
; Prijimanie bitu (parameter je A)
adbg_ReciveBite:
; Zistenie stavu zbernice a pockanie, kym sa uvolni
Sbis dbgPort-2, dbgPin
Rjmp adbg_ReciveBite
; Zbernica je volna. Cakaj na zaciatok
Clr A
adbg_ReciveBite_WaitLoop:
Sbic dbgPort-2, dbgPin
Rjmp adbg_ReciveBite_WaitLoop
; Cakacia slucka, na kolko je zbernica stiahnuta
adbg_ReciveBite_Loop:
dbg_Wait
Inc A
Sbis dbgPort-2, dbgPin
Rjmp adbg_ReciveBite_Loop
; Odozva
dbg_Wait
dbg_Wait
dbg_L
dbg_Wait
dbg_Wait
dbg_Wait
dbg_H
; Koniec
Ret
.Macro dbg_ReciveBite
Rcall adbg_ReciveBite
.EndMacro
; Komunikacia
; Reset
.Macro dbg_Reset
Acc [dbgSend_Reset]
Rcall adbg_SendBite
.EndMacro
; Instrukcia
.Macro dbg_Instruction
Acc [dbgSend_Instruction]
Rcall adbg_SendBite
.EndMacro
; Master
.Macro dbg_Master
Acc [dbgSend_Master]
Rcall adbg_SendBite
.EndMacro
; Dekodovanie
adbg_Decode:
; nacitanie bitu
Rcall adbg_ReciveBite
; Rozdelenie
Cpi A , dbgReceive_Reset
Brsh adbg_Decode_Reset
Cpi A , dbgReceive_Master
Brsh adbg_Decode_Master
Cpi A , dbgReceive_H
Brsh adbg_Decode_H
Cpi A , dbgReceive_L
Brsh adbg_Decode_L
Cpi A , dbgReceive_Instruction
Brsh adbg_Decode_Instruction
; Ak je imulz prilis kratky. Priznak chyby
Acc [0b00100000]
Mov dbgFlag , A
Ret
; Reset
adbg_Decode_Reset:
Acc [0b00010000]
Mov dbgFlag , A
; Reset
; Rcall dbgEvent_Reset
Ret
; Master
adbg_Decode_Master:
Mov A , dbgFlag
Andi A , 0b00001100
Ori A , 0b00001000
Mov dbgFlag , A
Ret
; Instruction
adbg_Decode_Instruction:
Mov A , dbgFlag
Andi A , 0b00001100
Ori A , 0b00000100
Mov dbgFlag , A
Ret
; Uroven L/H
adbg_Decode_L:
Mov A , dbgFlag
Andi A , 0b00001110
Ori A , 0b00000010
Mov dbgFlag , A
Ret
adbg_Decode_H:
Mov A , dbgFlag
Andi A , 0b00001111
Ori A , 0b00000011
Mov dbgFlag , A
Ret
.Macro dbg_Decode
Rcall adbg_Decode
.EndMacro
; Odoslanie Bytu
adbg_SendByte:
; Ulozenie bytu
Push A
Push B
Push T
Mov B , A
Ldi T , 8
; Cyklus
adbg_SendByte_Loop:
Acc [dbgSend_H]
Sbrs B , 7
Acc [dbgSend_L]
; Odoslanie bitu
Push T
dbg_SendBite
Pop T
; Posuv bitov
Lsl B
; Pocet odoslanich bitov
Dec T
Brne adbg_SendByte_Loop
; Vytiahnutie
Pop T
Pop B
Pop A
Ret
.Macro dbg_SendByte
Rcall adbg_SendByte
.EndMacro
.Macro dbg_SendByte_i
Acc [@0]
Rcall adbg_SendByte
.EndMacro
; Prijem bytu
adbg_ReceiveByte:
Push B
Push T
Ldi T , 8
; Slucka nacitavania
adbg_ReceiveByte_Loop:
; Nacitanie bytu
Push B
Push T
dbg_Decode
Pop T
Pop B
; Zistenie stavu reset
Sbrc A , 4
Rjmp adbg_ReceiveByte_End
; Ak bit nieje H/L
Sbrs A , 1
Rjmp adbg_ReceiveByte_Error
; Precitany byte:
Lsl B
Bst A , 0
Bld B , 0
; Dlzka citania bitov
Dec T
Brne adbg_ReceiveByte_Loop
; Koniec slucky
Mov A , B
adbg_ReceiveByte_End:
Pop T
Pop B
Ret
; Chyba pri citani
adbg_ReceiveByte_Error:
Acc [0b00100000]
Mov dbgFlag , A
Rjmp adbg_ReceiveByte_End
.Macro dbg_ReceiveByte
RCall adbg_ReceiveByte
.EndMacro