Hjälp med Hello World program

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Appotus
Inlägg: 52
Blev medlem: 20 januari 2008, 15:39:19
Ort: Borås
Kontakt:

Hjälp med Hello World program

Inlägg av Appotus »

Har nu fått min PICKit 2 och har testat att programmera in några av test programmen som var med. PICen som följde med var en PIC16F690. Alla exempel som följde med var skrivna i assembler.
Går det att programmera i C till denna PICen?
Hur ska jag då ställa in i MPLAB IDE och finns det någon bra tutorial man kan kika på?

Första exempel programmet tände bara en LED på demo kortet. Nu vill jag veta hur jag ska göra för att den ska tänka både första och andra LEDen.

Koden:

Kod: Markera allt

#include <p16F690.inc>
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
     org 0
Start:
     bsf     STATUS,RP0       ; select Register Page 1
     bcf     TRISC,0          ; make IO Pin C0 an output
     bcf     STATUS,RP0       ; back to Register Page 0
     bsf     PORTC,0          ; turn on LED C0 (DS1)
     goto    $                ; wait here
     end
Jag har försökt lite som att t.ex. lägga in bcf TRISC,1 och bsf PORTC,1 då tändes endast andra LEDen.

Men skulle helst som sagt vilja programmera i C istället.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Alla exempel som följde med var skrivna i assembler.

BRA !

> Går det att programmera i C till denna PICen?

Ja visst, men strunta i det så länge.

> Nu vill jag veta hur jag ska göra....

Läs databladet !

> Jag har försökt lite som att t.ex. lägga in bcf TRISC,1 och bsf PORTC,1 då tändes endast andra LEDen.

Exakt.
Och varför framgår av databladet.
Processorn gjorde precis som du bad den om.

> Men skulle helst som sagt vilja programmera i C istället.

Det skulle inte hjälpa dig ett smack just nu.
Felet ovan med TRISx skulle du lika gärna kunna göra i C...
Appotus
Inlägg: 52
Blev medlem: 20 januari 2008, 15:39:19
Ort: Borås
Kontakt:

Inlägg av Appotus »

Har läst databladet, det är en guide för folk med viss assembler vana. Har ingen assembler vana. Tror jag skulle känna mig mer hemma i C.

Och vad var felet med TRISx?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Om du vill programmera i C så måste du skaffa en C-kompilator. Microchip har ingen för 16F serien vad jag känner till. Däremot finns det en kompilator på hsoft.com (möjligen att den följer med senaste versionen av MPlab).

Det lättaste sättet att starta ett projekt för att skica C-kod är att leta upp ett färdigt på nätet och utgå från det.

Annar kör du "project wizard" och väljer under "Active Toolsuite" den kompilator du vill att MPlab skall använda.

glöm inte att lägga in vilkent "linker script" som du ska använda. Du högerklickar på mappen "linkerscript" -> add och därefter får du leta upp en fil som heter samma som din processor. Ibland finns det två att välja mellan, t.ex 16f690.lkr samt 16f690i.lkr. 'i' varianten är till för om man ska köra t.ex ICD2 debuggern.

angående problemet med dina pinnar så vet jag inte riktigt vad problemet är. Ett tips ärköra Debugger->select tool-> MPLAB SIM. Då kan du köra koden i mplab utan att behöva programmera om PIC processorn mellan varje test. Lägg till PORTC samt TRISC i watch-window och se vad som händer med registerna.

Du väljer själv om du ska köra C eller Asm. Om du kör asm vet du EXAKT vad som händer och vilka register som sätts osv.
kör du C är det lättare att få överblick, istället för att skriva 3 rader kod kan du t.ex skriva PORTC |=0x01; vilket jag tycker underlättar när man letar fel.
Bitoperationer på registerna ta reda på vad de gör kommer du inte undan med vilket språk du än väljer.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Och vad var felet med TRISx?

OK. Först, vad menar du med att "lägga in bcf TRISC,1 och bsf PORTC,1" ?
Hur då ? Menar du lägga *till* eller att *ersätta* det du hade tidigare ? Visa med kod !

Och, som jag sa tidigare, just nu har du så dålig förståelse för hur en PIC
fungerar så det är helt ovidkommande vilket språk du använder...

> Har läst databladet, det är en guide för folk med viss assembler vana.

Total fel !!
Det är en specifikation över hur processorn fungerar.
Sen finns det en del kodexemepl som är i assembler därför
att dt blir tydligast och enklast så.

> Har ingen assembler vana.

Skaffa det då.
Du kommer inte att kunna programmera i något annat språk om du inte
även kan assembler. Vad är problemet ?
Användarvisningsbild
Icecap
Inlägg: 26611
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Lite brutalt: Om du inte vet hur du ska styra kretsen i assemebler lär du knappast göra det i C heller!

Ditt problem med TRISx löser du INTE med C eller ASM, det löser du vid att läsa databladet på den valda processor, det beskrivs i klar tal vad och hur och det ges exempel i ASM.

Själv kör jag C om jag kan men jag har å andra sidan ett ganska djupt kunnande om µC.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

>> Jag har försökt lite som att t.ex. lägga in bcf TRISC,1 och bsf PORTC,1 >>då tändes endast andra LEDen.

>Exakt.
>Och varför framgår av databladet.
>Processorn gjorde precis som du bad den om.

Vart står detta i databladet? Jag har läst det men förstår fortarande inte "det uppenbara felet".

Enligt inlägget har han "lagt till" inte "ersatt" och sätter tris till 0 = utport samt sätter biten på porten. Jag är väldigt nyfiken på vad felet är. Om det är så att han faktiskt ersatt istället för att lägga till så är detta ett "logiskt fel" och svaret står INTE i databladet såvitt jag vet.

>> Men skulle helst som sagt vilja programmera i C istället.

>Det skulle inte hjälpa dig ett smack just nu.
>Felet ovan med TRISx skulle du lika gärna kunna göra i C...

Varför skulle inte detta hjälpa? att ha 2 olika moment som man inte behärskar är väl svårare att bemästra än enbart 1?

Det som verkar vara jobbit är
1. databladet, mycket information där allt verkar superviktigt.
2. assembler som han uppenbarligen inte sysslat med tidigare.

Att ställa in registerna på rätt sätt är kanske enklare för denna killen än att trixa i assembler. Själv lärde jag mig pic genom att progga C. Assembelvanan har kommit efterhand när man behövt göra specifika initieringar för att skriva till t.ex eeprom eller flash.


Anledningen till att jag håller på här och är uppkäftig och bitchar är att jag blev ganska irriterad på de otrevliga svar Appotus fått. Han har pressenterat ett problem, skrivit ner kod osv. givetvis fattas det en del information för att fullständigt lösa problemet, men det är ju helt naturligt eftersom han själv inte löst det och vet inte vad som är viktigt.

Att skriva "LÄS DATABLADET" eller "SKAFFA ASSEMBELVANA DÅ!!" tycker inte jag är till någon hjälp. Problemet är väl att man inte alltid förstått databladet?
Snälla, kan ni inte vara lite trevligare och t.ex ge lite tips till hur man förstår databladet eller hur man lättast skaffar assembelvana?

/ Daniel
Appotus
Inlägg: 52
Blev medlem: 20 januari 2008, 15:39:19
Ort: Borås
Kontakt:

Inlägg av Appotus »

Tack Daniel. Tycker också svaren har mer vart RTFM och det har jag men får inte ihop det endå.

Koden:

bsf STATUS,RP0 ; select Register Page 1
bcf TRISC,0 ; make IO Pin C0 an output
bcf TRISC,1
bcf STATUS,RP0 ; back to Register Page 0
bsf PORTC,0 ; turn on LED C0 (DS1)
bsf PORTC,1
goto $ ; wait here

Så ser min kod ut just nu och den tänder endast lysdioden på RC1. Tar jag bort det fetstilta i koden så lyser endast lysdioden på RC0. Det jag vill är alltås att både RC0 och RC1s lysdioder ska lysa.

Letar fortfarande om någon vet någon fin tutorial för att progga i C med MPLAB.
Användarvisningsbild
Icecap
Inlägg: 26611
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

OK, felet kan mycket lätt vara R-M-W-problemet och jag ska (kortfattat) vad som kan orsaka det:
En processorcykel består av 4 kristallklockar, varje klocka utlöser en viss funktion.

Vid en R-M-W (Read-Modify-Write) är detta just vad som sker: Den läser en byte (TRISx), modifierar och skrivar tillbaka.

Detta betyder att om tiden mellan en skrivning och en läsning är för kort hinner byten inte att ändra den skrivna bit och detta kan lätt ske med detta program.

Lösningen då? Enkel:

Kod: Markera allt

banksel TRISC ; Select correct Register Page
bcf TRISC,0 ; make IO Pin C0 an output
nop ; give it some time to catch up
bcf TRISC,1
banksel PORTC ; Select correct Register Page
bsf PORTC,0 ; turn on LED C0 (DS1)
nop ; give it some time to catch up
bsf PORTC,1
goto $ ; wait here
Edit: bästa lösningen hade förvisso varit:

Kod: Markera allt

banksel TRISC ; Select correct Register Page
movlw b'11111100' ; Load pattern to AND with
andwf TRISC,F ; And the pattern and store result in TRISC
banksel PORTC ; Select correct Register Page
mowlw b'00000011' ; Load pattern to OR with
iorwf PORTC,F ; OR the bits in and store result in PORTC
goto $ ; wait here
men då jag antar att det bara var "lek" är detta av rent akademisk intresse.

Edit: kommentarer tillagd.
Appotus
Inlägg: 52
Blev medlem: 20 januari 2008, 15:39:19
Ort: Borås
Kontakt:

Inlägg av Appotus »

Testade din kod men fick samma resultat RC1 är den enda som lyser. Men fick lite varningar när jag byggde det så bytte tillbaka från banksel till STATUS.

Kod: Markera allt

     bsf     STATUS,RP0       ; select Register Page 1
     bcf     TRISC,0          ; make IO Pin C0 an output
     nop
	 bcf	 TRISC,1
     bcf     STATUS,RP0       ; back to Register Page 0
     bsf     PORTC,0          ; turn on LED C0 (DS1)
	 nop
	 bsf	 PORTC,1
     goto    $                ; wait here
Så ser min kod ut just nu, men felet kvarstår. RC1 lysdioden är den enda som lyser fortfarande.

EDIT: Trycker jag ner knappen nu med koden ovanför inladdad så slocknar LEDen.

EDIT 2: Nu fungerar det som jag vill. Nu lyser både RC0 och RC1. Men skulle du kunna beskriva koden du har gjort på ett lättförståligt sätt. Så jag kan förstå vad som egentligen händer. Undrar också lite över varför LEDsen slockarna när jag trycker på knappen.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Vart står detta i databladet?

1. I den lilla gråa rutan med "Note:" i fet stil på sidan 76. Att det står "Note:"
och att rutan är grå betyder att det som står där är *VIKTIGT*.

2. Det står även i själva texten på samma sida. Om det är något där i texten
som är oklart så är det bara att fråga.

3. Exempel 4-4 (fortfarande på samma sida) visar även med färdig kod hur
det ska se ut.

Sista meningen i den grå rutan är själva nyckeln "Pins configured as analog
inputs will read ‘0’".
Appotus
Inlägg: 52
Blev medlem: 20 januari 2008, 15:39:19
Ort: Borås
Kontakt:

Inlägg av Appotus »

Hittade det du menade.

BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;
CLRF PORTC ;Init PORTC
BSF STATUS,RP1 ;Bank 2
CLRF ANSEL ;digital I/O
BSF STATUS,RP0 ;Bank 1
BCF STATUS,RP1 ;
MOVLW 0Ch ;Set RC<3:2> as inputs
MOVWF TRISC ;and set RC<5:4,1:0>
;as outputs
BCF STATUS,RP0 ;Bank 0

Detta är det jag inte förstår. Vad är CLRF? Vad innebär CLRF PORTC? Vad är det för banker eller register som det står om? CLRF ANSEL?

Hur kan MOVLW 0Ch sätta 3 och 2 som input? 3 och 2 nämns ju inte.
Samma med MOVWF TRISC hur vet den att det är just 5,4,1 och 0 som ska bli ouput?

Vad betyder MOVLW och MOVWF?
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Finns ju knappast någon anledning att kopiera det som
redan finns bra beskrivet, så...

> Vad är CLRF?

Sidan 220 i databladet.

> Vad är det för banker...

Kapitel 2.2 på sidan 26 i databladet.

> eller register

Kapitel 2.2.2 på sidan 26 i databladet.

> Hur kan MOVLW 0Ch sätta 3 och 2 som input?

Läs på om hexadecimala tal, t.ex : http://en.wikipedia.org/wiki/Hexadecimal

> Samma med MOVWF TRISC hur vet den att det är just 5,4,1 och 0 som ska bli ouput?

Tillsammans med MOVLW direkt ovanför. Och se svaret på föregående fråga.

> Vad betyder MOVLW och MOVWF?

Sidan 222 i databladet.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Bara en liten kontrollfråga...

Har du läst databladet alls ??

Jag vill också poängtera att (om det inte var tydligt förrut) att
skriva i t.ex C gör inte att man kan slarva med databladet. Du
har exakt samma behov av att kunna databladet näst intill
utantill helt oberoende på vilket språk du kör med. Inte ord för
ord kanske, men du måste veta *vad* som finns i databladet så
att du snabbt hittar det när du behöver det.

EDIT: Se gärna även : http://www.jescab.se/Datablad.html
Det är avsett att vara till hjälp just i din situation.
bos
Inlägg: 2306
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg av bos »

Appotus skrev:Hur kan MOVLW 0Ch sätta 3 och 2 som input? 3 och 2 nämns ju inte.
"0Ch" (hexadecimalt) är 12 decimalt och 00001100 binärt. Om du läser det binära talet från höger till vänster så är det, i ordning, bit 0, bit 1, bit 2, bit 3, osv. De båda ettorna står på bit 2 och 3, vilket innebär att PORTC[2:3] blir input, precis som det står.

Det är av denna anledning det är att föredra att ha configbitarna i binär form, det är lätt att se vad som avses och det är lika enkelt att ändra om något är fel.

Och, som sodjan skrev, även om du hade skrivit koden i C så hade du fått samma fel när det gäller registret ANSEL. Assembler och läsa datablad är skitsvårt i början, men genom att tvinga dig att lära dig det gör att du kommer lära dig alla de vanligaste fallgroparna. Som i detta fall då dina pinnar är inställda att vara analoga, och orsakar dina problem.

Databladet får du absolut inte snabb- eller fuskläsa! Informationen där är ytterst vital och du kommer stjälpa mer än hjälpa om du bara kopierar kod från databladen utan att veta exakt vad som avses. Är det något som är svårt ellet obegripligt, fråga. Folk hjälper dig gärna, men du måste i samma veva ge sken av att du är intresserad av att lära dig hur det fungerar, inte att du enbart är intressad av att få LED:en att lysa.

Slutligen, istället för att köra "bsf STATUS, RP0" osv för att hoppa mellan banker så kan du använda makrot "banksel <register>". Exempel:

Kod: Markera allt

banksel TRISB
movlw 0b11110001
movwf TRISB

banksel PORTB
movlw 0b00001110
movwf PORTB
Det snor lite extra (2 bytes OJMR) minne, men det är inget du behöver bekymra dig om för stunden. Fokusera på det väsentliga.
Skriv svar