Ik heb het volgende probleem:
op regel 1 heb ik de temperatuur staan (DS1820) deze wordt via een subroutine aangeroepen.
Op regel 2 heb ik de tijd staan die van een externe RTC bordje af komt. (ik heb een Easypic 5 bord van Microe met een externe RTC bord)
Ook dit gaat redelijk goed (mis nog de correcte uitlezing van de dag maand weekdag en jaar maar dat komt later nog wel)
Op regel 4 wil ik een tekst weergeven.
Alleen is de tekst te lang voor de regel. Ik wil geen scroll tekst maar de tekst moet om en om weergegeven worden.
dus eerst tekst 1 dan 1 sec wachten, dan 1 sec wachten tekst 2, dan weer 1 sec wachten tekst 3, dan weer 1 sec wachten en dan weer tekst 1, enzv.
Echter als ik dat doe met een delay dan loopt/stopt mn sec tijd steeds een paar sec. en dat is niet nou juist niet de bedoeling.
Hoe kan ik dat oplossen??
Code die ik nu heb:
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 Minuten AS BYTE ; Bevat de minuten
DIM Seconden AS BYTE ; Bevat de seconden
DIM Uren AS BYTE ; Bevat de uren
DIM dag AS BYTE ; bevat de dag
DIM maand AS BYTE ; bevat de maand
DIM jaar AS BYTE ; bevat de jaar
DIM weekdag AS BYTE ; bevat de weekdag 1 = maandag
;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
;poortnamen
SYMBOL Toets1 = PORTA.0 ; Pulstoets zit op PORTC.7 aangesloten
SYMBOL Toets2 = PORTA.1 ; Pulstoets zit op PORTC.6 aangesloten
SYMBOL Led = PORTE.0 ; Led zit op PORTE.0 aangesloten
SYMBOL Led2 = PORTE.1 ; Led zit op PORTE.0 aangesloten
SYMBOL Led3 = PORTE.2 ; Led zit op PORTE.0 aangesloten
DECLARE SCL_PIN = PORTC.3 ; Serial Clock pin met PORTC.3 verbinden
DECLARE SDA_PIN = PORTC.4 ; Serial Data pin met PORTC.4 verbinden
; 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
;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
INCLUDE "DS1820.inc" ; hierin staan de configuratie van de DS1820
HoofdProgramma:
CLS
BUSOUT %10100000, $00, [$00] ; control/status 1, no test modes or POR override
BUSOUT %10100000, $01, [$00] ; control/status 2, no alarm/timer flags or interrupts
;Schrijf (write) seconden, minuten, uren naar de PCF8583
BUSOUT %10100000, $02, [$30, $38, $14]
;Schrijf (write) dag, weekdag (maandag = 1), maand, jaar naar de PCF8583
BUSOUT %10100000, $05, [$19, $04, $03, $09]
BUSOUT %10100000, $09, [$80] ; disable minute alarm and reset to 00
BUSOUT %10100000, $0A, [$80] ; disable hour alarm and reset to 00
BUSOUT %10100000, $0B, [$80] ; disable day alarm and reset to 00
BUSOUT %10100000, $0C, [$80] ; disable weekday alarm and reset to 00
BUSOUT %10100000, $0D, [$80] ; set frequency out to 32768 Hz e.g. for tuning
BUSOUT %10100000, $0E, [$00] ; timer switched off
WHILE 1 = 1
BUSIN %10100000, $02, [Seconden, Minuten, Uren] ;Lees (read) tijd in vanuit de PCF8583
BUSIN %10100000, $05, [dag, weekdag, maand, jaar] ;Lees (read) tijd in vanuit de PCF8583
;Zet de BCD waarden van de seconden, minuten en uren om in decimale waarden
Seconden = ((Seconden >> 4) * 10) + (Seconden & 15)
Minuten = ((Minuten >> 4) * 10) + (Minuten & 15)
Uren = ((Uren >> 4) * 10) + (Uren & 15)
dag = ((dag >> 4) * 10) + (dag & 15)
maand = ((maand >> 4) * 10) + (maand & 15)
jaar = (jaar >> 6)
weekdag = (weekdag >> 5)
;Plaats nu de decimale waarden (de tijd dus) op het display
PRINT AT 1, 1, "Tijd: ", @Uren, ":", DEC2 Minuten, ":", DEC2 Seconden, " "
;PRINT AT 2, 1, DEC2 weekdag, " ", DEC2 dag," ", DEC2 maand," ", DEC2 jaar
GOSUB MeetTemperatuur ; deze subroutine leest de temperatuur in
;Plaats nu de gemeten temperatuur op het display
PRINT AT 0, 15, REP "-"\NegTemp, DEC Temp / 100, ".", DEC1 Temp / 10, 31, "C "
PRINT AT 4,0, "dit is een test "
DELAYMS 1000
PRINT AT 4,0, "om een RTC met tekst "
DELAYMS 1000
PRINT AT 4,0, "op het dispay te "
DELAYMS 1000
PRINT AT 4,0, "zetten "
DELAYMS 1000
WEND ;Terug naar WHILE
INCLUDE "font2.inc" ; hierin staat het fonttabel voor het display (aangepast tabel)
ik zou je wachtloop onderbrengen in het steeds
weer uitlezen van de klok
je kan tussendoor delays van ...zegmaar 200Ms
toepassen, en en teller meelaten lopen die je steeds verhoogd
tot de juiste wachttijd is bereikt.
dan teller op nul, regel vervangen, en weer dezelfde loop opvragen
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Voor een LCD (en voor enorm veel andere zaken ook) is het erg handig om een timer interrupt te voorzien in je µC, waarin je een aantal vlaggen kunt zetten om de rest van je programma getimed te laten lopen.
Zo is het niet handig om je LCD constant te verversen, voorzie je in je interrupt dat er bijvoorbeeld 6 keer per seconde het vlagje "LCD_update" hoog wordt dan kan je dat gebruiken in je mainloop om het LCD van nieuwe (of dezelfde) tekst te voorzien. Op vergelijkbare manier kan je gaan timen, zet het vlagje "timer_1s" hoog in je mainloop en in de interrupt kan je netjes 1 seconde later dat weer laag maken (of andere vlag hoog, net wat jij handig vind), hiermee kan je mainloop op volle snelheid blijven lopen terwijl je toch dingen getimed kan doen lopen.
Voor heel tijdskritische dingen moet je uiteraard alle (of een deel van) de afhandeling in de interrupt doen, maar meestal is de interrupt als doorgeefluik voldoende.