Sida 1 av 2
Nybörjarhjälp P12F683
Postat: 10 april 2009, 09:41:22
av ylle
Får ett felmeddelande att argument saknas på rad 12, men rad 12 är en call och jag har flyttat runt koden och lagt in NOPar lite här och där för att flytta felet men det sitter kvar.
Troligen ett nybörjarfel eller skit bakom spakarna
En "kitscan" hittade iden på madmodders sida
12 st charlieplexkopplade led på gp1,2,4,5. gp0 ska kopplas till en pot för att justera hastighet, gp3(mclr) ska kopplas till hdd-led
är inte helt säker på syntaxen på bsf och bcf, har provat att köra med
movlw b'001011'
movwf GPIO
men får exact samma felmeddelande
Kod: Markera allt
#include <p12F683.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _IESO_OFF & _FCMEN_OFF)
org 0
Start:
bsf STATUS,RP0
movlw b'00000111' ;init timer0 med max prescale
movwf OPTION_REG
movlw b'001001' ;1245 ut, 3/mclr in, 0 analog in
tris GPIO
bcf STATUS,RP0
Mainloop:
call par12 ;kör led-par 12
call par24 ;kör led-par 24
call par45 ;osv..
call par14
call par25
call par15 ;sista paret, byt håll
call par25
call par14
call par45
call par24
goto Mainloop
;tri 0 och 3 alltid höga 001001
par12
bsf STATUS,RP0
movlw b'001111' ;3210
tris GPIO
bcf STATUS,RP0
bsf GP1 ;fram
bcf GP2
call delay1
bcf GP1 ;tillbaka
bsf GP2
call delay1
return
par24
bsf STATUS,RP0
movlw b'011101' ;4320
tris GPIO
bcf STATUS,RP0
bsf GP2
bcf GP4
call delay1
bcf GP2
bsf GP4
call delay1
return
par45
bsf STATUS,RP0
movlw b'111001' ;5430
tris GPIO
bcf STATUS,RP0
bsf GP4
bcf GP5
call delay1
bcf GP4
bsf GP5
call delay1
return
par14
bsf STATUS,RP0
movlw b'001111' ;3210
tris GPIO
bcf STATUS,RP0
bsf GP1
bcf GP4
call delay1
bcf GP1
bsf GP4
call delay1
return
par25
bsf STATUS,RP0
movlw b'101101' ;5320
tris GPIO
bcf STATUS,RP0
bsf GP2
bcf GP5
call delay1
bcf GP2
bsf GP5
call delay1
return
par15
bsf STATUS,RP0
movlw b'101011' ;3210
tris GPIO
bcf STATUS,RP0
bsf GP1
bcf GP5
call delay1
bcf GP1
bsf GP5
call delay1
return
delay1
btfss INTCON,T0IF
goto $-1
bcf INTCON,T0IF
;om gp3 hög kör delay2
return
delay2
btfss INTCON,T0IF
goto $-1
bcf INTCON,T0IF
return
end
använder mplab 8.10 och pickit2
Re: Nybörjarhjälp P12F683
Postat: 10 april 2009, 09:56:56
av Icecap
Vad gör "tris GPIO"?
Den instruktion är mycket konstig för mig. "tris" är ett register liksom "GPIO". Jag har inte pillat med PIC12 så jag kan ha missuppfattat.
Men hur som helst, det är brukligt att man utpekar felet i koden, t.ex. vid att markera i kommentarer.
Re: Nybörjarhjälp P12F683
Postat: 10 april 2009, 10:06:53
av ylle
movlw b'001001' ;1245 ut, 3/mclr in, 0 analog in
tris GPIO
Den sätter tristate på io pinnarna.
Problemet är att jag inte vet var felet sitter, då har jag kunna felsökt bättre.
Felet sitter på rad 12 oavsett om jag lägger 3,4,5 nop före eller flyttar koden från proceduren istället för att använda call.
Hade jag kunnat lista ut på vilken rad felet satt har jag nog fixat det till sist, men nu har jag ingen aning om i vilken ände jag ska börja.
I värsta fall får jag skriva om programmet rad för rad och testa till felet kommer fram
Re: Nybörjarhjälp P12F683
Postat: 10 april 2009, 10:30:43
av vfr
TRIS är en gammal kvarleva från den gamla 12-bitars PIC-arkitekturen. Det är alltså en instruktion som gör motsvarande vad registret TRIS gör idag. Detta var just en PIC12 så då är det den gamla arkitekturen som gäller.
Re: Nybörjarhjälp P12F683
Postat: 10 april 2009, 10:33:52
av Icecap
Men "tris GPIO" sätter TRIS-registret med värdet av adressen av GPIO eller hur?
Re: Nybörjarhjälp P12F683
Postat: 10 april 2009, 10:39:43
av vfr
Utan att titta närmare i gömmorna så skulle jag spontant säga "Ja".
Ylle> På det viset så kan det inte bli något bra av det. Det är värdet du skall ha som parameter, inte registret.
Re: Nybörjarhjälp P12F683
Postat: 10 april 2009, 13:32:01
av sodjan
> Detta var just en PIC12 så då är det den gamla arkitekturen som gäller.
Fel. Det gäller PIC12F5xx och de andra "Baseline PICs".
12F683 är en vanlig "Midrange PIC", precis som alla andra PIC16.
12F683 ligger i samma familj/generation som 16F886, 16F88 o.s.v.
Nanowatt, 1% INTOSC och hela köret, Väldigt trevlig modell.
Så vitt jag kommer ihåg (databladet har svaret för den som *måste* veta)
så använder man vanliga MOVLW, MOVWF för att sätta TRIS på dessa.
TRIS, OPTION o.s.v som användes på "Baseline" (därför att dessa register
inte var minnes-mappade direkt) behövs inte.
Re: Nybörjarhjälp P12F683
Postat: 10 april 2009, 18:01:33
av sodjan
Kollade just databladet för 12F683 ocxh TRIS är inte ens listat som
en giltig instruktion. Så det är bara att RTFM, göra om och göra rätt...
Re: Nybörjarhjälp P12F683
Postat: 10 april 2009, 19:43:57
av ylle
Har nu lusläst databladet och ändrat en hel del.
Fick fortfarande saknar argument på rad 12 fel hela tiden, hittade till slut felet
När jag gör stora ändringar så brukar jag allteftersom döpa om filer under tiden till .v2.asm .v3.asm osv
bara det att mplab har fortsatt försökt kompilera första filen. Efter många färgstarka invektiv så gjorde jag helt nytt projekt och la in den nya asm filen och får då
Error - Coff file './12ledcharlieplex.v2.o' could not read string table.
Errors : 1
Link step failed.
Tror jag skiter i det här för ikväll o öppnar en öl istället
Re: Nybörjarhjälp P12F683
Postat: 10 april 2009, 23:34:27
av bos
Jag klipper ut en slumpval bit ur din kod och tar fram rödpennan:
Kod: Markera allt
bsf STATUS,RP0
movlw b'001111' ;3210
tris GPIO
bcf STATUS,RP0
bsf GP1 ;fram
bcf GP2
Jag vet inte hur MPLAB gör när man inte har åtta bitar i ett binärtal, men jag skulle ändra b'001111' till b'00001111' istället för att vara på säkra sidan och för att vara mer tydlig. Det är lättare för människor att räkna med åtta bitar än sex, även om MPLAB skulle hantera talet korrekt.
Du gör rätt med bsf/bcf för status-registret, men helt fel för GP1 och GP2 såvida du inte har en #define GP1 GPIO,1 gömd nånstans i någon include-fil. Du skriver att du får felmeddelande på rad 12 om att argument saknas, så jag misstänker att det är detta. Vill du sätta GP1 så skriver du "bsf GPIO, 1".
Istället för att manuellt sätta RP0/RP1 i status-registret så rekommenderar jag att du använder "banksel" istället. Exempel: "banksel GPIO" ser till att statusbitarna är korrekt för att du ska rota i GPIO.
Slutligen, släng "tris" åt fanders. Använd registret TRISIO istället:
Kod: Markera allt
banksel TRISIO
movlw b'00001111' ;3210
movwf TRISIO
banksel GPIO
Re: Nybörjarhjälp P12F683
Postat: 10 april 2009, 23:51:21
av sodjan
> Har nu lusläst databladet och ändrat en hel del.
Exakt *vad* har du ändrat och till vad ?
> Fick fortfarande saknar argument på rad 12 fel hela tiden,
Och vad 17 står det på rad 12 ??
> Error - Coff file './12ledcharlieplex.v2.o' could not read string table.
Är det det *enda* felet du får ?
Vad är det för källkod som ger detta fel ?
Har du rensat bort ogiltiga instruktioner (som TRIS)
och fixat de där felaktiga BCF/BSF instruktionena ?
Det är förb--nat dålig stil att inte kommentera de förslag och uppmaningar
till ändringar som du redan har fått i tidigare inlägg. Det blir ju då helt
meninslöst att försöka hjälpa till om du inte lyssnar...
bos > Vill du sätta GP1 så skriver du "bsf GPIO, 1".
Notera att även bitarna har symboler så även "BSF GPIO, GP1" fungerar OK...
Re: Nybörjarhjälp P12F683
Postat: 11 april 2009, 10:36:32
av ylle
Har provat alla förslag jag fått, flera gånger men det har hittills inte funkat
Som jag skrev i mitt sista inlägg, OCH inläggen innan. Jag har flyttat runt på koden till förbannelse så det stått allt från call, nop, bsf, enbart kommentar, tom rad och annat på rad 16 och felmeddelandet har ändå varenda gång varit det samma. att argument saknas på rad 16.
Skrev också i förra inlägget att jag hittat vad det beror på. Jag tog bort asm filen från workspace och la in en annan och ÄNDÅ så har mplab kompilerat den första asm filen jag skrev. Därav har jag inte kunnat felsöka. Hade mplab kompilerat den filen jag lagt till istället så har jag troligen fått ordning på det. Iallafall kommit bra mycket längre
Bos
alla tris är ersatta med
movlw b'001111'
movwf TRISIO
Att jag kör med 6 bitar är för det bara är 6 io pinnar, men det kanske är bättre med 8 som du säger.
Har även fixat alla bsf/bcf till bsf GPIO, 1
> Error - Coff file './12ledcharlieplex.v2.o' could not read string table Det här felet "could not read string table" kommer nu hela tiden oavsett vilket projekt jag öppnar, även mplabs lektioner. Ska googla och prova att uppgradera
Ska städa mer i koden sen idag.
Har hittills skrivit
Kod: Markera allt
bsf STATUS,RP0
movlw b'001111' ;3210
movwf TRISIO
bcf STATUS,RP0
bsf GPIO,1 ;fram
bcf GPIO,2
Är det här bättre? har inte hunnit bekanta mig med banksel än
Kod: Markera allt
banksel TRISIO
movlw b'001111'
movwf TRISIO
banksel GPIO
bsf GPIO,1 ;fram
bcf GPIO,2
här är iallafall den nya koden, om jag får mplab att överhuvudtaget kompilera nåt så ska jag testa den
Kod: Markera allt
#include <p12F683.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _IESO_OFF & _FCMEN_OFF)
org 0
Start:
bsf STATUS,RP0 ;banksel option_reg bättre?
;banksel OPTION_REG
movlw b'00000111' ;init timer0 med max prescale
movwf OPTION_REG
bcf STATUS,RP0
;banksel GPIO
clrf GPIO ;init GPIO
movlw b'111110' ;0 analog/1-5 digi
movwf CMCON0
banksel ANSEL
clrf ANSEL ;0 till analog fixa senare
movlw b'001001' ;1245 ut, 3/mclr in, 0 analog in
movwf TRISIO
Mainloop:
call par12 ;kör led-par 12
call par24 ;kör led-par 24
call par45 ;osv..
call par14
call par25
call par15 ;sista paret, byt håll
call par25
call par14
call par45
call par24
goto Mainloop
;tri 0 och 3 alltid höga 001001, kom ihåg, ändra till 8bit
par12
bsf STATUS,RP0
movlw b'001111' ;3210
movwf TRISIO
bcf STATUS,RP0
bsf GPIO,1 ;fram
bcf GPIO,2
call delay1
bcf GPIO,1 ;tillbaka
bsf GPIO,2
call delay1
return
par24
bsf STATUS,RP0
movlw b'011101' ;4320
movwf TRISIO
bcf STATUS,RP0
bsf GPIO,2
bcf GPIO,4
call delay1
bcf GPIO,2
bsf GPIO,4
call delay1
return
par45
bsf STATUS,RP0
movlw b'111001' ;5430
movwf TRISIO
bcf STATUS,RP0
bsf GPIO,4
bcf GPIO,5
call delay1
bcf GPIO,4
bsf GPIO,5
call delay1
return
par14
bsf STATUS,RP0
movlw b'001111' ;3210
movwf TRISIO
bcf STATUS,RP0
bsf GPIO,1
bcf GPIO,4
call delay1
bcf GPIO,1
bsf GPIO,4
call delay1
return
par25
bsf STATUS,RP0
movlw b'101101' ;5320
movwf TRISIO
bcf STATUS,RP0
bsf GPIO,2
bcf GPIO,5
call delay1
bcf GPIO,2
bsf GPIO,5
call delay1
return
par15
bsf STATUS,RP0
movlw b'101011' ;3210
movwf TRISIO
bcf STATUS,RP0
bsf GPIO,1
bcf GPIO,5
call delay1
bcf GPIO,1
bsf GPIO,5
call delay1
return
delay1
btfss INTCON,T0IF
goto $-1
bcf INTCON,T0IF
;om gp3 hög kör delay2
return
delay2
btfss INTCON,T0IF
goto $-1
bcf INTCON,T0IF
return
end
Re: Nybörjarhjälp P12F683
Postat: 11 april 2009, 10:51:29
av sodjan
> ...och ÄNDÅ så har mplab kompilerat den första asm filen jag skrev.
vilket kommando (knapp) använda du för att bygga om projektet ?
"Make" eller "Build All" ?
Ditt BANKSEL exempel ser OK ut (och det är bättre).
Din kod bygger rent här hos mig förrutom några standard varningar som
man kan strunta i samt lite formatteringsslav med koden (4 st "return" på fel ställe).
Re: Nybörjarhjälp P12F683
Postat: 11 april 2009, 10:55:46
av Icecap
Självklart har MPLAB kompilerat den första filen, när man använder "spara som" har det INGEN betydelse för vilka filer som ingår i projektet som det är registrerat i MPLAB!
Re: Nybörjarhjälp P12F683
Postat: 11 april 2009, 11:10:21
av bos
sodjan skrev:bos > Vill du sätta GP1 så skriver du "bsf GPIO, 1".
Notera att även bitarna har symboler så även "BSF GPIO, GP1" fungerar OK...
Det kände jag inte till. Tack för tipset.