Beste,

Nu weer iets vreemd, ik weer niet wat er mis mee is helaas
ik kreeg deze fout in picbasic. Die heb ik nog nooit gehad.

Error[113] C:\PICPRO~1\PROGS\LAMELL~1\LAMELLEN.ASM 496 : Symbol not previously defined (NX@LB48)

Dit is me code.


DEVICE 16F628A  ;We gebruiken een 16F628A type 
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF 
;bij inbranden alleen pwrte aan en instellen op inrc clkout
ALL_DIGITAL TRUE    ;Alle ingangen digitaal 
   
;pinnamen
SYMBOL SERVO1 = PORTA.1;   pin 18 is servo
SYMBOL LDR = PORTA.0	;pin 17 is de LDR is een ingang
SYMBOL GEREED = PORTA.7	  ;pin 16 is de Gereed led
SYMBOL STAND1 = PORTA.6	  ;pin 15 is de stand 1 led
SYMBOL STAND2 = PORTB.7	  ;pin 13 is de stand 2 led
SYMBOL DRAAIHOEKLED = PORTB.6	 ;pin 12 is de draaihoek led
SYMBOL BEZIG = PORTB.5	 ;pin 11 is de bezig led


SYMBOL OPENKNOP = PORTB.0   ;pin 6 is de plus knop
SYMBOL DICHTKNOP = PORTB.1   ;pin 7 is de min knop
SYMBOL MENUKNOP = PORTB.2   ;pin 8 is de menu knop

;Algemene constanten
symbol OPEN = 1000   ;linksom 1 ms
symbol DICHT = 2000   ;rechtsom 2 ms

Symbol DRAAIADRES = 0   ;gegevens van draaihoek worden in adres 0 opgeslagen
symbol DRAAISTANDADRES = 1   ;Huidige stand van lamellen in adres 1 opgeslagen
Symbol LICHTADRES = 2	;gegevens van lichtval worden in adres 3 opgeslagen

symbol ANTIDENDERING = 25

symbol INV_AAN = 0  ;voor schakelaars aan = 0 invert_aan
symbol INV_UIT = 1  ;voor schakelaars uit = 1 invert_uit
SYMBOL AAN = 1
SYMBOL UIT = 0

;Variabelen
DIM DRAAIHOEK as BYTE
DIM DRAAISTAND as BYTE
DIM LICHTVAL as BYTE
DIM LICHTSTERKTE as word

DIM DUMMY as byte
DIM DUMMY2 as byte
DIM WACHT as DWORD


PORTB_PULLUPS ON   ;On-chip pull-up weerstanden actief 
CLEAR  ;wist alle variabele


        ;76543210           <<<Een hulpregeltje
PORTA = %11111100
TRISA = %00100001   ;PORTA.5 en PORTA.0 zijn ingangen               
TRISB = %00000111   ;

goto controles 

draaihoekInstellen:
draaihoekled = aan
while 1 = 1
	  If menuknop = inv_aan  then draaihoek = 1
   	  while menuknop = inv_uit
	  		If openknop = inv_aan then inc draaihoek
	  		If dichtknop = inv_aan then dec draaihoek
	  wend
	  If dichtknop = inv_aan then
	  goto automatisch
	  ENDIF
wend

bezig = aan
ewrite draaiadres,[draaihoek]
ewrite draaistand,[draaistandadres]
draaihoekled = uit
Return

Lichtcontrole:
LDR = aan
delayms 1
lichtsterkte = RCIN LDR, HIGH

Select lichtsterkte
case > 10, < 20 
	 gosub opengaan
case < 1  
	 gosub halfopen
case > 6000 
	 gosub dichtgaan
endselect
return


opengaan:
for dummy2 = draaistand to draaihoek
	 servo servo1, open  ;stuurt 1 puls met pulsbreedte 'rechtsom' naar porta.1
	 inc draaistand
	 NEXT
ewrite draaiadres,[draaistand]
Return

halfopen:
dummy = draaihoek / 2
select dummy
case > draaistand
	 for dummy2 = draaistand to dummy
	 	 servo servo1, open
		 inc draaistand
		 NEXT
case < draaistand
	 for dummy2 = dummy to draaistand
	 	 servo servo1, dicht
		 dec draaistand
		 NEXT
case = dummy
	 return
endselect
ewrite draaistandadres,[draaistand]
return

Dichtgaan:
select draaistand
case = draaihoek
	 return
case < draaihoek
	 for dummy2 = draaistand to draaihoek
	 	 servo servo1, dicht
	     dec draaistand
	 next
endselect
return



controles:
  
geheugencheck:
draaihoek = EREAD draaiadres
If draaihoek = 0 then

gosub draaihoekInstellen
draaihoekled = uit
ENDIF
draaistand = eread draaistandadres
goto automatisch

while 1 = 1

automatisch:
stand1 = aan
while 1 = 1

For wacht = 1 to 900000
	If menuknop = inv_aan then
   	   stand1 = uit
   	   gosub handmatig
	Endif
delayms 1
gosub lichtcontrole

wend

handmatig:
stand2 = aan
while 1 = 1
	  while openknop = inv_aan and draaistand < draaihoek
	  		servo servo1, open
			inc draaistand
	  wend

	  while dichtknop = inv_uit and draaistand > 0
	  		servo servo1, dicht
			dec draaistand
	  wend

	  If menuknop = inv_aan then
	  	 stand2 = uit
		 gosub draaihoekinstellen
		 endif
wend
wend
end

P.S dit is wel layout verpestend zeg.

Je titel ook ;) Die heb ik wat ingekort.

Tikfout in een symbol naam?

[Bericht gewijzigd door Henry S. op ]

Die heb ik niet.
gaat maar tot 219 nu is het dezelfde fout maar dan 616

[Bericht gewijzigd door Joeri de Man op ]

Dit compileerd:


Device 16F628A                ;We gebruiken een 16F628A type 
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF 
;bij inbranden alleen pwrte aan en instellen op inrc clkout
ALL_DIGITAL TRUE              ;Alle ingangen digitaal 
   
;pinnamen
Symbol servo1 = PORTA.1    ;pin 18 is servo
Symbol LDR = PORTA.0       ;pin 17 is de LDR is een ingang
Symbol gereed = PORTA.7       ;pin 16 is de Gereed led
Symbol stand1 = PORTA.6       ;pin 15 is de stand 1 led
Symbol stand2 = PORTB.7       ;pin 13 is de stand 2 led
Symbol draaihoekLED = PORTB.6    ;pin 12 is de draaihoek led
Symbol bezig = PORTB.5    ;pin 11 is de bezig led


Symbol openknop = PORTB.0  ;pin 6 is de plus knop
Symbol dichtknop = PORTB.1  ;pin 7 is de min knop
Symbol menuknop = PORTB.2  ;pin 8 is de menu knop

;Algemene constanten
Symbol open = 1000      ; linksom 1 ms
Symbol dicht = 2000        ; rechtsom 2 ms
Symbol schaal = 255  ;schaal is 255
Symbol draaiadres = 0  ;gegevens van draaihoek worden in adres 0 opgeslagen
Symbol draaistandadres = 1  ;Huidige stand van lamellen in adres 1 opgeslagen
Symbol lichtadres = 2  ;gegevens van lichtval worden in adres 3 opgeslagen

Symbol antidendering = 25

Symbol inv_aan = 0    ;voor schakelaars aan = 0 invert_aan
Symbol inv_uit = 1    ;voor schakelaars uit = 1 invert_uit
Symbol aan = 1
Symbol uit = 0

;Variabelen
Dim draaihoek As Byte
Dim draaistand As Byte
Dim lichtval As Byte
Dim lichtsterkte As Float

Dim dummy As Byte
Dim dummy2 As Byte
Dim wacht As DWord


PORTB_PULLUPS On                ;On-chip pull-up weerstanden actief 
Clear        ;wist alle variabele


        ;76543210           <<<Een hulpregeltje
PORTA = %11111100
TRISA = %00100001                  ;PORTA.5 en PORTA.0 zijn ingangen               
TRISB = %00000111               ;

GoTo controles 

draaihoekInstellen:
    draaihoekLED = aan
    While 1 = 1
        If menuknop = inv_aan Then
            draaihoek = 1
            While menuknop = inv_uit
                If openknop = inv_aan Then
                    Inc draaihoek
                EndIf
                If dichtknop = inv_aan Then
                    Dec draaihoek
                EndIf
            Wend
        ElseIf dichtknop = inv_aan Then
            GoTo automatisch
        EndIf
    Wend
    
    bezig = aan
    EWrite draaiadres,[draaihoek]
    EWrite draaistand,[draaistandadres]
    draaihoekLED = uit
Return

Lichtcontrole:
    LDR = aan
    DelayMS 1
    lichtsterkte = RCIn LDR, High
    Select lichtsterkte
        Case > 10, < 20 
            GoSub opengaan
        Case < 1  
            GoSub halfopen
        Case > 6000 
            GoSub Dichtgaan
    EndSelect
Return


opengaan:
    For dummy2 = draaistand To draaihoek
        Servo servo1, open  ;stuurt 1 puls met pulsbreedte 'rechtsom' naar porta.1
        Inc draaistand
    Next
    EWrite draaiadres,[draaistand]
Return

halfopen:
    dummy = draaihoek / 2
    Select dummy
        Case > draaistand
            For dummy2 = draaistand To dummy
                Servo servo1, open
                Inc draaistand
            Next
        Case < draaistand
            For dummy2 = dummy To draaistand
                Servo servo1, dicht
                Dec draaistand
            Next
        Case = dummy
            Return
    EndSelect
    EWrite draaistandadres,[draaistand]
Return

Dichtgaan:
    Select draaistand
        Case = draaihoek
            Return
        Case < draaihoek
            For dummy2 = draaistand To draaihoek
                Servo servo1, dicht
                Dec draaistand
            Next
    EndSelect
Return



controles:
  
geheugencheck:
    draaihoek = ERead draaiadres
    If draaihoek = 0 Then
        GoSub draaihoekInstellen
        draaihoekLED = uit
    EndIf
    draaistand = ERead draaistandadres
    GoTo automatisch

    While 1 = 1
        automatisch:
        stand1 = aan
        While 1 = 1
            For wacht = 1 To 900000
                If menuknop = inv_aan Then
                    stand1 = uit
                    GoSub handmatig
                EndIf
                DelayMS 1
                GoSub Lichtcontrole
            Next
        Wend
    Wend

handmatig:
    stand2 = aan
    While 1 = 1
        While openknop = inv_aan And draaistand < draaihoek
            Servo servo1, open
            Inc draaistand
        Wend

        While dichtknop = inv_uit And draaistand > 0
            Servo servo1, dicht
            Dec draaistand
        Wend
        If menuknop = inv_aan Then
            stand2 = uit
            GoSub draaihoekInstellen
        EndIf
    Wend
End

Leer eens hoe de tab toets werkt en wat je ermee moet doen. Daarnaast snap ik ook niet dat jij 20x een while 1 = 1 lus hebt in je programma... Kan een stuk netter allemaal!

je gebruik PICBASIC om een ASM te maken en dan druk je die ASM door MPLAB?
dan voegt PICBASIC iets toe in de ASM.
we kijken nu naar de picbasic listing we moeten kijken naar de asm listing

Er staat toh assembler fout... omdat jij stomme fouten maakt komt dat terug in de assembler.

elmowww

Laat even duidelijk zijn dat ik voor het eerst met een programma bezig ben die zo uitgebreid is.

Verder zou ik graag van je willen horen waar de tab toets dan voor dient.

En tenslotten wat je met dat stukje code wil, wat aangepast en onvolledig is.

Door gebruik te maken van tabs wordt je programma overzichtelijker, zo kun je dan bijvoorbeeld makkelijker zien wat in een for of while lus wordt uitgevoerd.

Op 16 april 2006 19:56:28 schreef joerideman:
elmowww

Laat even duidelijk zijn dat ik voor het eerst met een programma bezig ben die zo uitgebreid is.

Ok, smoes aanvaard ;)

Verder zou ik graag van je willen horen waar de tab toets dan voor dient.

De iedere lus die je opent, doe je er 1 tab bij, iedere lus die je afsluit ga je een tab terug. Dan kan je overzichtelijk zien welke lussen afgesloten zijn en welke niet (en correct of niet)

En tenslotten wat je met dat stukje code wil, wat aangepast en onvolledig is.

Dat stukje code is het programmatje wat jij online gezet hebt, met de next`s en wend`s en endif`s toegevoegd en de regels van het tabben toegevoegd.

De diverse lussen waarbij je tab gebruikt is alles wat je weer af moet sluiten. Dus ook sub`s en selects. Daarnaast kan je nog heel effectief hoofdletters gebruiken bij je dim`s en symbols: als je later in je programma de betreffende naam typt (in kleine letters), veranderd de IDE deze in hoofdletters: dan weet je dat je een geldige naam te pakken hebt.


Main:                       ;Hier open ik de main loop
    high ledb
    if bla = 3 then         ;Nieuwe lus open
        high ledc
        low ledb
    elseif bla = 2 then     ;Oude lus dicht en weer een nieuwe open
        high ledc
    endif                   ;Lus dicht
    while input_a = 0
        pulsout a, 200
        delayus 500
        for  x = 0 to 200
            pulsout a, 100
            delayus 500
            if input_a = 1 then break
        next
    wend
    Select varC
        case 1
            blablabla
        case 2
            blablabla
        case 3
            ...
        case else
    endselect
goto main

Zo ga je ongeveer met tabs om...

Hmm ik was al weer verder gegaan met het programma, nadat ik gepost had vandaar dat het onvolledig was :P.

Maar goed ik ga dan even mijn code fatsoenlijk maken.

De reden waarom ik zoveel while heb, was omdat ik geen idee had hoe ik het anders moest oplossen.

Het doel is dus, om de de aantal stappen in te stellen die mijn servo moet maken. Als je dit van buitenaf wilt instellen heb ik het opgelost door de beginstand op te geven, en vanaf daar de stappen te tellen totdat de eindstand word aangegeven.

Nou ik dacht dat het wel met 3 knoppen moest kunnen. de menu knop en de 2 knoppen om open dicht te gaan hoger/lager.

En vandaar dat ik zoveel lussen heb, want dit blijkt dus niet het hele stuk te zijn want ik heb er nog veel meer.

Laten we dit even onder de loep nemen:


geheugencheck:
    draaihoek = ERead draaiadres
    If draaihoek = 0 Then
        GoSub draaihoekInstellen
        draaihoekLED = uit
    EndIf
    draaistand = ERead draaistandadres
    GoTo automatisch

    While 1 = 1
        automatisch:
        stand1 = aan
        While 1 = 1
            For wacht = 1 To 900000
                If menuknop = inv_aan Then
                    stand1 = uit
                    GoSub handmatig
                EndIf
                DelayMS 1
                GoSub Lichtcontrole
            Next
        Wend
    Wend

Lichtcontrole:
    LDR = aan
    DelayMS 1
    lichtsterkte = RCIn LDR, High
    Select lichtsterkte
        Case > 10, < 20 
            GoSub opengaan
        Case < 1  
            GoSub halfopen
        Case > 6000 
            GoSub Dichtgaan
    EndSelect
Return

Wat mij opvalt, is dat de eerstgeopende "while 1=1" lus zinloos is, hij komt tóch nóóit uit de 2e... En dan de "for wacht = 0 to 900000" lus, ook zinloos! Dit word immers herhaald door de 2e "while 1=1" lus, en de variabele wordt niet gebruikt, da`s een verspilling van 4 bytes RAM...

Dan ook nog de "Goto automatisch", hij loopt zelf de while lus wel in, die goto heeft hij niet nodig!

Wat ik overhoudt (zonder dat ik de functie weet...):


geheugencheck:
    draaihoek = ERead draaiadres
    If draaihoek = 0 Then
        GoSub draaihoekInstellen
        draaihoekLED = uit
    EndIf
    draaistand = ERead draaistandadres

    automatisch:
    stand1 = aan
    While 1 = 1
        If menuknop = inv_aan Then
            stand1 = uit
            GoSub handmatig
        EndIf
        DelayMS 1
        GoSub Lichtcontrole
    Wend

Lichtcontrole:
    LDR = aan
    DelayMS 1
    lichtsterkte = RCIn LDR, High
    Select lichtsterkte
        Case > 10, < 20 
            GoSub opengaan
        Case < 1  
            GoSub halfopen
        Case > 6000 
            GoSub Dichtgaan
    EndSelect
Return

Het word dat tijd dat ik even goed ga uitleggen wat de bedoeling is.

Het doel:
Mijn lamellen automatisch laten sturen afhankelijk van het zonlicht dat op me kamer staat

aansturing:
1 LDR tegen me raam aan
microcontroller die de LDR uitlees en afhankelijk van de waarde een servo aanstuurt zodat de lamellen open of dicht gaan.

En dan komt het.

Wat moet het programma kunnen:
De LDR uitmeten, met de meting bepalen of de lamellen open half open of dicht moeten.

Van buitenaf kunnen instellen hoever de lamellen moeten draaien.

Zowel automatisch als handmatig bedienbaar zijn.

Oke dat zijn even wat feitjes.
Nu het volgende, ik neem maar gelijk die lus van 90000 die zorgt er voor dat er maar 1 keer per 15 minuten gemeten word. Zodat ik geen last krijg van flapperende lamellen.

wat ik verder nog wil zeggen dat weet ik niet. Maar dit verschaft wat duidelijkheid dacht ik zo.

Dat kan allemaal wel wezen, maar de for 0 to 90000 lus die wordt nevernooit gebruikt. Mocht hij die 90000 bereikt hebben, begint ie weer opnieuw omdat hij immers in een while 1=1 lus staat. Voor de rest kan ik ook nergens vinden dat de variabele gebruikt in de for lus gebruikt wordt. Dus volkomen zinloos.

Het stukje code wat ik herschreven heb, geeft exact de werking van jou code weer, alleen minder memory verspilling.

ik zag in mijnstukje code dat het 'gosub lichtcontrole' in de FOR lus zat. Daar had die natuurlijk buiten gemoeten. Want nu is het idd nutteloos, maar anders doet die dus 1 keer in de zoveel tijd een meting.