Gå til innhold

Anbefalte innlegg

Jeg har nettopp skaffet meg en STK500 og tenkte å begynne å prøve programering med bruk av AVR Studio.

jeg lurte på om det finnes en bok som kan hjelpe meg i begynnelsen, og hva alle forkortelsene betyr som f.eks sbis, inc, dec,ror,rol osv osv.

 

No har jeg en ATtiny26-16PU som jeg tenkte skulle fungere som en lys styrer.

Tenkte slik at jeg har 6 stk lys dioder som skal stå i en sirkel og 2 om gangen skal lyse(som et lys tårn som roterer).

 

Jeg tenkte å ha en Start knapp og 1 stopp knapp på den og.

 

Er det noen her som kan gi meg noen hint? på både programmering og bøker?

 

dere kan nå meg her eller på [email protected]

 

 

Takk i forveien

Endret av Kimlorentz
Lenke til kommentar
Videoannonse
Annonse

Med et raskt Google søk kom jeg fram til disse to sidene som kan være til god hjelp tror jeg.

 

ATSTK500

http://www.atmel.com/dyn/products/tools_ca...sp?tool_id=2735

Diverse info og Documents.

 

AVR Studio 4

http://www.atmel.com/dyn/products/tools_ca...sp?tool_id=2725

med diverse software & Documents

 

Men dette har vel du funnet allerede,..

Kan kanskje komme tilbake med et forslag til program.

Lenke til kommentar
jeg lurte på om det finnes en bok som kan hjelpe meg i begynnelsen, og hva alle forkortelsene betyr som f.eks sbis, inc, dec,ror,rol osv osv.

Det står alt slikt i instruksjonsett manualen

Jeg har stort sett lært det meste ved å leke med andres kode, og lese forklaringene i databladene.

 

 

Bare å ta kontakt om det er noe du lurer på, mye mulig jeg kan svare deg :=)

Lykke til

Lenke til kommentar
jeg lurte på om det finnes en bok som kan hjelpe meg i begynnelsen, og hva alle forkortelsene betyr som f.eks sbis, inc, dec,ror,rol osv osv.

Det står alt slikt i instruksjonsett manualen

Jeg har stort sett lært det meste ved å leke med andres kode, og lese forklaringene i databladene.

 

 

Bare å ta kontakt om det er noe du lurer på, mye mulig jeg kan svare deg :=)

Lykke til

 

 

Til no har jeg bare funnet ut hvor jeg finner forklaringer på di forskjellige forkortelsene, driver med programmering no.

Jeg bruker en Atmega8515 som følger med STK500

 

fant og ut av viss jeg skriver

out PINB, 0x01

Så betydde det utgang på pin 1 i B porten, men så var det å legge det inn i registeret på en måte, ikke sikker om dette er rett.

 

Planen var som følge no ved bruk av Assembly AVR Studio 4

 

Port A skal vere bryter

Port B skal vere Led

 

Ved å trykke på SW1 i Port A skal led1 i Port B lyse

Ved å trykke på SW2 i Port A skal led2 i Port B lyse

osv.

 

og viss jeg trykker sw1 igjen etter at led lyser skal den slå seg av.

Har du noen hint der?

Lenke til kommentar

For å legge det inn i registeret først, noe man må, så skriver man LDI R16,0x01

Da vil den legge verdien 1 i register 16, det er anbefalt å bruke registrene mellom 16 og 32, er usikker på hvorfor, men tror det har noe med at kontrolleren bruker de første registrene til noe.

Så for å sende ut 0x01 til port b, så gjør du slik:

ldi R16,0x01

out portb,R16

 

Du må også huske å definere port b som utgang, det gjøres slik:

ldi r16,0xFF //setter r16 til 255

out DDRB,Temp //overfører det til DDRB

ldi r16,0x00 //setter r16 til 0

out PORTB,temp //setter portb til 0

 

DDRB definerer om porten skal være inngang eller utgang, når du setter denne til 255 så vil alle bit'ene i portb være utganger, de bit'ene/pinnene som er 1 er ut, mens de som er 0 er inn.

 

Noe som er veldig lurt for å holde system, er å definere et register slik at den får et navn, det gjør du helt i starten, slik:

.def temp=r16

da vil r16 få navnet temp, slik at du istedet for å skrive ldi r16,0x01, så skriver du ldi temp,0x01

 

 

Et av mine første prosjekter var å lage en sak som sendte ut PWM signal, som kunne reguleres ved 2 knapper.

Du kan ta en titt på koden om du vil

http://eldrsky.net/programmering/asm/avr/T15_PWM/T15_PWM.txt

 

I seksjonen jeg har kalt "loop" så ser du hvordan jeg registerer knappetrykkene, ved hjelp av SBIC (skip if bit is clear)

Denne instruksjonen gjør slik at hvis bit'et er 0 (clear) så hopper den over neste instruksjon, er den 1 så kjører den neste instruksjon.

 

Ikke tenk på timer/counteren som jeg bruker i koden, dette trenger du ikke for å få en LED til å lyse, så hvis du lurer på hva OCR1A, TCCR1 og OCR1A er, så ikke tenk på det enda.

 

Lykke til =)

Endret av Firesky
Lenke til kommentar

Så hvordan veit han at PORTA er inngangen da?

 

her er hva jeg har skrevet til no

 

;***** Styring av LEDs

 

.include "8515.inc"

.def temp =r16

 

ldi temp,0xFF

out DDRB, temp

ldi temp,0x00

out PORTB,temp

 

sbi PINB,0x00

 

 

 

fant noe om inngangen men ikke sikker på hvordan skrive inn

 

in DDRA,temp

in PINA,0x00

Endret av Kimlorentz
Lenke til kommentar

Du må definere port a som inngang, akuratt som du definerer port b som utgang.

 

ldi temp,0xFF

out DDRB, temp

ldi temp,0x00

out DDRA,temp

ldi temp,0x00

out PORTB,temp

 

 

in DDRA,temp

Her leser du inn DDRA til registeret, DDRA er instillingene for porten, hvilke pinner som er inn eller utgang

Skal du lese hele porten må du skrive in PORTA,temp

 

du trenger ikke bruke 'in' instruksjonen for å lese enkle bit, da ville jeg heller brukt SBIC som sagt.

 

 

Si hvis du nå definerer to registere som one, og zero, og legger inn verdien 0x00 i zero, og 0x01 i one, så vil det bli slik:

sbic PINB,0x00 //hvis pinne0/bit0 er 0, så hopper den over neste, hvis den er 1, så kjører den neste

out porta,one // hvis pinne0/bit0 på portb er 1, så setter den porta til 0x01

sbic PINB,0x01 //hvis pinne1/bit1 er 0, så hopper den over neste, hvis den er 1, så kjører den neste

out porta,zero // hvis pinne1/bit1 på portb er 1, så setter den porta til 0x00

 

Så, dette blir ikke en knapp som 'toggler' lysdioden, men 2 knapper, en til av og en til på.

 

Har du lagt denne rutinen i en loop btw?

det er veldig viktig, hvis ikke vil den bare kjøre igjenom den å stare kontrolleren på nytt, da vil den også sette portene til 0, hvis den starter på nytt.

 

For å kjøre den i loop, så lager du en 'label' (tror det var det det heter) og legger rutinen under den, og får den til å hoppe tilbakre til rutinen, når rutinen er slutt.

slik:

 

LOOP:

sbic PINB,0x00

out porta,one

sbic PINB,0x01

out porta,zero

rjmp loop //rjmp hopper til en rutine, nå hopper vi opp til begynnelsen av rutinen igjen

Lenke til kommentar

Her er koden til no, fortsatt problemer med slutten den sier

D:\AVR prosjekter\SWandLEDs.asm(18): error: Invalid register

Under LOOP

out PORTB,0x00 FAILED

out PORTB,0x01 FAILED

 

 

 

;***** SWITCH and LED controll

 

.include "8515def.inc"

.def Temp =r16

 

ldi Temp,0xFF

out DDRB,Temp

ldi Temp,0x00

out PORTB,Temp

ldi Temp,0x00

 

 

LOOP:

 

sbic PINA,0x00

out PORTB,0x00

sbic PINA,0x01

out PORTB,0x01

rjmp LOOP

 

 

Hva er det jeg ikke ser her?

Noe jeg har glemt?

Endret av Kimlorentz
Lenke til kommentar

legg til .cseg i linjen under .def temp=r16

Jeg vet ikke hva cseg er for noe, men jeg har alltid den med i koden

 

Grunnen til feilmeldingen er at du prøver å spytte ut 0x00, dette må først lastes inn i et register, så outputtes...

prøv denne koden, dette er samme som din, bare med litt retting, ta en titt på forskjellen, jeg lager et register som heter zero og et som heter one, og setter en verdi på dem før loopen, slik at dem alltid vil ha den verdien, så istedet for out PORTB,0x00, så endrer jeg denne til det registeret som inneholder den verdien, slik: out PORTB,zero, du kan bare spytte ut verdier som ligger i registeret, så du må først laste inn en verdi i et register, så outputte registeret til porten.

 

 

 

;***** SWITCH and LED controll

 

.include "8515def.inc"

.def Temp =r16

.def zero=r17

.def one=r18

.cseg

 

ldi zero,0x00

ldi one,0x01

 

ldi Temp,0xFF

out DDRB,Temp

ldi Temp,0x00

out PORTB,Temp

ldi Temp,0x00

 

 

LOOP:

 

sbic PINA,0x00

out PORTB,zero

sbic PINA,0x01

out PORTB,one

rjmp LOOP

Lenke til kommentar

;***** SWITCH and LED controll

 

.include "8515def.inc"

.def Temp =r16

.def zero=r17

.def one=r18

.cseg

 

ldi zero,0x00

ldi one,0x01

 

ldi Temp,0xFF

out DDRB,Temp

ldi Temp,0x00

out PORTB,Temp

ldi Temp,0x00

 

 

LOOP:

 

sbic PINA,0x00

out PORTB,zero

sbic PINA,0x01

out PORTB,one

rjmp LOOP

 

 

 

Funket nesten, alle lysene står på og når jeg trykker sw1 slår led1 seg av mens jeg holder den inne og slår seg på når jeg slipper(alle andre leds står på)

Når jeg trykker sw2 blir led1 sterkere mens jeg holder knappen inne og svakere når jeg slipper(alle andre led står på og ikke blir påvirket)

Endret av Kimlorentz
Lenke til kommentar

Humm, høres rart ut, men det virker som man har klart å komme et lite steg videre, siden det ihvertfall skjer noe =D

 

Jeg vet at på STK500 så er lysdiodene inverterte, slik at når alle lyser så er alle 0, men når alle er 1 så er dem slukket, det kan være det er slik med knappen også, prøv å bytt ut SBIC (skip if bit is cleard) instruksjonen med SBIS (skip if bit is set), hvis den nå funker, så er knappene også inverterte, skal fyre opp windows på laptopen å se litt nærmere i AVRStudio imorgen, å se om det er noe med koden :)

 

Hvis knappene er inverterte, så vil den ikke hoppe over de instruksjonene som kun skal kjøres når pinnen/bittet er 1, siden alle bit'ene er 1, og 0 mens du holder nede knappene (hvis knappene er inverterte da selvfølgelig)

Derfor vil den slå av og på LED'ene i en såpass høy hastighet at det kan se ut som den lyser på halv lysstyrke,

Endret av Firesky
Lenke til kommentar

Fått en fin liten jobb oppgave no.

10 bryterer

10 leds

10 releer.

 

Jeg skal lage noe belastningskretser til et test utstyr og vi vurderte å bruke AVR, så da blir det å lage en krets av dette.

SW01 = OFF

SW02 = NO LOAD

SW03 = 200VA UNITY

SW04 = 400VA UNITY

SW05 = 600VA UNITY

SW06 = 400VA LAG

SW07 = 400VA LEAD

SW08 = SHORT

SW09 = POWER OFF

SW10 = POWER ON

*Kun 1 av bryterene kan vere inne om gangen, som f.eks sw2 inne alle andre av, så sw5 og alle andre av.

 

Så da blir det en del koding ja, tror nok ikke hex koding heller er mulig. under her ser du utgangene.

 

Ut til releer

___UT_________INN____

PB0---PB7____PA0---PA7

0000 0001______SW1

0000 0010______SW2

0000 0100______SW3

0000 1000______SW4

0001 0000______SW5

0010 0000______SW6

0100 0000______SW7

1000 0000______SW8

 

Ut til rele styring av main power

___UT___________INN___

PC0---PC7____PD0---PD7

0000 0000_______SW9

0000 0001_______SW10

 

I OFF på alt skal alle releer vere spenningsløs, ved sw1 inne skal kun rele1 ha spenning osv.

 

Blir en del arbeid men håper det er mulig å få til.

Endret av Kimlorentz
Lenke til kommentar

Start:

in temp,PINA

out PORTB,temp

rjmp Start

 

Når du slipper vil porta være 0, da vil den også spytte ut 0 på portb.

Her har du også gjort en liten feil, PINA leser en spesifikk pinne på porta, bytter du ut PINA med PORTA leser den hele porten, alle 8.

 

Jeg har skreve en kjapp kode, den bruker ikke alle 10 I/O portene som du ønsker, dette skal jeg skrive ferdig, men den bruker ihvertfall 8 av dem =)

 

http://eldrsky.net/programmering/asm/avr/a...switchrelay.txt

 

Som du kanskje legger merke til så bruker jeg 8-9 registrere som konstanter, det er egentlig ikke noe spesielt lurt, men har ikke noe spesielt å si når man skriver slike små programmer.

 

 

Ser du også har funne ut av 0b01010001 :) jeg forklarte den i koden,

Endret av Firesky
Lenke til kommentar

No var det neste del, ny kode med nesten samme funsjoner.

 

sw1 slår av og på led1

sw2 slår av og på led2

sw3 slår av og på led3

osv

osv

osv

sw8 slår av og på led8

 

På STK500 er bryterene høy, når du trykker blir di lav på inngangen på 8515

Led er lav, når utgangen på 8515 blir høy lyser leds.

 

Som du ser skal 1 bryter brukes til å slå av og på samme led og hver bryter har hver sin led.

Har du noen ideer der.

Tenkte på bruke en time delay på 2 sek på bryteren sånn at når du trykker 1 gang må du vente 2 sekunder før du kan trykke igjen.

Må fikse en loop på det og at han husker siste instilling, kansje bruke en invert funsjon på bryteren.

 

sw1 blir trykket 1 gang ; viss led er 0 så gir den 1, eller viss led er 1 så gir den 0.

sw blir trykket for andre gang ; viss led er 1 så blir den 0, eller viss led er 0 så gir den 1.

Endret av Kimlorentz
Lenke til kommentar

Tja, sitter å tenker litt, hadde håpet på det skulle være en "toggle bit" instruksjon, men så heldig var vi ikke :p

 

Titt litt i intruksjonsmanualen å se om du finner noen instruksjoner som ser brukbare ut.

Jeg ser for meg at det blir en del SBIC og SBIS instruksjoner her også, skal se litt på det imorgen.

Har fått hjem STK500'n min også nå, så nå kan jeg sitte å dille og sjekke litt her =)

Lenke til kommentar
Tja, sitter å tenker litt, hadde håpet på det skulle være en "toggle bit" instruksjon, men så heldig var vi ikke :p

 

Titt litt i intruksjonsmanualen å se om du finner noen instruksjoner som ser brukbare ut.

Jeg ser for meg at det blir en del SBIC og SBIS instruksjoner her også, skal se litt på det imorgen.

Har fått hjem STK500'n min også nå, så nå kan jeg sitte å dille og sjekke litt her =)

 

 

får ikke sett på det før om noen dager, venter på min nye bærbare maskin.

 

Multicom Compal IFL90+ 15.4" GeForce® 8600M GT 512MB

15,4" Widescreen WSXGA+ 1680x1050 matt skjerm

Intel Core 2 Duo Mobile T7700 2.40GHz 4MB Cache

200GB SATA 7200RPM 2.5"

4GB minne DDR2 667MHz SO-DIMM (2 x 2GB)

9-celler 7200mAh XL (batteritid ca 5 timer)

Intel® Turbo Memory 1GB

Innebygd bluetooth

Analog/digital TV-tuner og radio med s-video inngang og fjernkontroll

MICROSOFT Windows Vista Home Premium 64-bit, norsk

 

blir knall bra, litt over 13 000 kr med frakt, da skal jeg få gjort mer jobbing

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...