Kod till denna koppling? (nybörjarfråga)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Rocky_AL
Inlägg: 617
Blev medlem: 7 december 2006, 15:14:50
Ort: Stockholm

Kod till denna koppling? (nybörjarfråga)

Inlägg av Rocky_AL »

Nu har jag lyckats lära mig de enklaste komandonen i assembler, men en hel del återstår för mig. Jag gjorde följande schema:
Bild
http://img352.imageshack.us/img352/1951/kopplayn6.jpg

med följande kod:
;*****Konstanter****

STATUS equ 03h
TRISA equ 85h
PORTA equ 05h
COUNT1 equ 20h
COUNT2 equ 21h

;****Sätter portar****

bsf STATUS,5 ;gå till bank 1
movlw 00h ;Gör port A till output
movwf TRISA
bcf STATUS,5 ;gå till bank 0
movlw 02h

;****kör en xor för att byta status på lysdioden****

Start xorwf PORTA,1

;****kör en delay och går till Start****

call Delay
goto Start

;****Subrutin för delay****

Delay

Loop1 decfsz COUNT1,1
goto Loop1
decfsz COUNT2,1
goto Loop1

return

end


Men nu till min fråga. Om jag istället vill att lysdioden ska blinka exakt varje sekund, hur gör jag då? Har läst i databladet om TMR1 som tydligen kan räkna varje klockcykel och lagra detta i en 16-bitars kod och som sedan har en flagga som talar om när den går från 65535 till 0. Rätta mig om jag har fel. Men iaf hur skulle koden se ut om jag ville använda TMR1?
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Hur exakt vll du ha det? Timers kan jag fortfarande inte använda :oops: Men man kan ju göra en mjukvaro delay, dvs, ändra längden på pausen du har nu. Men jag vet inte hur exakt det går att få..

//Daniel A
Rocky_AL
Inlägg: 617
Blev medlem: 7 december 2006, 15:14:50
Ort: Stockholm

Inlägg av Rocky_AL »

Tanken är ju att jag tillslut ska kunna göra en enkel digital klocka så exaktheten är väldigt viktig. Jag förstår ju att man till och med skulle kunna knåpa ihop en klocka med bara massa loopar som jag har nu, men i längde så är det nog ingen vidare idé. Sedan så vill jag lära mig hur timers fungerar.

Edit: En sak till. Koden jag skrivit ovan är väl rätt om jag använder en PIC16F628. Jag har ju faktiskt inte köpt några riktiga delar än :oops:
Men jag vill hellre lära mig först och köpa sen.
Senast redigerad av Rocky_AL 10 april 2007, 20:24:43, redigerad totalt 1 gång.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Ok, då är det lika bra att du lär dig det :) Och då kan inte jag hjälpa dig :(

//Daniel A
Användarvisningsbild
netrunner
Inlägg: 5510
Blev medlem: 4 februari 2005, 12:26:05
Ort: 127.0.0.1

Inlägg av netrunner »

Uhhh... direkt på asambler, det är att ta tjuren i hornen. Får erkänna att det var länge sedan jag skrev asambler, idag är jag lat och kör basic. Inget jag är så stolt över men men.

Jo, när du köper prylarna så köp dom då av "sodjan" här på forumet, han säljer "the good stuff". Så slipper du trilskas med många problem.
http://www.jescab.se/Produkter.htm
Rocky_AL
Inlägg: 617
Blev medlem: 7 december 2006, 15:14:50
Ort: Stockholm

Inlägg av Rocky_AL »

Jag har fått för mig att basic inte är något vidare bra språk, har bara hört dåligt om det. Vad det gäller C så verkar det finnas de som tycker att det är bra och de som tycker att det inte är bra. Men en sak verkar de flesta vara överens om iaf. Assembler fungerar alltid. Eftersom jag inte kan varken basic eller C så har jag börjat lära mig assembler. Det enda programspråk jag kan är java. Inte så bra i detta sammanhang :lol:
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Uhhh... direkt på asambler, det är att ta tjuren i hornen...

Men helt rätt... :-)

Använd code-taggarna när du postar kod så blir den lättare att läsa.

Schemat saknar pull-up motstånd för MCLR samt avkopplingskondensatorer,
men det kanske är underförstått...

> STATUS equ 03h
> TRISA equ 85h
> PORTA equ 05h

Ta bort dessa rader helt och använd INC filen för din PIC modell!
Kolla #include i MPASM manualen.
Finns absolut ingen anledning att göra om samma job som Microchip redan har gjort...

> bsf STATUS,5

Använd *aldrig* bit-nummer för bitar som har egna namn!

Ändå bättre är att använda BANKSEL (se MPASM manualen för detaljer...).

> Om jag istället vill att lysdioden ska blinka exakt varje sekund, hur gör jag då?

Först får du definiera vad du menar med "exakt".
Hur mycket fel (som du alltid kommer att få, mer eller mindre) kan
du acceptera?

Du kan t.ex skriva om din delay subrutin så att den ger 1 sek delay.
Ingen bra ide om det är en "klocka" du vill bygga. Blir alldeles
för klumpigt att underhålla koden med programvaru-oopar.

Eller (bättre) använda en av de inbyggda timers som finns i processorn.
Detaljerna finns i databladet. Notera att timern i sig inte behöver ge
1 sek avbrott, det är ju enkelt att räkna ihop ett lämpligt antal avbrott
upp till en sek.

När det gäller just RTC applikationer så är det vanligt att man ansluter
en "klock-kristall" på (ca) 32 KHz till Timer1's OSC-ingångar. Då får man
en enkel hantering av tidbasen för klockan. Men det gå i stort sätt
lika brea att köra med den ordinare oscillatorn som tidbas, i alla fall
till att börja med.
Rocky_AL
Inlägg: 617
Blev medlem: 7 december 2006, 15:14:50
Ort: Stockholm

Inlägg av Rocky_AL »

Jag hittade något om det där med MPASM, men den listade bara vanliga kommandon såsom MOVLW osv. Det där med banksel hittar jag heller inte.
Btw så är länken till databladet: http://www.elfa.se/pdf/73/731/07319783.pdf
Som jag sa tidigare så är jag ute efter en tidtagning som är så exakt som möjligt. Det ska iaf få en klocka att gå rätt, inte säker på hur exakt det måste vara. Det där med att ha olika kristaller är nog för knepigt för mig. Det blir ju problem att läsa av värdena och resetta dem när programmet körs i en helt annan hastighet än räknaren.

Anledningen till att jag frågar hur man använder TMR1 är att jag inte har en aning och att jag fattar i princip noll av databladet .
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Hämta datablad och manualer från Microchip, ELFA har inte alltid de
senaste versionerna. T.ex det du länkade till är från 2003 och för
en utgången PIC modell. Glöm ELFA helt när det gäller PIC, de är
värdelösa på den fronten...

Manualen till MPASM finns på nerladdningssidan till MPLAB
hos Microchip. Där måste du ju ha varit för att få ner MPLAB...
Banksel *FINNS* med där.

> Det där med att ha olika kristaller är nog för knepigt för mig.

Ja, *nu* kanske. Just nu har du en massa annat att tänka på.
Du bör se til att skaffa lite "real stuff" att köra på så att du
kommer igång ordentligt.

> Det blir ju problem att läsa av värdena och resetta dem när
> programmet körs i en helt annan hastighet än räknaren.

Nej, det är det som blir *enkelt* med en separat kristall till timer1...

Men som sagt, det är inte mycket svårare att köra med den
ordinarie oscillatorn.

> Det ska iaf få en klocka att gå rätt...

Definiera "att gå rätt". Den kan aldrig gå mer "rätt" än den
kristall du använder. Räcker 50 ppm (normal standard kristall) ?

> och att jag fattar i princip noll av databladet...

Då har du två alternativ, läs om tills det fastnar, eller fråga om
det som är oklart. T.ex i beskrivningen av Timer1, *vad* är det
som är oklart ?
Rocky_AL
Inlägg: 617
Blev medlem: 7 december 2006, 15:14:50
Ort: Stockholm

Inlägg av Rocky_AL »

Jo lite riktiga prylar vore nog något för mig. Ska se om jag kan få iväg nått mail till jescab senare. Till att börja med får jag nog leka lite med enklare saker. Som att blinka en lysdiod. :lol:
Men i teorin så klarar jag nog av den biten. Fast det vore ju roligt att se att det verkligen fungerar.
Angående kristallen så hade jag funderingar på en kristall på 4 MHz med 10ppm då den faktiskt bara kostar 27 kr. Jag antar att man får ha en räknare som räknar upp till förslagsvis 50 000 och sedan gör en interrupt. I interupten så har jag en variabel som ökas med ett. När variabeln är uppe i 80 så har det gått en sekund :) och variabeln nollställs. en liten kod skulle verkligen hjälpa dock. Det är inte lite grejer att hålla reda på när man håller på med interrupts. :?
Det som jag finner (mest) oklart är hur man "enablar" timer1 och får den att göra en interrupt vid 50 000. Sedan fattar jag inte riktigt vilka saker som ska vara "enablade". Ex om den ska vara synkad eller inte och i största allmänhet vilka saker som måste göras för att få igång det hela. Lite exempelkod skulle som sagt inte skada.

Men nu måste jag nog gå och lägga mig, skola imorgon. Får försöka mer imorgon med att förstå det här.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Som att blinka en lysdiod.

Visst, men hur gör du det utan att ha något att *köra* lysdioden med ?
D.v.s lite "riktiga prylar" ?
Eller menar du att bara blinka med den rent teoretiskt ? Utan att
att testa i verkligheten ?

Ang 4 Mhz...
Om du ändå tänker välja kristall speciellt för denna "klocka", välj
en som enkelt går att dela ner till jämna sekunder binärt. T.ex
4.194304 Mhz istället för 4.0 Mhz. 4.194.304/65.536 = 64.
Alltså kan du låta Timer1 vara "freerunning" och räkna 64 avbrott
för en sekund...
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47013
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Inlägg av TomasL »

Det finns mängder av "PIC Tutorials" på nätet, bara att söka.

Andra hyffsade böcker är "PIC Cokbooks", finns på elfa, mängder av småprojekt, med bra genomgång av koden.

Vill du sedan börja med "C" så rekommenderar jag starkt WIZ-C från Fored.
En mycket kompetent grafisk utvecklingsmiljö för C, kostar en 5-hundring eller nåt sånt, tillsammans med deras utvecklingskort klarar du dig förmodligen under tusenlappen.
WIZ-C finns även som ASM miljö, heter då WIZ-ASM.
Du hittar dem på www.fored.co.uk.

Har en mycket bra PIC-tutor som jag kan maila till dig, PMa mig med din e-postaddress.


PS
WEBMASTER, kan vi ha en liten "file" area för sådanahär grejjor?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Det finns mängder av "PIC Tutorials" på nätet, bara att söka.

Visst, men som nybörjare är det väldigt svårt att bedöma kvalitetet på dom.
9 av 10 använder 16F84A, vilket till en början kan vara OK men som ganska snart blir lite fel.

Men kolla t.ex : http://www.voti.nl/swp/index.html
Eller PDF versionen : http://www.jescab.se/Starting_with_PICs.html
Användarvisningsbild
Tengil
Inlägg: 84
Blev medlem: 24 mars 2007, 00:15:46
Ort: Hudiksvall

Inlägg av Tengil »

Att räkna upp till 50000 är kanske inte så lyckat med en 8 bitars ALU.

Vad du kan göra är istället att sätta en pre-scaler för timer0. Det betyder att om du har en prescaler på tex 16 så tickar ditt TMR0 register upp var 16:e cykel. Om du använder en 4Mhz kristall eller oscillator får du en cykeltid på 1 us. En cykel inträffar var 4:e puls i oscillatorn. Dvs cykeltiden t = 1/(Fosc / 4). När TMR0 har nått sitt maximala värde av 255 och sedan återigen skall ökas en gång blir det "overflow", vilket innebär att TMR0 ställs tillbaks på noll igen samt att TMR0IF sätts. Dvs om du har aktiverat TMR0 interrupt hoppar programmet automatiskt in i din interruptrutin och du kan där öka den klocka du försöker styra. Sen gäller det bara att välja bra värden på kristallen och timer0's pre-scaler och du kan få rätt bra precision.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Att räkna upp till 50000 är kanske inte så lyckat med en 8 bitars ALU.

Nu gällde det faktiskt 16-bitars räknaren Timer1...

Ditt resonemang kring Timer0 gäller naturligtsvis även för Timer1 men
med Timer1 (som har sagts tidigare) får man ett längre och mer hanterligt
intervall mellan interrupten.
Skriv svar