AVR (ATtiny2313 tappar minnet) -hjälp! *LÖST*

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Oscar
Inlägg: 29
Blev medlem: 12 april 2005, 23:16:49
Ort: Finnerödja

AVR (ATtiny2313 tappar minnet) -hjälp! *LÖST*

Inlägg av Oscar »

Har ett problem som jag inte hittat någon lösning på, troligtvis är det något jag inte fattar :doubt:
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 :vissla: 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                                ####
;###############################################################
Senast redigerad av Oscar 17 maj 2010, 16:22:07, redigerad totalt 1 gång.
Användarvisningsbild
jesse
Inlägg: 9235
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: AVR (ATtiny2313 tappar minnet) -hjälp!

Inlägg av jesse »

snyggt kommenterat program och ett mystiskt problem!

I interrupten kan du skippa cli och sei: cli utförs automatiskt då ett interrupt utlöses. sei är inbyggt i "reti".

Jag hittar inget i programmet som kan bli "konstigt" vid annan uppstart.
Hur är utgångarna på portD när "det inte fungerar"? Är det hög impedans (ingångar) eller är det logisk nivå ut?

Om det är hög impedans verkar det som det är nåt fel i uppstarten i hårdvaran - alltså inget fel i själva programmet. Men om PORTD t.ex. blir "etta" ut så kan man förutsätta att programmet gick igång, och då är frågan varför det inte fungerar senare.

Jag skulle också gjort som du redan tänkt göra: typ ett par rader som bara sätter en utgång för att se om det fungerar.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4699
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: AVR (ATtiny2313 tappar minnet) -hjälp!

Inlägg av Swech »

Du har inget som sparar dina register i ingången av interrupten. Inte heller statusflaggorna sparas.
Det är som att ha en gigantisk bugg i programmet som kan slå till när som helst

Ett interrupt kan ske när som helst.
När som helst tillåter du att interruptprogrammet ändrar R16,R17 samt statusflaggor helt utan att huvudprogrammet har en aning om det.

Du bör inte använda dig av ett register för att flagga mellan interrupt och huvudprogram.
Ta en ramcell istället.

Swech
Användarvisningsbild
jesse
Inlägg: 9235
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: AVR (ATtiny2313 tappar minnet) -hjälp!

Inlägg av jesse »

Visst ja! :doh:
Jag har skrivit i C det senaste halvåret så jag glömde helt att det behövs pop och push i interruptet.
Det kan ju skapa hur mycket fel som helst, och "mystiska" fel dessutom.

Men visst kan man använda ett register som "flagga" mellan interrupt och main - bara man ser till att komma ihåg att detta är en global variabel som aldrig får användas till något annat så är det OK.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: AVR (ATtiny2313 tappar minnet) -hjälp!

Inlägg av Micke_s »

Du kan ju använda ett oanvänt hårdvaruregister för köra flagga också. Känns bättre än använda ett processorregister.
Då kan du ändra biten med sbi, cbi i en klockcykel.
Användarvisningsbild
Icecap
Inlägg: 26194
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: AVR (ATtiny2313 tappar minnet) -hjälp!

Inlägg av Icecap »

Att det finns buggar och konstigheter i programmet får vara men jag tror inte ett ögonblick på att programmet inte finns i kretsen efter power-down! Det är hårdvaran som fallerar, mest sannolikt reset-problem.

Det fungerar med programmeringen inkopplat och inte utan den så är det inte ett reset-problem är det någon pinne som inte kommer i rätt läge.

Ifs. kan det ju vara något totalt idiotisk men att programmet körs ifrån RAM för att något direktiv är fel men jag anar inte om man kan ställa RAM via ICSP på dessa kretsar.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4699
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: AVR (ATtiny2313 tappar minnet) -hjälp!

Inlägg av Swech »

Om han rättar till problemet i mjukvaran så kommer säkerligen hårdvaran att funka också.
Det är iallafall den änden han skall börja leta i.
Har man interruptrutiner som inte sparar statusflaggorna så blir det hur tokigt som helst.

Med avr programmeraren får han 2 reset vid spänningspåslag.
Utan programmerare endast 1 reset.
Som programmet fungerar så kan det mycket väl falla ur sync på grund av felen i den men det
kan eventuellt fungera om det kommer ytterligare en reset som han får via programmeraren.

Så.. fixa mjukvaran först, därefter felsöker vi hårdvaran.
Att programmet skulle förvinna tror jag inte heller på, men symptomen kan vara sådana
att man tror det....

Swech

P.s AVR kan inte köras från RAM, endast Flash
Oscar
Inlägg: 29
Blev medlem: 12 april 2005, 23:16:49
Ort: Finnerödja

Re: AVR (ATtiny2313 tappar minnet) -hjälp!

Inlägg av Oscar »

Tack så mycket för alla synpunkter :) Jag får fixa till programmet så återkommer jag med resultat (efter helgen). Håller med om att det kan bli tokigheter om jag inte kör push/pop på sreg och r16/r17. För r17 (som jag använder som en global variabel) är det inte lika kritiskt men ett interupt vid fel ställe i main skulle ge r16 ett felaktigt värde. Jag får helt enkelt skylla på att jag inte sysslat med assembler på några år så jag hade visst glömt detta :doh: Tittade i några gamla program jag skrivit och där hade jag visst varit generös med att spara undan på stacken så förhoppningsvis är det avsaknad av det som ger det här skumma fenomenet. Hårdvaran har jag varit extra noga med denna gång så med fixad mjukvara funkar det nog.
Användarvisningsbild
jesse
Inlägg: 9235
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: AVR (ATtiny2313 tappar minnet) -hjälp!

Inlägg av jesse »

R17 får du ju inte spara på stacken, för då gör ju inte INC R17 någon nytta .
Oscar
Inlägg: 29
Blev medlem: 12 april 2005, 23:16:49
Ort: Finnerödja

Re: AVR (ATtiny2313 tappar minnet) -hjälp!

Inlägg av Oscar »

Hehe nej just ja det är ju sant, i så fall funkar ju programmet inte alls :D r17 är ju global o uppdateras i interuptet men det andra ska jag iaf se till att spara...
Oscar
Inlägg: 29
Blev medlem: 12 april 2005, 23:16:49
Ort: Finnerödja

Re: AVR (ATtiny2313 tappar minnet) -hjälp! *LÖST*

Inlägg av Oscar »

Hehe hittade felet idag :happy: Jag hade bara råkat skriva fel adressvektor för interuptet, hade skrivit 0x001A (som för bla. ATmega88) men för ATtiny2313 ska det va 0x0005 (Timer1_OVF). Lite klantigt men tack vare det så har jag ju iaf byggt bort framtida buggar genom sparande av statusregister osv på stacken, så förhoppningsvis glömmer jag inte det nästa gång. Om man tittade lite noggrannare än vad jag gjorde när jag debuggade i AVRStudio så hade jag sett en rad som den här "AVR Simulator: Invalid opcode 0xffff at address 0x000005" vid ingången till interuptet det lustiga var ju bara att det trots det funkade fint, till och med irl efter en första flashning av mikrokontrollen. Nu ser det ändrade ut enligt följande:

Kod: Markera allt

...
.org 0x0005				;Adressvektor för Timer1_ovf
	rjmp Timer1_ovf	  ;Hoppa till Timer1_ovf
...
...
Timer1_ovf:
	push r22
	in r22,SREG
 	push r22
   push r16 

	inc r17				;r17=r17+1
	rcall timerinit	 ;Ladda in timervärden

	pop r16
	pop r22
   out SREG,r22
   pop r22
	reti				   ;Return from interupt
Nu funkar allt som det ska som sagt så nu är jag nöjd, Användning av ramcell istället för register som flagga mellan interupt och huvudprogram tar jag nästa gång... sökte lite på användande av det och såg att swech tagit upp det tidigare så det ska nog inte bli nåt problem med det skulle jag tro.

/Oscar
Jonas L
Inlägg: 432
Blev medlem: 14 juli 2009, 14:28:41
Ort: Karlshamn

Re: AVR (ATtiny2313 tappar minnet) -hjälp! *LÖST*

Inlägg av Jonas L »

Sensmoralen här måste vara: Använd inte 0x0005 utan se till att leta upp den define som finns för det önskade värdet. På så vis går det inte helt åt skogen om du byter CPU-modell.

Angående ett register som en variabel: Nu var det länge sedan jag använde assembler på den nivån, så jag vet faktiskt inte vad det finns för möjligheter i preprocessorn. Hade jag haft tillgång till C-kompilatorns makrohantering hade jag nog döpt om det registret som jag skulle specialhantera och hindrat användning av den råa formen.

...var jag onödigt tjurig nu? :roll:
Användarvisningsbild
jesse
Inlägg: 9235
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: AVR (ATtiny2313 tappar minnet) -hjälp! *LÖST*

Inlägg av jesse »

Normalt döper man varje register som används.

Exempelvis:

Kod: Markera allt

.DEF temp R16
.DEF counter R17
...
inc counter
...
ldi temp,25
...
Oscar
Inlägg: 29
Blev medlem: 12 april 2005, 23:16:49
Ort: Finnerödja

Re: AVR (ATtiny2313 tappar minnet) -hjälp! *LÖST*

Inlägg av Oscar »

Japp precis som jag gjorde med det här registret ->

Kod: Markera allt

.def trigg=r20         ;Ingång för extern trigg
I övrigt så döpte jag iofs inga fler register, tycker nästan det är lättare att hålla reda på namnen om man använder kortformen, r16, r17 osv. när det gäller så här små program. Vid större program med en massa subrutiner, interupt och macron är det dock bra att döpa de register man använder till nåt som beskriver dess funktion...
Skriv svar