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.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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.