Hursomhelst så försöker jag programmera några avr:er och till att börja med verkar det gå fint. Programmet snurrar fint både i AVRStudio och i mikrokontrollern. MEN när jag bryter matningsspänningen så tappar avr:n minnet / bootar inte upp som den ska. Efter ny programladdning till flashen snurrar den igen. Rent spontant känns det som något problem med initieringsprocessen.. reset/klocka/uppstartstid etc. Jag har försökt med ett flertal inställningar för klockan men verkar inte spela någon roll vilka fuses jag använder. (Har testat intern RC-oscillator 8 resp 4MHz både med och utan ckdiv8 samt extern kristall 10MHz) Brown-out har jag dissablat.
Inte ens en delay på 14ck+65ms efter reset verkar ge något resultat. På reset har jag 10k pull-up till vdd. Diod mellan reset och vdd samt 100nF keramisk från reset till gnd. Kontrollerade dock resetpinnen med oscilloscope och jag får en lika lång resetsignal under en "normal uppstart" som vid programmering så reset kan jag nog trots allt utesluta. Vdd (5V) har en stigtid på 250us och är stabilt reglerad utan några spänningsdippar så den borde inte heller orsaka problem tycker jag. Det underliga är att det är fler än en krets som beter sig så här. Jag har provat ett flertal ATtiny2313 och även några ATMega88:or (från flera batcher) samma fel med alla så alltså är det jag som gör något fel Har även provat programmera direkt via parallellport och ponyprog men samma problem som när jag kör med min AVRISP mkII i AVRstudio. Skulle kunna prova att ladda in något annat program (exempelvis bara sätta en utgång) och se om det blir likadant men får göra det efter helgen om jag inte fått några idéer här först.
Jag har aldrig stött på dom här problemen tidigare men var visserligen ett tag sedan jag höll på med avr senast så jag har kanske skrivit nåt fel i koden vid initieringen?? Bifogar den nedan så kan ni säga vad ni tror. /Oscar
Kod: Markera allt
;##############################################################
;# Time delay ATtiny2313 #
;##############################################################
.include "tn2313def.inc"
.def trigg=r20 ;Ingång för extern trigg
.equ timer_value=0x0000 ;0xD8EF ;Konstant för tidsberäkning i Timer1 =>
;Tid för interupt=(1/(frekvens/prescal))*(FFFF-timer_value)
.org 0x0000 ;Adressvektor för reset
rjmp reset ;Hoppa till reset
.org 0x001A ;Adressvektor för Timer1_ovf
rjmp Timer1_ovf ;Hoppa till Timer1_ovf
reset:
ldi r16, low(RAMEND) ;Nollställer stackpekaren
out SPL, r16 ;
;ldi r16, high(RAMEND) ;Finns ej i ATtiny2313 då ATtiny2313 har liten stack
;out SPH, r16 ;
ser r16
out ddrd,r16 ;PortD definierad som utgång
out portd,r16 ;PortD hög dvs. kontaktor av.
cbi ddrb,0 ;PB0 ingång för triggsignal
rcall timerinit ;Ladda in timervärden
sei ;Enablar globala interupt
rjmp main ;Hoppa till main och invänta interupt samt triggsignal
;##############################################################
;# Initierar timer1 #
;##############################################################
timerinit:
ldi r16,0b10000000 ;Laddar TIMSK med owerflow-interupt enable (TOIE1)
out TIMSK,r16 ; (Använd sts istället för out för ATmega)
ldi r16,high(timer_value) ;Laddar hög tid för interupt/timer
out TCNT1H,r16 ; (Använd sts istället för out för ATmega)
ldi r16,low(timer_value) ;Laddar låg tid för interupt/timer
out TCNT1L,r16 ; (Använd sts istället för out för ATmega)
ldi r16,0b00000001 ;Delar ner den interna klockan med 1 dvs. ingen prescale
out TCCR1B,r16 ; (Använd sts istället för out för ATmega)
ret ;Return
;##############################################################
;# Här börjar Timer-interuptet #
;##############################################################
Timer1_ovf:
cli ;disablar globala interupt
inc r17 ;r17=r17+1
rcall timerinit ;Ladda in timervärden
sei ;Enablar globala interupt
reti ;Return from interupt
;###############################################################
;###############################################################
;######## ########
;######## Huvudprogram/MAIN ########
;######## ########
;###############################################################
main:
ser r16
out portd,r16 ;PortD hög dvs. kontaktor av.
in trigg,pinb
andi trigg,1
cpi trigg,1
breq start
rjmp main
start:
clr r17
wait:
cpi r17,0x0F ;1s
brsh kontaktor_on
rjmp wait ;Loopa i wait tills delaytiden gått
kontaktor_on:
cbi portd,0 ;PD0 låg dvs. kontaktor till.
; clr r17
wait2:
in trigg,pinb
andi trigg,1
cpi trigg,0
breq tbx
rjmp wait2 ;Loopa i wait2 tills trigg=0
tbx: ;Undvik kontaktstuds vid tillbakagång till main då trigg fortfarande är hög
clr r17
tbx2:
cpi r17,0x0F ; 1s
brsh tbx3
rjmp tbx2
tbx3:
rjmp main
;###############################################################
;#### END ####
;###############################################################