Pomocnik pri ladeni AVR

Môj výrobok - MINI

Moderátori: psichac, Moderátori

wwlado

Pomocnik pri ladeni AVR

Príspevok od používateľa wwlado » 04 Feb 2014, 00:31

Casto som sa dostal do situacie, ked som sa nemohol pohnut v programovani. Proste som nemohol zistit, kde to v programe viazne. Kedze nemam take vybavenie ako Jaro, ze si moze ladit uP pocas jazdy, rozhodol som sa tuto situaciu riesit po svojom. 8O
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
Prílohy
snímkadbg.png
1391470327794.jpg
IMG_20140204_003417.jpg

Používateľov profilový obrázok
BFX
Ultimate člen
Ultimate člen
Príspevky: 2506
Dátum registrácie: 04 Sep 2013, 19:41
Bydlisko: Košice
Vek: 50

Re: Pomocnik pri ladeni AVR

Príspevok od používateľa BFX » 04 Feb 2014, 00:40

A stalo ti to za tu namahu?
Alebo si kupit za par eurikov debuger? hej viem nechcelo sa ti cakat :)
Ale inak snaha sa ceni takze .... hadaj
0
“Nice looking” circuit construction doesn't always equate to good circuit performance.
http://www.arrl.org/files/file/Product% ... pter_1.pdf
Na predaj: p-bfx-predava-kto-zavaha-prerobi-t41148.html

Používateľov profilový obrázok
dxr
Ultimate člen
Ultimate člen
Príspevky: 3968
Dátum registrácie: 05 Aug 2013, 20:21
Bydlisko: V strede nicoho
Kontaktovať používateľa:

Re: Pomocnik pri ladeni AVR

Príspevok od používateľa dxr » 04 Feb 2014, 00:46

projekt je pekny len nechapem jednuvec nepotrebujes kupovat nic len sa naucit pouzivat
emulator kedze pises asm tak ti staci hocijaky avr gdb a ides po instrukciach step/step ;)
cize si naistaluj zase dalsi balicek ;)
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

wwlado

Re: Pomocnik pri ladeni AVR

Príspevok od používateľa wwlado » 04 Feb 2014, 06:41

A kde napojim periferie v simulatore? Napriklad konkretne teraz, som chcel zistit kod od stareho dialkoveho ovladania. Ci je to RC5, alebo nieco ine. Mam s nim nejake plany, tak uz chcem program "nasit" rovno na neho.
Viem, za sa nieje cim chvalit, nieje to ic vynimocne. To som dal len kvoli inspiracii. :idea:

Jasne, ze to stalo zato. Nechapem, ze ma to nenapadlo este v zaciatkoch programovania. :-)

Používateľov profilový obrázok
dxr
Ultimate člen
Ultimate člen
Príspevky: 3968
Dátum registrácie: 05 Aug 2013, 20:21
Bydlisko: V strede nicoho
Kontaktovať používateľa:

Re: Pomocnik pri ladeni AVR

Príspevok od používateľa dxr » 04 Feb 2014, 08:37

To aky je to IR protokol zistis stym tvojim Logic/Osciloscopom pre dos nie :)?
pozres ako vyzeraju priebehy a rozhodnes kazdy znich je specificky respektive ma presne dlzky impulzu

Inak su aj simulatory ktore simuluju periferie alebo aj LCD akurat neviem ci pre linux ktory pouzivas
ale pokial rad debugujes na realnom HW je lepsie investovat aspon do ICE JTAGu pripadne Dragona
lebo tymto na to casom dojdes si prasacis kod ale lepsie mat to co si spravil ako vestecku gulu :)

inak ja som ti to pochvalil ale si uz ako linka vo VW kazdy tyzden pustis nejake zariadenie akurat
tam to bolo 1-3minuty auto :)
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: Pomocnik pri ladeni AVR

Príspevok od používateľa jaromir » 04 Feb 2014, 11:53

wwlado: nechcem aby to znelo ako urazka, ale dakujem za exkurz ho praveku mikrokontrolerovej techniky :)

Ano, toto je jedna z metod ako to robit, ked clovek nema hardwarovy debugger (in circuit debugger, moznych nazvov je viacero), ale ten je IMHO pre vyvoj omoho lepsi nez toto... pracovat bez debuggeru je pre mna ako keby mi niekto odeskol ruku. V sucasnosti su uz debuggery velmi lacne (pickit, dragon).
Je pravda, ze ladiace vypisy (bud klasicky cez USART na terminal alebo toto tu) su obcas nenahraditelne, stale vsak plati, ze viac sa da urobit s plnohodnotym debuggerom nez s takouto nahradou.

Ale inak pekne cvicenie, mne sa to paci.
Ak chces lepsie cvicenie, urob si skutocny debugger :) Popis JTAG rozhrania pre AVR-ka je ciastocne reverznuty http://mirror.lihnidos.org/GNU/savannah ... ation.html
Ja som reverzol protokol pre PIC18 a urobil debugger pren, bola to velka zabava http://jaromir.xf.cz/hdeb/bdm/bdm.html
0

wwlado

Re: Pomocnik pri ladeni AVR

Príspevok od používateľa wwlado » 04 Feb 2014, 14:12

Jaro. Pointa toho celeho je, ze nemusis pouzivat USART, ani I2C. Ide o jednoduchu zbernicu, ktora sa moze nakodit na lubovolny PIN. Kedze uz pouzivam aj Tiny9,10 a je zname ze "Tiny10 itself does NOT have a debugging interface", zda sa mi, ze mi moj pripravok viac pomoze, ako nieco ine.

Akurat aj kvoli tej Tiny9 som to vymyslel. Ani nie tak ladenie, ako prenosovu zbernicu. Totiz planujem v buducnosti pouzivat Tiny9 ako dvoj-bitovu periferiu. Konkretne chcem v lete trosku tunit Auto a po jednej zbernici chcem ovladat rele na roznych miestach aj so statusom. Ci uz odberu, alebo zopnutia. Nieco take ako predstavovany palubny pocitac, ale skor by som sa zameral na ineveci.
nak ja som ti to pochvalil ale si uz ako linka vo VW kazdy tyzden pustis nejake zariadenie akurat
tam to bolo 1-3minuty auto :)

Kazdy vecer, ked maly zaspi, tak si citam knihy. No niekedy vskriesne myslienka a neviem jej odolat. Proste to musim spravit. Ked si zmenim ww na vw, aj mne to tak budu vyrobky vychadzat. :-)

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok