Sida 1 av 2
skumma fel med 16F874A
Postat: 23 juli 2005, 22:37:02
av Robert Nielsen
Håller på och sätter mig in i hur 16F874an fungerar men har stött på två problem som jag hoppas nån kan hjälpa mig med
1.
Har skrivit ett rinnande ljus men men när man kopplar flera lysdioder på varje port (om dom lyser samtidigt) så stannar processorn och dioderna lyser konstant. Har använd samma program till en 16F628 och då fungerar det.
Har jag en diod på varje port så kan de lysa samtidigt.
Vad beror detta på???
Kan jag inte driva dioderna direkt från processorn som man kan på 16F628an???
2.
Jag kan inte få input att fungera på processorn. Jag har användt exempelvis denna kod: (mikroBasic)
Kod: Markera allt
TrisA = 0
TrisB = 255
If PortB.0 = 1 then
PortA.0 = 1
End if
PortA.1 = 1
delay_ms (850)
PortA.0 = 0
PortA.1 = 1
Sen en loop till baka till början. Dioden på portA.1 blinkar men inte på PortA.0
Har provat samma kod på en 16F628 och då fungerar det.
Är det något som skiljer dessa processorer när man ska skriva koden till dom. Olika komandon???
Postat: 23 juli 2005, 23:09:32
av sodjan
Vad menar du med att "driva dioderna direkt från processorn" ?
Du måste naturligtsvis ha ett strömbegränsningsmotstånd också, eller hur ?
Vad menar du med "kopplar flera lysdioder på varje port" ??
Flera till samma pinne ? Och i så fall, hur då ?
Koden du har klippt in kan knappast fungera. Du säger "Sen en loop till baka till början", men då behöver du en goto (eller hur man nu gör i Basic...) Posta hela snutten så att det går att se vad du gör i verkligheten, inte vad du *tror* att du gör.
Konstigt att PortA.1 "blinkar", du sätter den ju aldrig = 0.
menar du inte tvärt om ?
>> "Har provat samma kod på en 16F628 och då fungerar det."
Högst osannolikt, i all fall inte koden du har visat *här*. Kanske någon annan, mer komplett kod, som du har själv, men det är det ju svårt att ha någon uppfattning om...
>> "Är det något som skiljer dessa processorer..."
The data sheets are your friends...
Jo, det är massor som skiljer. Inte olika "kommandon", men en hel del skillnader i arkitekturen...
Postat: 24 juli 2005, 09:54:24
av Robert Nielsen
Jag har inte användt några motstånd då processorn har inbygd strömbegränsning på 25mA
Varje port har olika pinnar ex. PortB har 8 pinnar altså kan jag analuta 8 dioder som kan styras individuelt.
Härkommer koden, satt vid fel dator när jag skrev förra inlägget, men jag la in koden som ett exempel.
Kod: Markera allt
Main:
Cmcon = 7
TrisA = 255
TrisB = 0
If PortA.0 = 1 then
PortB.0 = 1
delay_ms (250)
PortB.1 = 1
delay_ms (250)
PortB.2 = 1
delay_ms (250)
PortB.3 = 1
delay_ms (250)
PortB.0 = 0
delay_ms (250)
PortB.1 = 0
delay_ms (250)
PortB.2 = 0
delay_ms (250)
PortB.3 = 0
delay_ms (250)
end if
PortB.4 = 1
delay_ms (250)
PortB.4 = 0
delay_ms (250)
goto main
end.
Jag vet mycket väl att det skilljer massor i utseende och antalet i/o, olika stort minne mm. Men jag undrade om det krävs extra komandon. Jag hade liknande problem på 16F628 men då visade det sig att man var tvungen att stänga av komparatorn. (som jag även har provat på denna processorn)
Jag har läst i databladet men det är ju bara kodexempel skrivna i asembler.
Postat: 24 juli 2005, 12:56:16
av Schnegelwerfer
Jag har läst databladet, och inte hittat någon inbyggd strömbegränsning på 25mA. Däremot är "Absolute Maximum Rating" för I/O-portarna 25mA, det är stor skillnad!
Du överbelastar helt enkelt portarna, och då kan vad som helst hända!
Pilla dit strömbegränsningmotstånd så kommer det nog att fungera.
Postat: 24 juli 2005, 13:30:49
av sodjan
> "då processorn har inbygd strömbegränsning på 25mA "
HELT FEL !!!
Du får under inga omständigheter "dra" mer än 25 mA från en enskild pinne på en PIC (finns ett par undantag). Slå något tungt i huvudet på den som som sagt det till dig...
Observera också att man inte kan dra 25 mA från ALLA 8 bitarna i samma port samtidigt. Samt att det även finns ett max för *HELA* kretsen !! V.v. läs "Absolute Maximum Ratings" i data bladet !
Det är möjligt att man kan pressa ut mer än 25 mA från en pinne, men då kör du "out of spec" och får skylla dig själv om det inte fungerar...
> "Jag har läst i databladet..."
Å f-n !
> men det är ju bara kodexempel skrivna i asembler."
Självklart, alla "riktiga" programmerare kör med assembler...

Postat: 24 juli 2005, 15:19:55
av Robert Nielsen
Strömmen som flöt genom dioden var 23mA, 2mA under vad man får ta ut.
Har 5 dioder kopplade till samma port 5 * 23 = under de 200mA som max får belasta samma port med.
Det hjälpte att använda motstånd så den inte hängde sig, men inputen fungerar ändå inte.
Postat: 24 juli 2005, 15:42:36
av sodjan
Vad är anslutet till PortA.0 ??
Och vad betyder "inputen fungerar inte" ??
Vad förväntar du dig skall hända, och vad händer istället ?
För övrigt behöver du inte sätta om CMCON, TRISA och TRISB varje "varv" i din loop.
Har du kollat vilken assebler kod som Basic kompilatorn genererar, så att det inte är något "konstigt" där ? (Detta är en av anledningarna till att man ska kunna assembler, så att man kan läsa assembler listorna från kompilatorer...)
Postat: 24 juli 2005, 17:14:35
av Robert Nielsen
PortA.0 är ansluten till en brytare med pulldown.
Det jag vill med brytaren är att ljuset ska "rinna" så länge som brytaren är till (ingången hög). Istället blinkar PortB.4
Det verkar ju som att den inte detekterar att det finns en etta på PortA.0.
Jag har kollat asemblerkoden men begriper inte något av det som står där. Så det är ju inte så lätt att se om det är rätt.
Postat: 24 juli 2005, 17:25:20
av Schnegelwerfer
Nu kan jag inte Pascal, men borde inte språket göra skillnad på tilldelning av variabler och test av variabler (jfr = och == i C)
Du har ju samma syntax i:
If PortA.0 = 1 then (detta skall ju testa bit 0 i PortA)
Som i:
PortB.0 = 0 (detta skall ju tilldela PortB.0 värdet 0)
Hmm.. hoppas du förstod vad jag menade.
Postat: 24 juli 2005, 18:07:56
av Robert Nielsen
Förstår inte riktigt vad du menar.
Var kom Pascal in i bilden???
Postat: 24 juli 2005, 18:20:31
av Schnegelwerfer
Menade naturligtvis Basic.
Vad jag menade var att många språk använder olika "=" beroende på om du vill sätta en variabel eller testa variabeln i fråga.
Postat: 24 juli 2005, 18:41:45
av mullemeck
Du kan ju kolla för säkerhets skull att där verkligen kommer in +5v till PortA.0 när du trycker på din brytare så det inte är nått hårdvarufel som spökar.
annars kan du ju testa en annan port, kan ju va att just porta.0 är trasig eller nått i den stilen.
Postat: 24 juli 2005, 18:59:53
av sodjan
Har du sett en lilla rutan där det står "Note:"
på sidan där PORTA beskrivs i data bladet ??
Och kodexemplet på samma sida ?
Har du läst igenom vad som gäller för PORTA ?
Har du satt PORTA till digital I/O ?
PORTA är sannolikt inte trasig, den är bara inte konfigurerad på rätt sätt...
Postat: 24 juli 2005, 19:42:07
av Robert Nielsen
Har mätt och jag får fram 5volt till pinnen.
Jag har läst den sidan men blir inte klokare, Har provat med ex. TrisA.0 = 1
Fungerar ändå inte.
Har även provat med PortA PortC PortD men ingen fungerar som input.
Att det är något konfigruationsfel har jag också räknat ut, men vad är fel.
Det står något om analog input men hur stänger man av det???
Postat: 24 juli 2005, 19:44:30
av Icecap
Man kollar det register som de hänvisar till såklart!
Man kan även (samma sak) kolla upp de analoga funktioner och hur man slår av dom, det har jag gjort och det fungerar alldeles utmärkt.