Sida 2 av 4

Postat: 8 mars 2007, 18:46:32
av Christoffer
För säkerhets skull så ändrade jag tillbaka till MCLRE. Har ingen lust att köpa någon nu programmerare så jag får lossa MCLR efter programmeringen, det är OK.
Testade med PORTA = 1 och sedan PORTA = 3, då funkar det bra. Mitt tidigare sätt funkar bra på PORTB, konstigt. Men nu funkar timern som den ska.

Kommandona ligger i två loopar med "delay" eftersom dioderna skall tändas en efter en i en viss takt, som beror på vad timern är ställd på. 5, 10, 15...min. En loop för PORTB, som nu räknar upp 1, 3, 7, 15 osv. och sedan en för PORTA

Timern räknar alltid från 0 - 100%, som när man laddar ner en fil (eller programmerar en PIC). Det ska bli ett handikapphjälpmedel för ett barn med autism som inte förstår tid och inte vet hur länge olika aktiviteter ska hålla på.

Jag har letat en del i databladet, men det står bara om analog input och jag har satt dessa pinnar som output (datablad på 170 sidor är inte precis min grej).

Postat: 8 mars 2007, 19:35:17
av Icecap
Tidstocken finns redan, min son använder en (han har, som jag, Aspergers Syndrom). Jag har dock tänkt på att göra en bättre version då den verkar onödigt primitiv men tiden räcker inte till.

Jag kan även behöva en själv men jag klarar mig med en Pocket PC för att hålla reda på när jag ska hämta barnen från fritis osv.

Postat: 8 mars 2007, 21:15:38
av Christoffer
Jodå, det finns en version som kallas timstock (i 4 olika vesioner och är utvecklad i Lund på Certec, LTH) och det finns även några andra liknande varianter. Det finns även många andra visuella tidshjälpmedel, men den här är till en speciell person och då är det ju bra att göra den själv, så blir den exakt så som jag vill ha den. Den här ska ändra hastighet utefter vad man ställer in den på. Timstocken tänder bara upp några dioder om man väljer liten tid och många om man väljer full tid. Sedan finns bara fyra val att göra, den här ska klara från 5 min till en timma med 5 min intervall att välja på. Och Timstocken räknar ner. Denna här skall räkna upp. Dvs visa hur mycket av aktiviteten jag har gjort, inte hur lång tid som är kvar. Sedan tänkte jag göra den som en liten fyrkantig tavla. Då kan man sätta upp en bild på den aktiviteten man håller på med och så har man stapeln under.

Postat: 8 mars 2007, 21:16:41
av Icecap
Låter klart vettigt!

Postat: 8 mars 2007, 22:01:07
av sodjan
> Testade med PORTA = 1 och sedan PORTA = 3, då funkar det bra.
> Mitt tidigare sätt funkar bra på PORTB, konstigt.

Tycker inte om att upprepa vad jag redan har skrivit, men *har* du
stängt av de analoga funktionerna på PORTA ?? Se "Example 5-1"...

Postat: 9 mars 2007, 10:21:00
av Christoffer
Jag har försökt använda mig av databladet, men blir inte så mycket klokare av det. Exempel 5:1 förstår jag inte riktigt eftersom jag inte satt mig in i Assembler, utan nöjer mig med microBasic. Det är nog dumt gjort, men jag känner mig lite mer hemma med basic .

så här ser min code ut för att räkna upp timern och tända dioderna. Allt funkar som det ska nu. Coden är idag för 10 dioder, men jag kommer att ha 12 + en tryckknapp.

program timerklocka
const tid as longint = 1000
dim i as integer
dim j as integer

main:
TRISB = 0 ' confogurerar portb output
TRISA = 0 ' confogurerar porta output
PORTB = %00000000 ' släcker alla dioder portb
PORTA = %00000000 ' släcker alla dioder porta

delay_ms(tid) 'här kommer knapploopen läggas, se nedan

i = 0
do
j = i
i = i + 1
PORTB = i + j ' tänder dioder på portb
delay_ms(tid)
i = i + j
loop until i = 255

i = 0

do
j = i
i = i + 1
PORTA = i + j ' tänder diobder på porta
delay_ms(tid)
i = i + j
loop until i = 3

goto main ' här kommer sedan belönings effekten, rinnande ljus.

end.

Jag vet att koden i looparna går att optimera och att j inte behövs, men det kommer senare.
Sedan kommer jag att ha en tryckknapp, man startar timern genom att hålla in knappen. ju längre man hhåller in knappe ju fler dioder tänds. Varje diod motsvarar då 5 min. När jag sedan släpper knappen så startar timern och börjar räkna upp tills alla dioder är tända då kommer ett rinnande ljus i en oändlig loop. tills man slår av strömbrytaren. Här tänkte jag även ha något enkelt ljud.

Postat: 9 mars 2007, 10:27:00
av Icecap
Nu suger BASIC ju tungt men du har helt säkert gjort minst 2 tabbar:

Initialize:
TRISB = 0 ' configurerar PORTB output
TRISA = 0 ' configurerar PORTA output
PORTB = %00000000 ' släcker alla dioder portb
PORTA = %00000000 ' släcker alla dioder porta
' här har du låtit bli att stänga av Comparatorfunktionen! Detta MÅSTE göras för stabil funktion!
main: ' Här ska den vara, man ska inte initialisere allting varje loop!

delay_ms(tid) 'här kommer knapploopen läggas, se nedan

i = 0
do
j = i
i = i + 1
PORTB = i + j ' tänder dioder på portb
delay_ms(tid)
i = i + j
loop until i = 255

i = 0

do
j = i
i = i + 1
PORTA = i + j ' tänder diobder på porta
delay_ms(tid)
i = i + j
loop until i = 3

goto main ' här kommer sedan belönings effekten, rinnande ljus.

Postat: 9 mars 2007, 10:40:18
av Christoffer
Tack för rådet, ska fixa det genast. (hur stänger man av den?). Ska även dim och const ligga innuti Initialize?

Jag kommer att lägga main här istället än så länge. eftersom hela main blir en loop under testperioden. och jag vill släcka alla dioder varje gång.

TRISB = 0 ' configurerar PORTB output
TRISA = 0 ' configurerar PORTA output

main:
PORTB = %00000000 ' släcker alla dioder portb
PORTA = %00000000 ' släcker alla dioder porta

Postat: 9 mars 2007, 10:53:16
av Icecap
Hänvisar till sodjans senaste svar, kombinera detta med databladet och du har allt du behöver i detta.

Postat: 9 mars 2007, 12:30:34
av sodjan
> Exempel 5:1 förstår jag inte riktigt eftersom jag inte satt mig in i Assembler,
> utan nöjer mig med microBasic.

OK, och p.g.a av det så behöver du mer hjälp här än vad som kanske vore rimligt... :-)

Det är svårt att programmera i vilket språk som helst utan att ha en
grundläggande kunskap om assembler. T.ex så *måste* man kunna
"översätta" den väldigt enkla koden i "Exemple 5-1" till Basic, C, Pascal
eller vad man nu har valt att köra med.

Du har ju lyckats skriva Basic kod för att hantera TRISx registren, och då
är ju steget väldigt kort till att göra (i princip) samma sak med CMCON.

Om du *inte* sätter CMCON enligt "Exemple 5-1" så får du exakt det
fenomen som du har sett hela tiden.

Postat: 9 mars 2007, 12:55:50
av Christoffer
OK. Här är ett försök.
ADCON1 = 0x0F ' sätt till digital (funkar ej, Identifier 'ADCON1' was not declared)
CMCON = 0x07 ' stäng av Comparatorfunktionen, funkar bra

Postat: 9 mars 2007, 13:02:48
av sodjan
> ADCON1 = 0x0F '

Var fick du "ADCON1" från ??
Jag har sökt igenom hela PDF'en med
databladet och det nämns inte någonstans...

Postat: 9 mars 2007, 13:18:12
av Christoffer
Det stod så i microBasic hjälpen att det skulle vara så för PIC16. Men eftersom det inte funkar så måste man nog deklarera ADCON1 först på något sätt. Men eftersom allt fungerar bra nu så hoppar jag över det.
CMCON = 0x07 funkar bra, så det blev i alla fall några förbättringar.

Postat: 9 mars 2007, 13:52:58
av sodjan
> Det stod så i microBasic hjälpen att det skulle vara så för PIC16.

"PIC16" är en hel familj med ett 100-tal olika processorer.
Det är väldigt stora skillnader på vad som finns och *inte* finns
i de olika modellerna...

Läs dokumentationen från Microchip istället (eller också, kanske).
*Speciellt* databladet för den processor du använder. Du kommer aldrig
atr komma någonstans utan att kunna hitta och läsa i databladet...

> Men eftersom det inte funkar så måste man nog deklarera ADCON1
> först på något sätt.

Absolut *INTE* !
Det finns *inget* som heter "ADCON1" i den processor du använder !
Som sagt, kolla databladet...

Postat: 10 mars 2007, 18:52:19
av Christoffer
Nu har jag fått mina 12 LED att tändas i rätt följd. Har även kopplat in en knapp som startar det hela. Allt funkar som det ska. Men som vanligt så funkar inte allt som jag tror. Jag har satt PORTA.4 som input och jag läser av ifall PORTA.4 är hög. Knappen är tryckt och allt startar. Men sedan lägger jag in en delay och kollar igen om knappen fortfarande är tryckt, i så fall vill jag att en LED ska tändas och tiden på timern ska öka med 5 min. Även om knappen inte är tryckt längre så får jag fortfarande PORTA.4 hög? Jag har provat följande kommando Button(PORTA, 4, 1, 0) i olika IF-satser men hur jag en gör så är PORTA.4 hög. Ska jag nollställa den på något sätt innan jag kollar igen?

Det här blev lite kryptiskt, hoppas någon förstår vad jag menar