ny på AVR

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

ny på AVR

Inlägg av persika »

Har länge programmerat PIC i asm ( ex. 12F683, 16F688, 16F690).
Tycker Pic är bra, förutom segmenterat RAM- och program-minne, och det begränsade stackutrymmet.
Tänkte därför vara lite nyfiken på AVR.

Så jag laddade hem datablad för ATtiny861 och AVRstudio.
Installerat AVRstudio och gått igenom wizard'en och klickat på ATtiny861, men man får bara en tom vit ruta i editorn. Hittar ingen mall (template) för den processorn, i jämförelse med MPLAB följer där en mall med för varje processor.

Ett annat mindre problem är att jag vill ha svart bakgrund i editorn, det går att ställa in, men de egna inställningarna är borta nästa gång AVRstudio startas.

(Använder Win 7)
Användarvisningsbild
MicaelKarlsson
Inlägg: 4669
Blev medlem: 18 juni 2004, 09:16:07
Ort: Aneby
Kontakt:

Re: ny på AVR

Inlägg av MicaelKarlsson »

Edit - Font and color så kan du få svart bakgrund.

Inställningar för "fuses" gör du innan du programmerar din AVR, eller är det annat du tänker på?

Edit: Hittade en generell template för AVR ASM i en bok av John Morton om det är av intresse.
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Re: ny på AVR

Inlägg av thepirateboy »

Angående svart bakgrund: prova att högerklicka på AVRStudio.exe och välj Kör som administratör, då verkar inställningarna sparas.

Några kodexempel följer inte med AVRstudio, utan man får skriva från "scratch" eller ladda hem nåt enkelt exempel.
Däremot finns det en fil med registerdefinitioner, t ex .include "tn861def.inc".

Såg nu även att det finns en del assembler-exempel i mappen C:\Program Files (x86)\Atmel\AVR Tools\AvrAssembler\Appnotes
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: ny på AVR

Inlägg av sodjan »

Du får naturligstvis köra vad du vill, men... :-)

> ...och det begränsade stackutrymmet.

Det är väl "begränsat" på alla processorer på ett eller annat sätt.
Har du råkat ut för att det faktiskt har varit ett problem ?
De nya PIC16F1xxx har utökat stackutrymme jämfört med de äldre.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: ny på AVR

Inlägg av jesse »

Så här såg mitt första assemblerprogram ut för AVR. Jag lovar inte att det är varken snyggt eller bra för det var två år sedan jag skrev det, men man kan ju plocka bort min kod så får man ett "skal" att använda som mall, eller åtminstone att titta på för att se hur man börjar. Interruptvektorerna är dock olika för varje processortyp.

Kod: Markera allt

; ----------------------------------------------------
;
; Tiny45 testboard
;
; PB0   = KNAPP
; PB3   = ADC3   = TRIMPOT
; PB4   = LED
; PB5 = Reset
;
.EQU KNAPP = 0
.EQU LED = 4
.EQU TRIMPOT = 3
.EQU KLOCKA=SRAM_START
; ----------------------------------------------------
;
; MACRO
.MACRO ut   ; ut PORT,data
	ldi Tmp,@1
	out @0,Tmp
.ENDMACRO
	

; standardsetting
.INCLUDE "tn25def.inc" ; Attiny25

; Aritmetiska register
.DEF Count= r19
.DEF Count2= r20
.DEF Count3= r21
.DEF Tmp  =  r16
.DEF Tmp2 =  r17
.DEF Tmp3 =  r18
.DEF ADCin = r22
.DEF ADCcomplete=r23
;
;==================================
; INTERRUPTVEKTORER
;==================================
;
.CSEG 
.ORG 0000
rjmp RESET    ;0x00 Reset
rjmp UNKNOWN  ;0x01 EXT_INT0	; External Interrupt 0
rjmp UNKNOWN  ;0x02 PCINT0		; Pin Change Interrupt 0
rjmp UNKNOWN  ;0x03 TIM1_COMPA	; Timer1 Compare A
rjmp TIM1_OVF ;0x04 TIM1_OVF    ; Timer1 Overflow
rjmp UNKNOWN  ;0x05 TIM0_OVF	; Timer0 Overflow
rjmp UNKNOWN  ;0x06 EE_RDY		; EEPROM Ready
rjmp UNKNOWN  ;0x07 ANA_COMP	; Analog Comparator
rjmp ADCCOM   ;0x08 ADCCOM		; ADC Conversion Complete
rjmp UNKNOWN  ;0x09 TIM1_COMPB	; Timer1 Compare B
rjmp UNKNOWN  ;0x0A TIM0_COMPA	; Counter0 Compare Match A
rjmp UNKNOWN  ;0x0B TIM0_COMPB	; Counter0 Compare Match B
rjmp UNKNOWN  ;0x0C WDT			; Watchdog Time-out
rjmp UNKNOWN  ;0x0D USI_START	; USI START
rjmp UNKNOWN  ;0x0E USI_OVF 	; USI Overflow

; ============= INTERRUPT MACRO ============
.MACRO int_start
	push Tmp
	in Tmp, SREG
	push Tmp
	push Tmp2
	push zl
	push zh
.ENDMACRO
.MACRO int_slut
	pop zh
	pop zl
	pop Tmp2
	pop Tmp
	out SREG,Tmp
	pop Tmp
	reti
.ENDMACRO
;===========================================

; ------------- TIMER1 owerflow interrupt
TIM1_OVF:
	; KLOCKA=8Mhz, prescaler = 1/8 => 1Mhz
	; räkna ner 16 bitars ord i SRAM
	int_start
	ut TCNT1,100 ; 256-15625/100 => 100 p.sek???
	ldi zl,LOW(KLOCKA)
	ldi zh,HIGH(KLOCKA)
	ld Tmp,z 
	subi Tmp,1  ;räkna ner låga byte
	st z+,Tmp
	brcc tim1_slut
	ld Tmp,z
	subi Tmp,1 ;räkna ner höga byte
	st z+,Tmp
	brcc tim1_slut
	;räknaren slagit om från noll till FF
	; sätt flagga
	ldi Tmp,1
	st z,Tmp ; lagra etta i (KLOCKA+2)
tim1_slut:
	int_slut
UNKNOWN:	;okänt interrupt ?
	reti

; =============00ADC complete interrupt =============
ADCCOM:
	ldi ADCcomplete,1
	reti


; ====================================================
; ==================== RESET =========================


Reset:  ; 0x0F
	ut SPL , LOW(RAMEND)	; Initiera stacken
	; ut SPH, HIGH(RAMEND)	; endast tiny45-85 

; Initiera PORT B
	ut DDRB, 1<<LED	;1= UT, 0 = IN (LED=ut)	
	ut PORTB, 0b11101111 ; 1= pull-up

; initiera ADC
	ut ADCSRA,0b10001101 ; ADEN(7)=1,ADIE(3)=1=interrupt enable,Prescale(3.0)=1/32;
	ut ADMUX, 0b00100011 ; ADLAR(5)=1, Channel=3 (0011)
	ut MCUCR, (0<<SM0)|(1<<SE) ; sätt SLEEP-mode = idle.
	sei ; sätt interrupt enable bit.
	rcall read_ADC	; gör en test-read

; initiera TIMER1
	ut TCCR1,  7 ; CK/64 prescale. = 1M/64= 15625 Hz
	ut TIMSK,(1<<TOIE1) ; Timer1 owerflow interrupt enable

	ldi tmp3,1

.
;----------MAIN-------------
main:


	rcall toggla_LED
	rcall wait
	rjmp main

wait:
;------------  nedan timer --------------
	.EQU TID=50		; hundradelar
	;----------  kolla knappen -------------
	in Tmp,PINB
	andi Tmp,(1 << KNAPP); kolla knapp nedtryckt?
	;
	rcall Read_ADC
	lsr ADCin
	ldi tmp,1
	add ADCin,tmp
	cli
		; sätt en tid
		sts KLOCKA,ADCin
		clr Tmp
		sts KLOCKA+1,Tmp
		ut MCUCR, (1<<SE) ; sleep enable
		clr Tmp
		sts KLOCKA+2,Tmp ; nollställ flagga
	sei
sova:
	sleep ; vänta tills interrupt sker
	lds Tmp,KLOCKA+2
	tst Tmp
	breq sova
; timer = noll ... tiden är ute!
	ret


; --------------------------------
; subrutin: Toggla LED: tänd / släck LED
toggla_LED:

	in Tmp,PINB
	ldi Tmp2, 1<<LED
	eor Tmp,Tmp2 
	out PORTB,Tmp ; skriv bit
	ret		; Färdigt

; ----------Läs in analog signal ------------
;           Till ADCin - registret

Read_ADC:
	ldi ADCcomplete,0 
	ut MCUCR, (1<<SM0)|(1<<SE) ; sätt SLEEP-mode = ADC noise reduction
	sei ; sätt interrupt enable bit.
	sleep ; vänta till interrupt
ADC_loop:
	tst ADCcomplete
	breq ADC_loop
	;klar
	in ADCin,ADCH ; läs in höga byte till ADCin
	ret

Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7482
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: ny på AVR

Inlägg av Marta »

"Tycker Pic är bra, förutom segmenterat RAM- och program-minne, och det begränsade stackutrymmet."

Har Du tittat på PIC-18? De förtretligheter Du nämner är borta eller avsevärt mindre på denna och instruktionssetet betydligt utökat, bl.a. ingående carry samt compareinstruktioner. Indirekt adressering är mycket utökad. Alla instruktioner kan operera på värdet i W. I princip alla SFR är tillgängliga utan bankswitch. Hopp kan nå hela programminnet utan PCLATH. Alla SFR samlade längst upp och RAM linjärt indirekt adresserbart. Känns väldigt mycket mera som en "riktig" processor än 12/16.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: ny på AVR

Inlägg av persika »

MicaelKarlsson:
Tack för tipset om boken av John Morton, hittade en skannad kopia av den i en pdf-fil.
Ska kolla mera i den.

thepirateboy:
Tack för tipset med högerknapp och "Kör som administratör", det gör att färginställningarna är kvar.
Filen "tn861def.inc" hittade jag inte i installationen, tycker den borde följt med, men jag hittade den via google på internet.
Har även hittat några exempel, så jag ska testa lite. Ska också bekanta mig lite med instruktionerna till AVR.

sodjan:
Har inte råkat ut för haft direkt problem med att stackminnet i PIC tagit slut, man får ju göra programmen efter förutsättningarna som ges. Men 7 stack nivåer ( i 12F/16F) är inte mycket, där är 8 men 1 går bort för interrupt. Har gjort några bibliotek med rutiner för heltalsmatematik och för kommunikation (RS232/485), dom tar c:a 3-4 stackninvåer och sen till "applikationen" kanske det också behövs 3-4 nivåer, så då äts snart de 7 upp och man vill kanske ha en nivå som marginal.
Det går inte att spara undan tillfälliga värden på stacken i PIC, vilket gör att man måste använda mer RAM/register för det. Om man är snål med RAM-minnet och återanvänder det för olika rutiner, måste man ha stenkoll så det inte blir några kollisioner.

Marta:
Har kollat lite i databladen för 18F, kan ju vara ett alternativ. Det hade ju gått lättare att återanvända kod ist för att skriva allt nytt för AVR då.


Jag är iaf nyifken på AVR, se vilka för och nackdelar där finns.
Ofta är ju grannens gräsmatta grönare, men sen när man kommer nära inpå så hittar man ogräsen även där.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: ny på AVR

Inlägg av sodjan »

> Men 7 stack nivåer ( i 12F/16F) är inte mycket,

16 i (de nya) 16F1xxxx. Plus en massa andra "trevligheter".
Och i stort kodkompatibla med mindre justeringar.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: ny på AVR

Inlägg av Swech »

x,y och z pekarna i AVR är dina nya bästa vänner !
x,y kan peka i ram z både i ram samt flash.

När du får grepp om hur mycket kul man kan göra med dessa så står du upp till knäna i grönt gräs :D
Swech
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: ny på AVR

Inlägg av sodjan »

Jo, det är klart att en PIC inte har några register som heter "x", "y" och "z",
så på det sättet är de "nya"... :-)

Men funktionellt så skiljer de sig inte från de index register som finns i en PIC
vilka gör i stort samma sak (inkl pre/post incr/decr o.s.v).

Notera också att x, y och z "snor" totalt 6 "register" om man använder alla.
På en PIC är indexregister (och motsvarande register för att läsa flash/EEPROM)
helt separata dedikerade register.

Så vitt jag förstår av AVR manualen så kan du välja "pre-decr", "post-incr"
*eller* "displacement", inte kombinera pre/post funktioner med "displacement".
Dessutom saknas "pre-incr" och "post-decr".

PIC har både post- och pre- incr/decr *kombinerat* med "displacement" om man vill det.

Alltså, i det stora spelar det kanske ingen större roll, men det blir lite fel när något
framförs som att det vore något unikt och helt nytt på just AVR. Poängen är alltså att
man faktiskt *tappar* funktionalitet just i detta fall om man byter från PIC till AVR... :-)
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: ny på AVR

Inlägg av Swech »

Det blir en äpple - päron jämförelse igen.
Men det du påstår gäller väl för PIC18 och eventuellt några PIC16?
De äldre PIC16 och PIC12 har väl endast FSR registret....

Om PIC16 hade haft dessa funktioner då det begav sig för mig för flera år sedan
så hade jag troligtvis fortsatt med dem. Jag har kört en jädra massa PIC
F84, C63, C73 .. men det var flera år sedan
, AVR hade dessa funktioner från början (förutom den absolut första modellen)
vilket föranledde mitt byte. Är PIC så att säga ikapp nu så "fine" kör vad du vill...

Likaså jämförelse med att slösa register är också Äpple - Päron jämförelse
x,y,z är dedikerade på AVR till pekare men de går även fint att använda till annat.

Utgår man från TS punkt att han vill byta från 12 och 16 serien så blir
det trots allt så att oavsett modell/märke så kommer pekarna att bli hans
nya kompisar.

Swech
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: ny på AVR

Inlägg av sodjan »

Det gäller 16F1xxx serien och 12F1xxx, vilka har samma arkitektur
ner till 8-pinnars kapsel.

> De äldre PIC16 och PIC12 har väl endast FSR registret....

Ja, och där saknas bl.a post/pre incr/decr o.s.v. Man får göra det själv.
Men varfär jämföra med en *äldre* arkitektur ?
Självklart är det det som gäller *idag* som vi måste utgå från, annars
blir det ju en jämförelse mellan äpplen och väldigt gamla päron... :-)

> Utgår man från TS punkt att han vill byta från 12 och 16 serien så blir
> det trots allt så att oavsett modell/märke så kommer pekarna att bli hans
> nya kompisar.

Nej. Eller kanske ja, om han inte tidigare har använt motsvarande på PIC... :-)
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: ny på AVR

Inlägg av blueint »

Kompilator stödet för Atmel AVR är avsevärt bättre än för Microchip PIC.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: ny på AVR

Inlägg av persika »

Jo, 12F/16F har bara ett pekar-register.
Ofta behöver man mer än en när man skriver program.
Så för att komma runt det problemet, gav jag ett register namnet FSR2, ett helt vanligt register bara som jag använde för att peka på något.
Innan jag använde det, anropade jag rutinen Swap_FSR_FSR2 och då kunde jag använda det vanliga FSR (INDF) fast då med pekaren från FSR2, efteråt anropade jag Swap_FSR_FSR igen så blev allt återställ igen (förutom status-registret bara).
Så det går att komma runt problemet med endast en pekare, men lite klumpigt och tar en stacknivå i "onödan", eller om man gjort rutinen som macro så äter den programminne i onödan.

Här är swaprutinen:

Kod: Markera allt

  Swap_FSR_FSR2		; byt  innehållet i FSR och FSR2 mot varandra
  ;	
  ;
  ; register som ändras: z-flagga
  ;	
  ;
  
  
  		xorwf	FSR, f
  		xorwf	FSR, w
  		xorwf	FSR, f
  		
  		xorwf	FSR2, f
  		xorwf	FSR2, w
  		xorwf	FSR2, f
  		
  		xorwf	FSR, f
  		xorwf	FSR, w
  		xorwf	FSR, f
  		
  		return

sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: ny på AVR

Inlägg av sodjan »

OK, vi tar det en gång till så får vi se om det "tar"... :-)

> Jo, 12F/16F har bara ett pekar-register.

Gäller *INTE* 12F1xxx och 16F1xxx serierna.

Se även :

"PIC1XF1XXX Software Migration" :
http://ww1.microchip.com/downloads/en/D ... 41375A.pdf

"Introducing the Enhanced Mid-Range Architecture" :
http://techtrain.microchip.com/websemin ... 110508.pdf

Kolla gärna den nya 8-pinnaren 12F1822 :
http://www.microchip.com/wwwproducts/De ... e=en544839
http://ww1.microchip.com/downloads/en/D ... 41413B.pdf
USART, PWM, SPI, I2C, "Data Signal Modulator Module", "Internal 32MHz oscillator",
"Capacitive mTouch Sensing Module", intern tempgivare m.m.
Skriv svar