Hallo,

Ik ben bezig met een menu.
Maar als ik in het submenu ga met Ok dan lijkt of hij vast zit.
mijn code die ik nu heb:


; informatie:  
; http://www.circuitsonline.net/forum/view/30070/1/pwm+rgb
; http://www.circuitsonline.net/forum/view/47850/1/pwm+rgb
; 

DEVICE 18F452  
XTAL = 8            
CONFIG_START
   OSC = HS ; HS
   OSCS = OFF ; Disabled
   PWRT = ON ; Enabled
   BOR = ON ; Enabled
   BORV = 25 ; 2.5V
   WDT = OFF ; Disabled
   WDTPS = 128 ; 1:128
   CCP2MUX = ON ; Enable (RC1)
   STVR = ON ; Enabled
   LVP = OFF ; Disabled
   DEBUG = OFF ; Disabled
CONFIG_END

INCLUDE "GLCD_declare.inc"    ; hierin staan de pin configuratie van de GLCD 

ALL_DIGITAL = TRUE

;Variabele declareren
DIM menu AS BYTE
DIM menuEen AS BYTE
DIM DutyR AS BYTE
DIM DutyG AS BYTE
DIM DutyB AS BYTE

;Logische constanten
SYMBOL AAN          = 0       ; Geinverteerd AAN
SYMBOL OFF_         = 0       ; UIT
SYMBOL ON_          = 1       ; AAN
SYMBOL UIT          = 1       ; Geinverteerd UIT

;Algemene constante
SYMBOL AntiDender   = 5       ;(mSec): Tijd voor ontdendering van toetsen

;EEPROM adresnamen 

;Registernamen 

;poortnamen
SYMBOL LedB         = PORTE.0 ; Led zit op PORTE.0 aangesloten
SYMBOL LedR         = PORTE.1 ; Led zit op PORTE.1 aangesloten
SYMBOL LedG         = PORTE.2 ; Led zit op PORTE.2 aangesloten
SYMBOL Led1         = PORTA.0 ; Led zit op PORTA.0 aangesloten
SYMBOL Op           = PORTA.2 ; Menuregel omhoog
SYMBOL Neer         = PORTA.3 ; Menuregel omlaag
SYMBOL OK           = PORTA.4 ; Selecteer menu

;        76543210
PORTA = %00000000             ; Alle niveaus van PORTA eerst laag maken
;PORTC = %00000000            ; Alle niveaus van PORTC eerst laag maken
PORTE = %00000000             ; Alle niveaus van PORTE eerst laag maken
TRISA = %11111110             ; Alle PORTA poorten omschakelen als ingang
;TRISC = %11111111            ; Alle PORTC poorten omschakelen als ingang
TRISE = %00000000             ; Alle PORTE poorten omschakelen als uitgang

CLEAR                         ; Wis alle RAM geheugen
DELAYMS 500                   ; LCD stabilisering 

GOTO HoofdProgramma           ; Spring over de subroutine(s)

;Subroutine(s)
; nu subroutine's aanwezig
Rood:

;GOSUB ScanToets
PRINT AT 1,0, "Rood "
PRINT AT 4,0, "     "
PRINT AT 7,0, "     "
LOW Led1
RETURN
Groen:

;GOSUB ScanToets
PRINT AT 1,0, "     "
PRINT AT 4,0, "Groen"
PRINT AT 7,0, "     "
RETURN
Blauw:

;GOSUB ScanToets
PRINT AT 1,0, "     "
PRINT AT 4,0, "     "
PRINT AT 7,0, "Blauw"
RETURN
ScanToets:

;scan bits 2,3,4 en wacht totdat een toets opnieuw gedrukt wordt
WHILE (PORTA&28)<28 : WEND     
DELAYMS 20
WHILE (PORTA&28)=28 : WEND
RETURN
INCLUDE "DS1820.inc"          ; hierin staan de configuratie van de DS1820
HoofdProgramma:

CLS
PRINT AT 0,8, "Rood"
PRINT AT 3,8, "Groen"
PRINT AT 6,8, "Blauw"
DutyR = 255
DutyG = 20
DutyB = 40

WHILE 1 = 1
HIGH Led1
PWM LedR, DutyR, 1
PWM LedG, DutyG, 1
PWM LedB, DutyB, 1
IF Op = UIT THEN INC menu
IF Neer = UIT THEN DEC menu 
   
   SELECT CASE menu
   IF menu = 3 THEN menu = 0
   IF menu = 255 THEN menu = 2
   PRINT AT 0,0, DEC3 menu
      
      CASE 0
         PRINT AT 0,17, "*", "1"
         PRINT AT 3,17, " ", "0"
         PRINT AT 6,17, " ", "0"
      CASE 1
         PRINT AT 0,17, " ", "0"
         PRINT AT 3,17, "*", "2"
         PRINT AT 6,17, " ", "0" 
      CASE 2
         PRINT AT 0,17, " ", "0"
         PRINT AT 3,17, " ", "0"
         PRINT AT 6,17, "*", "3"
         
      CASE ELSE
      END SELECT          
IF menu = 0 AND OK = AAN THEN GOSUB Rood
IF menu = 1 AND OK = AAN THEN GOSUB Groen
IF menu = 2 AND OK = AAN THEN GOSUB  Blauw
         
GOSUB ScanToets

WEND                          ; Terug naar WHILE

INCLUDE "font2.inc"           ; hierin staat het fonttabel voor het display

dit is een testje maar dit werkt dus niet goed.

   
SELECT CASE menu
IF menu = 3 THEN menu = 0
IF menu = 255 THEN menu = 2
PRINT AT 0,0, DEC3 menu

Dit is een beetje rare code. Ik zou de IFs voor de Select Case zetten.

Ook lijkt het erop dat, als de variabele menu eenmaal 0 of 2 is, dat die waarde niet meer veranderd, maar dat weet ik niet zeker, omdat ik niet kan zien wat er in DS1820.inc staat.

Edit:
De menu-waarde wordt wel veranderd, ik ben een beetje scheef.

In de DS1820 sub staat niets bijzonders, wordt ook niet aangeroepen

Normaal horen er in een Select Case alleen Case statements thuis, en geen andere boel. En zeker niets wat case variabele (menu)zelf verandert! Zet ook alle include files netjes bij elkaar voor het begin van de code. (En niet zoals nu willekeurig hier en daar midden in de code zelf)

Op 2 oktober 2009 18:10:41 schreef Arco:
Zet ook alle include files netjes bij elkaar voor het begin van de code. (En niet zoals nu willekeurig hier en daar midden in de code zelf)

Ik heb ooit eens gelezen dat je de font tabel altijd onderaan moest zetten.

Maakt het helemaal niet uit waar je een include neer zet?
Citaat van de site van Picbasic:

Plaats een INCLUDE bestand op die plek in je programma, waar normaal de inhoud van dat bestand in het programma zou staan.
Er kunnen dus ook INCLUDE bestanden ergens middenin of onderaan het programma staan.
Als het INCLUDE bestand echter (assembler) subroutines bevat, dan moet dit INCLUDE bestand altijd bovenin het programma worden geplaatst, dus nog vóór het hoofdprogramma, dit om verdeling over meerdere geheugenbanken in de PIC te voorkomen.

Op 2 oktober 2009 18:21:51 schreef lampje25:
Ik heb ooit eens gelezen dat je de font tabel altijd onderaan moest zetten.

Het hoeft niet, maar het is een in verhouding een groot stuk data, dat zet je uit praktische overwegingen achter je programma.

Maakt het helemaal niet uit waar je een include neer zet?

Uit praktische overwegingen zet je ze bovenaan, je hebt daar overzicht op deze includes en dat voorkomt dubbel includen en tegenstrijdigheden.

Ok, ik heb nu deels mijn submenu werkend echter het gaat toch nog ergens fout.

Als ik in het submenu RoodDuty: terecht kom en ik druk 1x op op of neer dan gaat gelijk break in werking (daarom zitten er een paar testregels in het programma.
Echter kan ik daarmee niet achterhalen waardoor het fout gaat.
Iemand die het wel ziet?


DEVICE 18F452  
XTAL = 8            
CONFIG_START
   OSC = HS ; HS
   OSCS = OFF ; Disabled
   PWRT = ON ; Enabled
   BOR = ON ; Enabled
   BORV = 25 ; 2.5V
   WDT = OFF ; Disabled
   WDTPS = 128 ; 1:128
   CCP2MUX = ON ; Enable (RC1)
   STVR = ON ; Enabled
   LVP = OFF ; Disabled
   DEBUG = OFF ; Disabled
CONFIG_END

;INCLUDE "GLCD_declare.inc"    ; hierin staan de pin configuratie van de GLCD 
INCLUDE "T6963_GLCD_declare.inc"
;INCLUDE "LCD_declare.inc"
;INCLUDE "DS1820.inc"          ; hierin staan de configuratie van de DS1820
ALL_DIGITAL = TRUE

;Variabele declareren
DIM menu AS BYTE
DIM menuEen AS BYTE
DIM DutyR AS BYTE
DIM DutyG AS BYTE
DIM DutyB AS BYTE

;Logische constanten
SYMBOL AAN          = 0       ; Geinverteerd AAN
SYMBOL OFF_         = 0       ; UIT
SYMBOL ON_          = 1       ; AAN
SYMBOL UIT          = 1       ; Geinverteerd UIT

;Algemene constante
SYMBOL AntiDender   = 5       ;(mSec): Tijd voor ontdendering van toetsen

;EEPROM adresnamen 

;Registernamen 

;poortnamen
;SYMBOL Toets1       = PORTA.0 ; Pulstoets zit op PORTC.7 aangesloten
;SYMBOL Toets2       = PORTA.1 ; Pulstoets zit op PORTC.6 aangesloten
SYMBOL LedB         = PORTE.0 ; Led zit op PORTE.0 aangesloten
SYMBOL LedR         = PORTE.1 ; Led zit op PORTE.1 aangesloten
SYMBOL LedG         = PORTE.2 ; Led zit op PORTE.2 aangesloten
SYMBOL Led1         = PORTC.0 ; Led zit op PORTA.0 aangesloten
SYMBOL Led2         = PORTC.1 ; Led zit op PORTA.0 aangesloten
SYMBOL Led3         = PORTC.2 ; Led zit op PORTA.0 aangesloten
SYMBOL Op           = PORTA.2 ; Menuregel omhoog
SYMBOL Neer         = PORTA.3 ; Menuregel omlaag
SYMBOL OK           = PORTA.0 ; Selecteer menu

;        76543210
PORTA = %00000000             ; Alle niveaus van PORTA eerst laag maken
PORTC = %00000000            ; Alle niveaus van PORTC eerst laag maken
PORTE = %00000000             ; Alle niveaus van PORTE eerst laag maken
TRISA = %11111111             ; Alle PORTA poorten omschakelen als ingang behalve 0
TRISC = %11111000             ; Alle PORTC poorten omschakelen als ingang
TRISE = %00000000             ; Alle PORTE poorten omschakelen als uitgang

CLEAR                         ; Wis alle RAM geheugen
DELAYMS 500                   ; LCD stabilisering 


GOTO HoofdProgramma           ; Spring over de subroutine(s)

;Subroutine(s)
; nu subroutine's aanwezig
Rood:

menuEen = 101
PRINT AT 1,0, "Rood "
PRINT AT 4,0, "     "
PRINT AT 7,0, "     "
WHILE  1=1
GOSUB ScanToets
IF Op = UIT THEN INC menuEen
IF Neer = UIT THEN DEC menuEen 
IF menuEen = 104 THEN menuEen = 101
IF menuEen = 100 THEN menuEen = 103
PRINT AT 10,0, "menuEen ", DEC3 menuEen
HIGH Led1
IF menuEen = 101 AND OK = AAN THEN GOSUB RoodDuty

    

;IF menu = 102 AND OK = AAN THEN GOSUB Groen
IF menuEen = 103 AND OK = AAN THEN BREAK
WEND
menu = 0
PRINT AT 1,0, "     "
PRINT AT 1,8, "     "
PRINT AT 4,0, "     "
PRINT AT 7,0, "     "
LOW Led1
LOW Led2
RETURN
Groen:

;GOSUB ScanToets
PRINT AT 1,0, "     "
PRINT AT 4,0, "Groen"
PRINT AT 7,0, "     "
RETURN
Blauw:

;GOSUB ScanToets
PRINT AT 1,0, "     "
PRINT AT 4,0, "     "
PRINT AT 7,0, "Blauw"
RETURN
ScanToets:

;binair gewicht: 128 64 32 16 8 4 2 1
;bits van poort:   7  6  5  4 3 2 1 0
;scan bits 2,3,5 en wacht totdat een toets opnieuw gedrukt wordt
WHILE (PORTA&13)<13 : WEND     
DELAYMS 20
WHILE (PORTA&13)=13 : WEND
DELAYMS 20
RETURN
RoodDuty: ; in deze sub gaat het fout!!
WHILE 1=1
    
    GOSUB ScanToets 
            PRINT AT 11,1, DEC3 OK    
            IF Op = UIT THEN INC DutyR
            IF Neer = UIT THEN DEC DutyR
            ;delayms 1000 
            PRINT AT 12,1, DEC3 OK
            PRINT AT 1,8, DEC3 DutyR
            HIGH Led2
            PRINT AT 13,1, DEC3 OK
            ;DELAYMS 1000 
            IF OK = UIT THEN BREAK
            
            
WEND
PRINT AT 14,1, DEC3 OK
HIGH Led3
RETURN
HoofdProgramma:

CLS
PRINT AT 0,8, "Rood"
PRINT AT 3,8, "Groen"
PRINT AT 6,8, "Blauw"
;DutyR = 255
;DutyG = 20
;DutyB = 40
menu = 1
WHILE 1 = 1

;TOGGLE Led1
PRINT AT 8,0, "menu ", DEC3 menu
;PWM LedR, DutyR, 1
;PWM LedG, DutyG, 1
;PWM LedB, DutyB, 1
IF Op = UIT THEN INC menu
IF Neer = UIT THEN DEC menu 
IF menu = 4 THEN menu = 1
IF menu = 0 THEN menu = 3
PRINT AT 9,0, "menu ",  DEC3 menu
;PRINT AT 1,0, "123456789012345678901"
    
    SELECT CASE menu
        CASE 1
            PRINT AT 0,17, "*", "1"
            PRINT AT 3,17, " ", "0"
            PRINT AT 6,17, " ", "0"
       CASE 2
            PRINT AT 0,17, " ", "0"
            PRINT AT 3,17, "*", "2"
            PRINT AT 6,17, " ", "0" 
        CASE 3
            PRINT AT 0,17, " ", "0"
            PRINT AT 3,17, " ", "0"
            PRINT AT 6,17, "*", "3"
        CASE ELSE
            PRINT AT 0,17, " ", "0"
            PRINT AT 3,17, " ", "0"
            PRINT AT 6,17, " ", "0"
    END SELECT          
IF menu = 1 AND OK = AAN THEN GOSUB Rood
IF menu = 2 AND OK = AAN THEN GOSUB Groen
IF menu = 3 AND OK = AAN THEN GOSUB  Blauw        
GOSUB ScanToets
WEND                          ; Terug naar WHILE
INCLUDE "font2.inc"           ; hierin staat het fonttabel voor het display

Edit:
@Henry

Op 2 oktober 2009 19:04:34 schreef Henry S.:

[...]
Uit praktische overwegingen zet je ze bovenaan, je hebt daar overzicht op deze includes en dat voorkomt dubbel includen en tegenstrijdigheden.

Ik weet nu wel dat je beter de includes na je declaraties en poortnamen kunt zetten, als je ze ervoor zet dan krijg je een foutmelding dat hij de gebruikte variabelen niet ziet, zet je de include net voor je hoofdprogramma dan gaat het dus wel goed.