Sida 1 av 2
ny på AVR
Postat: 31 december 2010, 15:37:42
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)
Re: ny på AVR
Postat: 31 december 2010, 15:45:36
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.
Re: ny på AVR
Postat: 31 december 2010, 15:56:29
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
Re: ny på AVR
Postat: 31 december 2010, 16:40:31
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.
Re: ny på AVR
Postat: 1 januari 2011, 00:28:16
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
Re: ny på AVR
Postat: 1 januari 2011, 21:37:22
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.
Re: ny på AVR
Postat: 3 januari 2011, 10:14:27
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.
Re: ny på AVR
Postat: 3 januari 2011, 10:59:55
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.
Re: ny på AVR
Postat: 3 januari 2011, 14:27:08
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
Swech
Re: ny på AVR
Postat: 3 januari 2011, 15:07:32
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...

Re: ny på AVR
Postat: 3 januari 2011, 17:04:47
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
Re: ny på AVR
Postat: 3 januari 2011, 17:36:32
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...

Re: ny på AVR
Postat: 3 januari 2011, 17:45:14
av blueint
Kompilator stödet för Atmel AVR är avsevärt bättre än för Microchip PIC.
Re: ny på AVR
Postat: 3 januari 2011, 21:26:26
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
Re: ny på AVR
Postat: 3 januari 2011, 23:12:11
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.