logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[asm] STK500 + ATmega8515l problem z programowaniem

mistrz173 14 Sty 2011 14:21 1950 21
  • #1 9004458
    mistrz173
    Poziom 12  
    Siemka, mam płytkę STK500 do tego atmega która była w zestawie i mam problem z programowaniem, albo jestem zbyt cienki aby to wszystko odpowiednio podłączyć. Na początku chyba działał oryginalny program wgrany w uC, kiedy go zgrałem na dysk i wgrałem własny program wszystkie diody led się zapaliły, i tak dalej zostają, nawet jak wgrałem oryginalny program.
    mor program wygląda tak:
    .nolist
    .include "m8515def.inc" 
    .list 
    .listmac 
    
    ldi r16, 0xFF
    out DDRB, R16
    clr R17
    Main: 
    out PINB, R17
    nop
    inc R17
    nop
    nop
    rjmp Main ; 
    .exit

    Proszę o pomoc
  • #3 9006501
    mistrz173
    Poziom 12  
    .nolist
    .include "m8515def.inc" 
    .list 
    .listmac 
    
    ldi r16, 0xFF
    ldi r22, 0xFF
    out DDRB, R16
    clr R17
    Main: 
    inc r17
    out PORTB, R17
    clr R0
    Wait1:
    nop
    nop
    nop
    inc R0
    nop
    nop
    nop
    cpse R0, R22
    rjmp Wait1 ;
    nop
    nop
    clr R0
    Wait2:
    nop
    nop
    nop
    inc R0
    nop
    nop
    nop
    cpse R0, R22
    rjmp Wait2 ;
    nop
    clr R0
    Wait3:
    nop
    nop
    nop
    inc R0
    nop
    nop
    nop
    cpse R0, R22
    rjmp Wait3 ;
    nop
    nop
    rjmp Main ; 
    .exit

    zmieniłem na coś takiego, czy dobrze to zrobiłem?
  • #4 9007303
    LordBlick
    VIP Zasłużony dla elektroda
    Wrzuć do µC to się dowiesz... Jak chcesz dłuższe "nic nie robienie" :P, to jedną pętlę zagnieźdź w drugiej z różnymi rejestrami.
  • #5 9007565
    asembler
    Poziom 32  
    [quote="Light-I"]
    mistrz173 napisał:
    [code]2. Nawet jak uwzględnisz mój p. 1. to i tak nie zobaczysz tych zmian, bo są za szybko. Potrzebne jest jakieś opóźnienie w tej pętli, lub użycie timera

    Zobaczy zmianę w postaci zmiejszonej jasnosci świecenia diody.
    Bedą 3 stany Light-1 Light-0 i Light 0.5
  • #6 9008273
    mistrz173
    Poziom 12  
    .nolist
    .include "m8515def.inc" 
    .list 
    .listmac 
    
    ldi r16, 0xFF
    ldi r22, 0xFF
    out DDRB, R16
    clr R17
    Main: 
    inc r17
    out PORTB, R17
    clr R0
    Wait1:
    inc R0
    clr R1
    	Wait2:
    	inc R1
    	clr R3
    		Wait3:
    		inc R2
    	
    		cpse R2, R22
    		rjmp Wait3 ;
    	cpse R1, R22
    	rjmp Wait2 ;
    cpse R0, R22
    rjmp Wait1 ;
    
    
    rjmp Main ; 
    .exit
    

    wgrałem coś takiego, i dalej palą się wszystkie diody.
    Może uC jest zepsuty?
    Zauważyłem też, że jak czyszczę uC(erase) diody gasną, a jak daję "program" to się wszystkie zapalają.
  • #7 9008466
    asembler
    Poziom 32  
    Napisz cos takiego
    
    
    MAIN   LD R17,$FF
              OUT PORTB,R17
              CALL DELAY
              LD R17,0
              OUT POTB,R17
              CALL DELAY
              JR MAIN
    

    I koniecznie podłącz diodę do portu B . a nie do D.
  • #8 9008569
    mistrz173
    Poziom 12  
    Spróbowałem to z assemblować i wyskakiwały błędy.
    Diody są podpięte do portu B
  • #10 9010288
    asembler
    Poziom 32  
    dory zapomniałem sie.
    
    MAIN   LDI R17,$FF 
              OUT PORTB,R17 
              CALL DELAY 
              LDI R17,0 
              OUT PORTB,R17 
              CALL DELAY 
              RJMP MAIN 
    
    DELAY  ;;PROCERURKĘ WPISZ
               RET
    
    


    Ale skoro ty nie znasz mnemoników ASM to raczej nie wróże ale próbuj.

    Dodano po 1 [minuty]:

    tam jeszcze dwukropki po etykietach bo niektóre kompilatory się drą.

    Dodano po 4 [minuty]:

    Z jeszcze innej strony to ja do testowania portu za pomocą LED podpinam dwie diody przeciwsobnie i nie musze wtedy dawac żadnego opóźnienia.
    Jak się swiecą obydwie znaczy że jest przebieg prostokątny.
  • #11 9010518
    mistrz173
    Poziom 12  
    Diody nadal się palą cały czas, może to wina uszkodzonego uC?
  • #12 9010544
    asembler
    Poziom 32  
    Piszesz ze dalej swiecą a nie dasz poprawionego kodu a może schemacik?

    Dodano po 3 [minuty]:

    Spróbuj z portem D
  • #13 9010777
    mistrz173
    Poziom 12  
    Probowałem z tymi portami, i tylko zmienia się podłączenie. schemat??? to jest oryginalna płyta STK500 od atmela!!!
    Dałem program od Light-I`a , i dalej żadnych zmian.
  • #14 9010786
    LordBlick
    VIP Zasłużony dla elektroda
    Możecie sobie tu call(niedostępny w tym µC)/rcall uprawiać do białego rana - tak nie zadziała bez inicjalizacji stosu na początku... Kod, który podałem wcześniej nie zadziała(brak inicjacji bLedFlashWait, przed inicjacją timera musi być sei), mimo wszystko warto o co biega sprawdzić w nocie katalogowej.
    mistrz173 napisał:
    Dałem program od Light-I`a , i dalej żadnych zmian.
    Pracuję nad tym. Przy okazji pokaż jak są ustawione fusebity.
    EDIT: Wobec kodu skleconego z różnych moich procedur należało zastosować poprawki, więc i treść tego wpisu uaktualniono.
  • #16 9010883
    asembler
    Poziom 32  
    U mnie CALL oznacza rcall.
    A tak po drugie to on chce sprawdzic czy programator programuje więc nie musi miec zadnego programu. Wystarczy ze zapisze do procesora a potem odczyta i zobaczy co sie zapisało. Ja bym to w pierwszej kolejnosci zrobił.
  • #17 9011070
    LordBlick
    VIP Zasłużony dla elektroda
    mistrz173 napisał:
    A czego miałem szukać w nocie katalogowej?
    Ewentualnych odpowiedzi na ewentualne pytania dotyczące kodu...
    asembler napisał:
    U mnie CALL oznacza rcall.
    OK, ale i tak bez ustawienia wskaźnika stosu się nie obędzie.
    Oto poprawna i sprawdzona wersja na timerze :
    #define F_CPU	1000000
    .nolist
    #include <m8515def.inc> ; Prohibits use of non-implemented instructions (ATmega8515)
    .list
    .dseg
    .org SRAM_START
    .cseg
    ;————————————————————————————————————————————————————————————
    .org	0x0000 ; Reset Handle
    	rjmp RESET
    .org    OC0addr ; Output Compare0 Interrupt Handle (Timer/Counter0 Compare Match)
    	rjmp TIMER0_COMP
    ;————————————————————————————————————————————————————————————
    	#define LED_PORT	PORTB
    	#define Trise		0x07 // ((1<<(CS02|12|22))||(1<<(CS01|11|21))||(1<<(CS00|10|20)))
    	#define Tfall		0x06
    	#define Tdiv1024	0x05
    	#define Tdiv256		0x04
    	#define Tdiv64		0x03
    	#define Tdiv8		0x02
    	#define Tdiv1		0x01
    	#define Tstop		0x00
    	#define usDiv		1000000	// microsecond divisor
    	#define msDiv		1000	// milisecond divisor
    #define T0div		Tdiv64
    #define T0Tick		1
    #define T0TickDiv	msDiv // usDiv or msDiv
    	#if (T0div==Tdiv1024)
    		#define T0Scale	1024
    	#elif (T0div==Tdiv256)
    		#define T0Scale	256
    	#elif (T0div==Tdiv64)
    		#define T0Scale	64
    	#elif (T0div==Tdiv8)
    		#define T0Scale	8
    	#elif (T0div==Tdiv1)
    		#define T0Scale	1
    	#endif
    	#define T0ctc1	(T0Tick*F_CPU)
    	#define T0ctc2	(T0TickDiv*T0Scale)
    	#define T0ctc	(T0ctc1/T0ctc2)
    	#define CNT0_MD_NORMAL			0
    	#define CNT0_MD_PWMPC	1<<WGM00
    	#define CNT0_MD_CTC					1<<WGM01
    	#define CNT0_MD_FAST_PWM			(1<<WGM00|1<<WGM01)
    	#define CNT0_OUTMD_DISCONECTED						0
    	#define CNT0_OUTMD_CTC_CMTOGGLE						1<<COM00
    	#define CNT0_OUTMD_CTC_CMCLR						1<<COM01
    	#define CNT0_OUTMD_PWMF_CMCLR_TOPSET				CNT0_OUTMD_CTC_CMCLR
    	#define CNT0_OUTMD_PWMPC_UPCNT_CMCLR_DWNCNT_CMSET	CNT0_OUTMD_CTC_CMCLR
    	#define CNT0_OUTMD_CTC_CMSET						(1<<COM00|1<<COM01)
    	#define CNT0_OUTMD_PWMF_CMSET_TOPCLR				CNT0_OUTMD_CTC_CMSET
    	#define CNT0_OUTMD_PWMPC_UPCNT_CMSET_DWNCNT_CMCLR	CNT0_OUTMD_CTC_CMSET
    	#define TIMER0_WAIT_TIME_US(us) (us/T0Tick)
    	#define TIMER0_WAIT_TIME_MS(ms) (ms*T0TickDiv/(T0Tick*msDiv))
    #define LED_DELAY_MS		500
    // Regdef
    #define	isSREG		r2
    #define	AllUps			r11
    #define	TrueOrOne		r12
    #define	FalseOrZero		r13
    #define	TempA			r16
    #define	TempB			r17
    #define	TempI			r18
    #define	DataAcc			r19
    #define	DwL				r24
    #define	DwH				r25
    #define	True		TrueOrOne
    #define	One			TrueOrOne
    #define	False		FalseOrZero
    #define	Zero		FalseOrZero
    #define	Full		AllUps
    #define X x
    #define Y y
    #define Z z
    ;---------------------------
    #define LOW low
    #define HIGH high
    #define TRUE	0x01
    #define FALSE	0x00
    .macro InitFastAccessRegs
    	clr FalseOrZero ; fast Access Bool logic FALSE register
    	ser TempA
    	mov AllUps, TempA ; fast Access all bit set register
    	andi TempA, TRUE
    	mov TrueOrOne, TempA ; fast Access Bool logic TRUE register
    .endmacro
    .macro ldi_DwLH_Timer0_ms
    	ldi DwL, low(TIMER0_WAIT_TIME_MS(@0))
    	ldi DwH, high(TIMER0_WAIT_TIME_MS(@0))
    .endmacro
    .macro sts_DwLH
    	sts @0, DwL
    	sts (@0+1), DwH
    .endmacro
    .dseg
    cLedFlashDelay:
    .byte 0x02
    bLedFlashWait:
    .byte 0x01
    .cseg
    ;---------------------------
    .macro	cLedFlashDelayDecr
    	lds TempI, cLedFlashDelay
    	tst TempI
    	breq LedFlashCntDecHi
    	dec TempI
    	sts cLedFlashDelay, TempI
    	rjmp cLedFlashDelayEnd
    LedFlashCntDecHi:
    	lds TempI, cLedFlashDelay+1
    	tst TempI
    	breq cLedFlashDelay0
    	dec TempI
    	sts cLedFlashDelay+1, TempI
    	sts cLedFlashDelay, Full
    	rjmp cLedFlashDelayEnd
    cLedFlashDelay0:
    	sts bLedFlashWait, False
    cLedFlashDelayEnd:
    .endmacro
    ;————————————————————————————————————————
    LedFlash_Up:
    	out LED_PORT, Zero
    	out LED_PORT-1, Full
    	rjmp LEDBlRestart
    ;————————————————————————————————————————
    LEDBlink:
    	lds DataAcc, bLedFlashWait
    	sbrc DataAcc, log2(TRUE)
    	ret
    ;----------------------------------------
    LEDBlGo:
    	in DataAcc, LED_PORT
    	inc DataAcc
    	out LED_PORT, DataAcc
    LEDBlRestart:
    	ldi_DwLH_Timer0_ms (LED_DELAY_MS)
    	sts_DwLH cLedFlashDelay
    	sts bLedFlashWait, True
    	ret
    ;------------------------------------------------------------------------------
    Timer0_Up:
    ;Set timer0 running
    	ldi	TempA, (CNT0_MD_CTC|CNT0_OUTMD_DISCONECTED|T0div)
    	out	TCCR0, TempA	;Set the prescaler and Counter Mode
    	out	TCNT0, Zero
    	ldi	TempA, low(T0ctc) ; Defined reload value
    	out	OCR0, TempA
    	ldi TempA, (1<<OCF0)
    	out TIFR, TempA ; Clear pending interrupt
    	in	TempA, TIMSK
    	sbr TempA, (1<<OCIE0)
    	out TIMSK, TempA ; Enable Timer/Counter0 Interrupts
    	ret
    ;------------------------------------------------------------------------------
    TIMER0_COMP:
    	in isSREG, SREG		;save SREG
    ;********************************************************
    	cLedFlashDelayDecr
    ;********************************************************
    ; end service of Timer0 CTC
    T0CtcEnd:
    	out SREG, isSREG		;restore SREG
    	reti
    ;------------------------------------------------------------------------------
    RESET:
    ;Proc InitStack()
    InitStack:
    .ifdef SPH
    	ldi TempA, HIGH(RAMEND)
    	out SPH, TempA
    .endif
    	ldi TempA, LOW(RAMEND)
    	out SPL, TempA
    	InitFastAccessRegs
    ;---------------------------
    	rcall LedFlash_Up
    	sei
    	rcall Timer0_Up
    MainLoop:
    	rcall LEDBlink
    	rjmp MainLoop
    Tu wpisujesz rzeczywistą prędkość zegara systemowego:
    #define F_CPU   1000000
    Tu właściwy port:
    	#define LED_PORT	PORTB
    A tutaj czas pomiędzy zmianami w milisekundach:
    #define LED_DELAY_MS		500
    
    Miłej zabawy... ;)
  • #18 9014568
    mistrz173
    Poziom 12  
    Thx Light-I, twoja wersja działa, mam tylko pytanie dlaczego moja nie działa?
    Moja pętla daje mi opóźnienie wystarczające abym zobaczył miganie diody, a te tylko się świecą.
    Zmieniłem program na taki
    .nolist
    .include "m8515def.inc" 
    .list 
    .listmac 
    Main:
    ldi r16, 0b01010101
    ldi r22, 0xFF
    out DDRB, R16
    clr R17
    out PINB, R16
    out PORTB, R16
    rjmp Main
    
    .exit
    

    I dalej nic:cry:, nie wiem już co mam robić.
  • #19 9014610
    asembler
    Poziom 32  
    Bo robisz byki chyba w ogole nie czujesz co robisz. Na macanego todo kurnika.
    OUT DDRB,R22 chyba chciałes powiedzic
    potem clr r16 zamiast clr r17
    a out ddrb to na nie wiem co poeta miał na myśli.
    A tak nawiasem mówiąc gdzie jest moderator gdyż temat postu w ogóle jest nieodpowiedni.
  • #20 9015685
    LordBlick
    VIP Zasłużony dla elektroda
    mistrz173 napisał:
    Thx Light-I, twoja wersja działa, mam tylko pytanie dlaczego moja nie działa?
    Bo brak Tobie cierpliwości... Jeśli chcesz pisać w asemblerze, to przede wszystkim obowiązkową lekturą jest nota katalogowa :
    http://www.atmel.com/dyn/resources/prod_documents/doc2512.pdf
    Jak już się zapoznasz, to możemy kontynuować...
    Skoro mój program działa, to się wysil i spróbuj go przeanalizować. Jak będziesz wiedział jak on działa, to będziesz w stanie napisać własny. W asemblerze wszystko jest ważne, nawet kolejność rozkazów procesora.
  • #21 9025681
    wesol144
    Poziom 10  
    Jeśli mówisz, że masz opóźnienie to je wstaw.

    A w komentarzach ci napiszę co się z czym je.
    
    
    .nolist
    .include "m8515def.inc"
    .list
    .listmac
    .cseg                    // doczytaj o tym
    .org 0x00
    	rjmp start
    .org 0x30
    
    
    start:
    ldi r16, 0xFF
    out DDRB, r16 // ustaw wszystkie piny portu B jako wyjścia
    Main:
    com r16        //negacja bitowa
    out PORTB, r16 //diody zapala się stanem niskim
    call DELAY // tu musisz dać petle opozniajaca albo podprogram
    rjmp Main
    
     


    Możliwości na napisanie takiego programu jest naprawdę baaaardzo dużo wszystko zależy od inwencji.

    A jeśli naprawdę chcesz się zająć mikrokontrolerami to polecam "Mikrokontrolery AVR w praktyce" Dolińskiego. Wystarczy poszukać.
  • #22 9027501
    mistrz173
    Poziom 12  
    Spoko, dzięki za odpowiedź, Zaopatrzyłem się w książkę Mikrokontrolery avr atmega w praktyce baranowskiego
REKLAMA