Programmera 12F629, mystiska I/O pinnar?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Cenorpa
Inlägg: 737
Blev medlem: 11 juli 2005, 20:58:03
Ort: Stockholm | Borlänge
Kontakt:

Programmera 12F629, mystiska I/O pinnar?

Inlägg av Cenorpa »

Hejsan alla duktiga elektroniknissar!

Har för ett tag sen shoppat löss lite från Sodjan, varav några PIC 12F629 processorer som ska användas till ett projekt men jag kommer ingen vart med dessa
Snart kommer jag få grov kritik över programmeringsspråket jag använder men för tillfäller skriver jag i basic.

Nåväl, nu till problemet.

Inför varje ny processor jag använder så brukar jag prova med ett enkelt blinka led program för att testa så det funkar men nu har jag kört fast.

Har använt koden nedan för att blinka 3 lysdioder över tre av GPIO pinnarna men det är bara den sista som tänds av dom definierade pinnarna.

Ser koden ut såhär så blir enbart LED2 hög.

LED0 = 1
LED1 = 1
LED2 = 1


Såhär ser hela koden ut:

Kod: Markera allt


'*-----------------PIC 12F629 TEST-----------------*

LED0   var GPIO.0 
LED1   var GPIO.1 
LED2   var GPIO.2 

'*---------------------------------------------------------*
START:								

GOSUB	INIT   'Run Init.BAS


RUN:

LED0 = 1
LED1 = 0
LED2 = 0

PAUSE 250

LED0 = 0 
LED1 = 1
LED2 = 0

PAUSE 250

LED0 = 0 
LED1 = 0 
LED2 = 1		<--Detta är enda stället och enda utgången som blir hög.

PAUSE 250

GOTO RUN


'*---------------------------------------------------------*
'*Subroutine INIT
'*---------------------------------------------------------*
INIT:

OUTPUT GPIO.0 	
OUTPUT GPIO.1 			
OUTPUT GPIO.2 				

RETURN
'*---------------------------------------------------------*

END

Är det någon som ser vad felet är eller vad det är jag har glömt att göra? Det är säkert en jätte enkel grej
PS Sodjan, det kan bli aktuellt med lite mer shopping av dig snart 8)

Edit: Ändrade 12F626 till 12F629
Senast redigerad av Cenorpa 20 juli 2006, 19:24:22, redigerad totalt 1 gång.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Låter misstänkt likt :

http://www.elektronikforumet.com/forum/ ... hp?t=12153

Fast i det här fallet undrar jag om inte min första förklaring stämmer.

Har du gjort något för att ange om pinnarna ska vara analoga eller inte?

edit: Just det, glömde ju... BASIC? Bläää :wink:
Användarvisningsbild
Cenorpa
Inlägg: 737
Blev medlem: 11 juli 2005, 20:58:03
Ort: Stockholm | Borlänge
Kontakt:

Inlägg av Cenorpa »

Hmm, ska kika igenom JimmyAnderssons tråd.

Koden du ser är den jag har använt, pinnarna kan väl inte vara av analog sort på F629:an ?

Ändrade första inlägget lite...
Användarvisningsbild
JimmyAndersson
Inlägg: 26651
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

"Inför varje ny processor jag använder så brukar jag prova med ett enkelt blinka led program för att testa så det funkar men nu har jag kört fast."

Låter precis som om jag skulle ha skrivit det. :)

Motsvarande program i Mikrobasic för 12F675 (väldigt lik 629) skulle ha sett ut såhär:
(OBS: Problemet kvarstår, ville bara visa som jämförelse.)

Kod: Markera allt

'Använder interna oscillatorn.
'INTRC_OSC_NOCLKOUT ska vara satt i Project -> Edit -> Device Flags.
'MCLRE_ON ska också vara satt. (Datablad sid 52. sid 54 enligt Acrobat.)

'Fixar så att man skriva LED istället för GPIO
symbol LED0 = GPIO.0
symbol LED1 = GPIO.1
symbol LED2 = GPIO.2

sub procedure Init
   TRISIO = %00001000 ' Utgångar överallt, förutom GP3 är alltid ingång.
   IOC = %00000000 ' Interrupt on change - Disabled
   CMCON.CM2 = 1 ' Comparator OFF
   CMCON.CM1 = 1 ' Comparator OFF
   CMCON.CM0 = 1 ' Comparator OFF
   VRCON = 0 ' VoltRef (Comparator) off
   T1CON.TMR1ON = 0 ' Stoppar timern

   ANSEL.ANS3 = 0  ' Digital I/O
   ANSEL.ANS2 = 0  ' Digital I/O
   ANSEL.ANS1 = 0  ' Digital I/O
   ANSEL.ANS0 = 0  ' Digital I/O

   LED0 = 0
   LED1 = 0
   LED2 = 0
end sub


main:
  init

  while true
    LED2 = 1
    LED1 = 0
    LED0 = 0
    delay_ms(250)
    LED2 = 0
    LED1 = 1
    LED0 = 0
    delay_ms(250)
    LED2 = 0
    LED1 = 0
    LED0 = 1
    delay_ms(250)
  wend

end.
Det finns visserligen betydligt lättare sätt. Man kunde t.ex ha satt 4, 2, 1 (som blir 100, 010, 001) på porten.
Senast redigerad av JimmyAndersson 20 juli 2006, 19:36:00, redigerad totalt 1 gång.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Analoga kan de vara (den har ingen AD-omvandlare, men däremot komparator).

Och pinnarna brukar vara analoga som default på PIC.
Användarvisningsbild
JimmyAndersson
Inlägg: 26651
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Precis. Därav:

ANSEL.ANS3 = 0 ' Digital I/O
ANSEL.ANS2 = 0 ' Digital I/O
ANSEL.ANS1 = 0 ' Digital I/O
ANSEL.ANS0 = 0 ' Digital I/O

..plus resten i "Init" för att stänga av interrupt mm.
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Det är säkert en jätte enkel grej

Visst är det det ! ;-)

Slarvig genomläsning av databladet, helt enkelt.
Läs kapitlet om GPIO en gång till, *speciellt* lilla grå rutan
med ram runt där det står "Note:" i fet stil.

Att det står i en egen liten ruta betyder att det är *viktigt*... :-)

Från Jimmys kod:

> CMCON.CM2 = 1 ' Comparator OFF
> CMCON.CM1 = 1 ' Comparator OFF
> CMCON.CM0 = 1 ' Comparator OFF

"CMCON = 7" är lite enklare (fast jag hade angivit "7" som en binär konstant).

ANSEL saknas på 629'an, och kommer att (eller bör) ge fel vid kompileringen.
Så glöm ANSEL...

EDIT : En sak till...
Notera att när man sätter enstaka bitar på samma port direkt eftervarandra,
så *kan* man åka på R-M-W problemet. Om det går i den Basic som
används, så kan man lägga in en eller två NOP mellan varje kommando.
Jag antar att "LED0 = 0" kompileras som en "BCF ...."
Användarvisningsbild
Cenorpa
Inlägg: 737
Blev medlem: 11 juli 2005, 20:58:03
Ort: Stockholm | Borlänge
Kontakt:

Inlägg av Cenorpa »

Nämen, vilka snabba svar, och det funkar till och med!

Lade till det Sodjan föreslog med CMCON=7 och det funkar nu, men jag skulle vilja ha en lite närmare beskrivning på vad CMCON gör för något, någon som är sugen på att förklara?

Kollade i databladet, och visst, där var den där lilla lömska rutan, trots att jag läst det kapitlet så hade jag missat den, fy på mig :oops:

Men tack för hjälpen!

Edit:

Kom på att jag nåste fråga en till sak, är denna pic väldigt känslig för störningar?
Nu driver jag den från ett batterpack genom en 7805 reg. men tar jag på regualtorns GND pinne så stannar picen. :?
Användarvisningsbild
JimmyAndersson
Inlägg: 26651
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Kul att det fungerar!

Måste ändå säga att databladet för 12F675/629 är lite ..ihop-pressat. T.ex "Interrupt" finns under "Special features of the CPU". Så är det inte för databladen i t.ex 18F-serien som har många fler funktioner och kapitel.
"Den lilla lömska rutan" är däremot tydlig. Det gäller bara att hitta den.. :wink:

edit:
"Kom på att jag nåste fråga en till sak, är denna pic väldigt känslig för störningar?"

Det mesta (särskillt det som sitter på en labbplatta) är känsligt för störningar. Standard-reglerna brukar vara:
*Inga oanslutna ingångar.
*Korta anslutningar till (speciellt) matningspänningen.
*Avstörnings-konding på ca 100nF. (0.1µF)

En människa är en lysande antenn för att plocka upp diverse störningar. Sätter man fingret nära en labplattan som inte har det jag listade ovan så kan det mesta hända.
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

"CMCON" = "CoMparator CONfiguration"

> Kollade i databladet...

Kolla även upp CMCON när du ändå är uppe i varv... :-)

Tips : behåll databladen som PDF, då går det snabbt att trycka ctrl-F
och söka efter register. Men det är klar, kapitlet om "Comparator"
är väl inte någon dålig gissning...

Jimmy> T.ex "Interrupt" finns under "Special features of the CPU".

Gäller allmänt för PIC16-serien.
12F är väldigt enkla processorer och databladet är tunt som ett höstlöv... :-)

Jimmy> "Den lilla lömska rutan" är däremot tydlig. Det gäller bara att hitta den..

Alltså , databladet ska läsas pärm till pärm innan man skriven en enda
rad kod, så det *går* inte att missa någonting... :-)

Jimmy> Standard-reglerna brukar vara:

Vill lägga till: MCLR via 10Kohm till 5V.

> Kom på att jag nåste fråga en till sak, är denna pic väldigt känslig för störningar?

Inte mer än någon annan.
Användarvisningsbild
Cenorpa
Inlägg: 737
Blev medlem: 11 juli 2005, 20:58:03
Ort: Stockholm | Borlänge
Kontakt:

Inlägg av Cenorpa »

Hmm, så du säger att saker på labbplattor kan bli utsatta för störningar :lol:
(Kollade med scopet på ett project på labbplattan förut och kunde se de mest märkliga fenomenen...)

Här gäller det alltså att avkoppla det mesta, men när det kommer bli fastlött på ett kretskort så blir det nog inte lika känsligt.

Fast lite skumt var detta fenomen, har aldrig hänt med den gamla goda 16F84:an vad jag kan minnas. :wink:

Men en lite gullig krabat är den där lilla F629:an iallafall. 8)
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> har aldrig hänt med den gamla goda 16F84:an

Allt kan hända med vilken modell som helst, om man gör fel.
Jag är säker på att jag skulle kunna få en F84 att uppträda märkligt
med lite "våld"... :-)
Användarvisningsbild
JimmyAndersson
Inlägg: 26651
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

"Vill lägga till: MCLR via 10Kohm till 5V."

Tur att du är med!
Jag tror att jag ska gå ut och rasta hjärnan eller nåt.. :oops: :)
Användarvisningsbild
Cenorpa
Inlägg: 737
Blev medlem: 11 juli 2005, 20:58:03
Ort: Stockholm | Borlänge
Kontakt:

Inlägg av Cenorpa »

Ghhaaaaa, hur kunde jag missa MCLR?!, nu är jag helt trög i huvet, en sådan självklar sak :evil:
Nej, nu är det bäst att gå och lägga sig, imorgon ska man upp tidigt o jobba :D
Användarvisningsbild
JimmyAndersson
Inlägg: 26651
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Se till så att du även konfigurerar MCLR rätt. Annars har du en PIC-krets mindre.
Skriv svar