Börja med AVR, men i vilken ende?.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Fagge
Inlägg: 3930
Blev medlem: 27 maj 2003, 13:59:51
Ort: Blekinge

Börja med AVR, men i vilken ende?.

Inlägg av Fagge »

Hej allihopa.
Målet är att bygga en så liten enhet som möjligt som kan PWM-styra Luxeon RGB-lysdioder.
Detta är i sig ingen konst, men eftersom 68HC11an börjar bli lite till åren & är onödigt klumpig & dyr så hittade jag kretsen ATtiny2313.
Den har ju 4 PWM kanaler, är liten & är skitbillig även hos Elfa, så nu vill jag lära mig att handskas med denna.

Jag vill skriva koden i Asembler eftersom jag redan kan det någorlunda, i alla fall för HC11an.

Nu till frågorna

1. Jag antar att man kan börja med den enklaste programmeringskabeln 3 resistorer på LPT-Porten som figurerar runt på nätet, men fungerar den ihopa med alla Avr kretsar som använder ISP eller hur ligger det till med detta?. Fördelen med denna kabeln är väll att kretsen kan matas ifrån LPT-porten, med då gäller det väll att man inte ha massa kringutrustning tillkopplad som käkar ström va?.

2. Som helt ny i AVR-djunglen så är det kaos i huvudet, när det gäller mjukvaran.
Så vilken mjukvara (Kompilator / program överförare ) rekommenderar ni för WinXp?. Ska helst vara enkel för mig som nybörjare & behöver bara klara ASM & fungera med kabeln som nämns ovan!.

3. Hur brukar ett avr program se ut i grunden?. Alltså Vilka grejor måste alltid initieras & hur hanterar man RAM-minnesplatserna?, alltså om man vill att en plats i minnet ska heta t.e.xHEJ för att vid ett senare tillfälle lägga ett tal i minnesplatsen HEJ

4. Vill någon vänlig själ visa ett asm program som bara tänder en lysdiod, beroende i vilket läge t.e.x en strömbrytare står i som är kopplad till en annan pinne!.
Bara liksom man får en knuff framåt & kommer i gång, sen så ska det nog lossna av sig självt!. Men nu precis i början är allt en smet.

Mvh/Fagge
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg av thepirateboy »

Är själv i samma sits, och har också börjat labba lite med tn2313. Själv köpte jag en AVR ISP-mkII på Lawicel, tyckte inte det var värt ett par hundra att börja strula med nåt hemmabygge. AVR-Studio verkar helt ok, bara att dra hem och installera. En kodsnutt som jag hittade och som fungerade direkt visas nedan, kanske inte helt vad du var ute efter, men alltid något.

;My Very First AVR Project - blinky LED

.include "tn2313def.inc"
.equ FREQ = 8000000
.def Temp = R16 ;Gives "Defines" Register R16 the name Temp
.def DELAY = R17
.def DELAY2 = R18

.org 0x0000 ;Places the following code from address 0x0000
rjmp RESET ;Take a Relative Jump to the RESET Label

RESET: ;Reset Label
ldi TEMP, 0xFF
out DDRD, TEMP
LOOP:
ldi TEMP, 200
rcall DELAY_MS
ldi TEMP, 0x40
out PORTD, TEMP
ldi TEMP, 200
rcall DELAY_MS
ldi TEMP, 0x00
out PORTD, TEMP
rjmp LOOP

; Cause the uc to pause for TEMP number of milliseconds
DELAY_MS:
rcall DELAY_1MS
dec TEMP
brne DELAY_MS
ret

DELAY_1MS:
ldi DELAY2, FREQ / (1033*3*50) ; the 1033 is there as a tweak.
L_DELAY2:
ldi DELAY, 50
L_DELAY1: ; this loop takes 3 cycles on avg
dec DELAY
brne L_DELAY1

dec DELAY2
brne L_DELAY2
ret
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Inlägg av BEEP »

"tänder en lysdiod, beroende i vilket läge t.e.x en strömbrytare står"

Kod: Markera allt

.include "tn2313def.inc"

//--- Interrupt Vector -------------------------------------------------
.org 0x0000
rjmp Reset

//--- Reset ------------------------------------------------------------
//.org 0xnnnn
Reset:

//--- Init --------------------------------------------------------------
Init_PORTB:
	ldi 	r16, 	0b01111111	
	out 	DDRB, 	r16

//--- Main --------------------------------------------------------------
Loop:
	in		r16,	PIND
	out		PORTB,	r16
	rjmp	Loop


Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Du behöver inte en Tiny2313 för att styra några luxeon med PWM, det räcker gott och väl med en Tiny13! Den pallar med PWM på typ alla ben med >60 Hz och nästan 8 bitars upplösning med timerstyrd mjukvaru-PWM och intern oscillator (t.o.m. om man skriver i C :wink: )
Användarvisningsbild
Fagge
Inlägg: 3930
Blev medlem: 27 maj 2003, 13:59:51
Ort: Blekinge

Inlägg av Fagge »

Tack hitintills!.

I HC11ans värd så har man ju Accumulatorer A & B, Och 2st 16bitars register X & Y.
Men här verkar finnas 25st 8bitas Accumulatorer & 3st 16bitars register som man kan leka med hej vilt. Det låter väldigt mycket eller har jag missuppfattat något, eller är det bara jag som inte har hängt med i utvecklingen?. :wink:

Varför skriver man så 0b01111111, ja för att visa talet i binärform, men vad betyder 0b innan talet? & vilka fler alternativ finns det?. Själv har jag alltid skrivit i Hex form typ #$7F men gäller dessa tecken #$ före hextalet även för avr?.

$tiff
Men Tiny13 har ju bara 2 pwm utgångar, eller du menar att mjukvaru simulera en tredje vanlig utgång, hmm låter krabbigt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Den [ATtiny2313 ] har ju 4 PWM kanaler,

*Oberoende* PWM kanaler ????
(Tips : läs databladet...)

> eller är det bara jag som inte har hängt med i utvecklingen?.

Du kanske bara inte har läst på innan du frågar... :wink:

> vad betyder 0b

Det sa du ju själv, "för att visa talet i binärform" ???

> och vilka fler alternativ finns det?

Dokumentationen för AVR assembler borde ha ett bra svar på det.
(Men 10 sekunder i databladet för ATtiny2313 ger "0x" för HEX värden...)

> Men Tiny13 har ju bara 2 pwm utgångar,...

Och sannolikt inte *oberoende* kanaler, jag har dock inte kollat...

> eller du menar att mjukvaru simulera en tredje vanlig utgång, hmm låter krabbigt.

Inte alls "krabbigt". Och dessutom menade han bombsäkert att köra tre
PWM kanaler i mjukvaran. Inget problem alls. Ska processorn göra en
massa annat också ?
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Inlägg av BEEP »

"Hex form typ #$7F"
0x7F

"mjukvara (Kompilator / program överförare )"
Atmel Corporation - AVR Studio 4
PonyProg - serial device programmer

Start och utvecklingspaket
Atmel STK500
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

>> Fagge
PWM med hårdvarustöd, som du pratar om, behöver du bara om du ska ha PWM i kHz-området eller om du _måste_ frilägga processortid.
I ditt fall verkar primärmålet vara just att skapa PWM från någon enklare styrkälla. Då är det bättre att skapa dem mjukvarumässigt, alltså att "emulera" fram dem genom mjukvaran, med hjälp av ett timerinterrupt. Dessutom kan du välja utpinnar som du vill.

Jag har faktist själv skrivit ett program för Tiny13 som styr tre Luxeon 1W i konfigurationen R,G,B, som sakta "slumpar" fram en av sisådär 1M möjliga nyanser och dimmar mellan dessa för att skapa en harmonisk känsla och, ja, du vet, allt det där...
Användarvisningsbild
Greensilver
Inlägg: 1305
Blev medlem: 21 januari 2005, 21:24:57
Ort: Sverige
Kontakt:

Inlägg av Greensilver »

Ett tips är att snyga till PWM signalen på samma sätt som hårdvaru PWM:en kan fås att göra. Låt säga att vi har 8 bit PWM med en bitmask som ser ut som följande (3/8 dutycycle):
11100000

Istället för att köra ut den så här:
11100000111000001110000011100000

så vänder vi på byten varannan gång (00000111):
11100000000001111110000000000111

Tycker iallafall jag var rätt smart, samma duty cycle men inte så snuttifierat.
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

1. Dom enklaste programerana fungerar till alla AVR utom ATtiny28, dock kan man sätta fuse som gör att ISP inte längre fungerar...
Dock måste jag säga att dom enkla programerana fungerat utmärkt (de jag har testat.. yaap
PonyProg AVRdude)

2. Assembler och emulering av AVR så är atmels egen mjukvar riktigt bra, AVRStudio.
Om du vill ha C så kan jag varmt rekomdera WinAVR som är ett komplet paket med det mesta. Nu mera stöder även AVRStudio GCC (läs winavr) vilket är riktigt trevligt.

3 & 4.Exempel

Kod: Markera allt

//Vilken procesor (typ ger namn på register mm)
.include "8515def.inc"


//Definerar register r16 som temp
.def	temp	=r16



.org	0x0000	//Ditt procesorn kommer vid en reset
rjmp	RESET	//hoppar till reset
/*Anledningen att man hoppar till reset istället för att skriva koden diret är att intrupt vektorn är på de första platserna.
exempel
.org	OVF1addr //Addressen för Overflow interrupt för timmer 1
rjmp	till_den_funktionen_som_ska_hantera_den
*/ 


/*
På AVR med ram minne (finns de med utan, exempel AT90S1200) bör man sätta stack pekaren.
Stack pekaren används för att lagra program addresen vid funktions anrop och för push och pop, Nyare AVR har dock Stack pekaren satt till Ramend efter en reset...
*/
RESET:
	ldi	temp,low(RAMEND)
	out	SPL,temp
	ldi	temp,high(RAMEND)
	out	SPH,temp
	
	ldi	temp,0xff
	out	DDRB,temp //sätter portB till utgång

loop:
	in      temp,PIND //läser från port D
	STS 	var1,temp //Skriver till var1 i ram minet, det är ganska onödigt men visar hur man kan använda ram minet
	LDS	temp,var1 //Ladda från ram minet :P
	out     PORTB,temp//skriver till port B 
	rjmp	loop

.DSEG	//Anger att vi är i ram mintet  
var1:  .BYTE 1	//reservera 1 byte i ram minet
Annars är C mycket trevligt... :)

Greensilver:
Med den metod du beskriver så halverar du PWM frekvensen...

Sodjan: Den har två timrers med två pwm på varje timmer och det står i databladet, vart tror du att han har fått det i från? :roll:
Sedan att de inte är helt oberonde, exempel så går det inte att välja olika frekven för alla 4, men duty cykel går ändra för varje kanal.
Användarvisningsbild
Fagge
Inlägg: 3930
Blev medlem: 27 maj 2003, 13:59:51
Ort: Blekinge

Inlägg av Fagge »

Tack exile för ett mycket informativt & lättförståeligt inlägg, till skillnad från vissa som helst hade sett att man la ner hela mikroprocessor delen i forumet & hänvisade alla till ett datablad på 100-1000sidor!. :roll:

En liten fråga till
//Definerar register r16 som temp
.def temp =r16
Varför Just R16 & inte någon av dom andra 25st 8bitars registren?.
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Tyvär så fungerar inte alla register med alla instruktioner exempel ANDI som stöder r16 till r31, men det flesta instruktioner söder alla regiterna

Där för brukar Temp var r16 efter som det är det första register som fungerar med alla instruktionerna

Komplet lista instruktioner som inte kan använda alla register
ADIW
ANDI
CBR
CPI
FMUL
FMULS
FMULSU
LDI
MULS
MULSU
ORI
SBCI
SBR
SUBI

Lite surt men man anväder sällan alla 32registerna "samtidigt"
Användarvisningsbild
Greensilver
Inlägg: 1305
Blev medlem: 21 januari 2005, 21:24:57
Ort: Sverige
Kontakt:

Inlägg av Greensilver »

>exile:
Halverar frekvensen. Nä, hur då? Varför det?
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Frekvensen kommer att bli halverat på grund av att antal flanker från 0 till 1 minskar, vilket minskar period tiden

exempel:

Kod: Markera allt

11100000111000001110000011100000.... 
<-tid--><-tid--><-tid--><-tid-->....

11100000000001111110000000000111...
--tid-------><-----tid------><---tid...
som du ser ökar tiden vilket ger lägre frekvens, jag tror att du har gjort en tanke groda...
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Inlägg av BEEP »

Skriv svar