serieel + lcd

Wat zie over het hoofd.

In onderstaand programma wil ik de teller zowel serieel als op lcd display uitlezen.
Als alleen programma voor lcd display maak werkt dit perfect.
Ook serieel kan ik in hyperterminal teller zichtbaar maken.
Nadeel hiervan is dat alle getallen achter elkaar woorden gezet i.p.v. enkelgetal.(latere zorg)
Al ik programma's samen voegt gaat het mis.
Krijg teller niet meer zichtbaar in hyperterminal en display slaat op hol.
De teller komt uit een eerder project.

pic basic code:


Device 16F628A                 ;Gebruik een 16F628  type
Config WDT_OFF,_
       PWRTE_ON,_
       LVP_OFF,_
       MCLRE_OFF,_
       HS_OSC                 ; intern kristal uit geschakeld
Xtal 20                       ; extern kristal van 20 MHz

All_Digital TRUE              ; Alle ingangen digitaal

Declare LCD_ENPin = PORTA.1
Declare LCD_RSPin = PORTA.0
 
Declare Hserial_Baud 9600     ; set baudrate op 9600
Declare Hserial_RCSTA $90     ;  << VUL DEZE WAAREN IN MET HET PROGRAMMA
Declare Hserial_TXSTA $24     ;   <<         PIC multi CALC 
Declare Hserial_Clear = On    ; reset buffer bij een overflow? 

Symbol telpuls = PORTB.3      ; potentiaal vrij contact

; variabelen instellen
Dim TELLER  As Word           
Dim TEL_BIT As Bit 

; poort instellingen
;        76543210
PORTA = %00000000
TRISA = %00000000
PORTB = %00000000
TRISB = %00001000             ; telpuls

Clear                         ; wis ram geheugen

TELLER = 0                    ; zet teller op waarde 0

Print At 2, 1,  "teller"
Print At 2, 14, "punten"
  
RUN:                          ; hoofdprogramma
    If telpuls = 1 Then
     TEL_BIT = 1
      GoSub TEL_OP
     EndIf
GoTo RUN 

TEL_OP:

    If TEL_BIT = 1 Then
     TELLER = TELLER + 1
     HRSOut Dec TELLER         ; stuur de waarde van teller serieel uit
     Print At 2, 9, Dec3 TELLER 
    EndIf
    
   TEL_BIT = 0
   
   If TELLER > 255 Then
    TELLER = TELLER - 1
   EndIf
   
   If telpuls = 0 Then
    If TEL_BIT = 0 Then
     Return
     EndIf
    EndIf
   GoTo TEL_OP
End         

Een wat vreemde code. Is telpuls wel fatsoenlijk ge-debounced?
Zolang telpuls hoog is wordt de teller als een wilde opgehoogd tot 'ie > 255 is (moeilijk te zien met serial/display), daarna blijft hij 255...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Telpuls komt uit een vorig project en werkte goed.

Heb mij daarna verdiept in seriële verbindingen, aan de hand voorbeelden op het forum.

Daarna heb ik telpuls prog ingevoegd en deze kon ik serieel zonder probleem uitlezen tot 255.

Daarna heb progje voor lcd toegevoegd en daar gaat fout.
Teller in display schiet omhoog en serieel krijg ik niet te zien.

Een delay gebruiken? (meer als een paar keer per seconde het display verversen heeft toch geen zin, meeste karakter displays zijn erg traag)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

inmiddels kleine aanpassing in programma.

teller in display werkt nu.
krijg hem alleen niet zichtbaar in hyperterminal ondanks dat ik wel signaal op mijn pin 8 van pic heb.(tx)

pic basic code:


Device 16F628A                 ;Gebruik een 16F628  type
Config WDT_OFF,_
       PWRTE_ON,_
       LVP_OFF,_
       MCLRE_OFF,_
       HS_OSC                 ; intern kristal uit geschakeld
Xtal 20                       ; extern kristal van 20 MHz

All_Digital TRUE              ; Alle ingangen digitaal

Declare LCD_ENPin = PORTA.1
Declare LCD_RSPin = PORTA.0
 
Declare Hserial_Baud 9600     ; set baudrate op 9600
Declare Hserial_RCSTA $90     ;  << VUL DEZE WAAREN IN MET HET PROGRAMMA
Declare Hserial_TXSTA $24     ;   <<         PIC multi CALC 
Declare Hserial_Clear = On    ; reset buffer bij een overflow? 

Symbol telpuls = PORTB.3      ; potentiaal vrij contact

; variabelen instellen
Dim TELLER  As Word           
Dim TEL_BIT As Bit 

; poort instellingen
;        76543210
PORTA = %00000000
TRISA = %00000000
PORTB = %00000000
TRISB = %00001000             ; telpuls

Clear                         ; wis ram geheugen

DelayMS 500                   ; lcd stabilisatie

TELLER = 0                    ; zet teller op waarde 0

Cls                           ; wis display

Print At 2, 1,  "teller"
Print At 2, 14, "punten"
  
RUN:                          ; hoofdprogramma
    If telpuls = 1 Then
     TEL_BIT = 1
      GoSub TEL_OP
     EndIf
GoTo RUN 

TEL_OP:

    If TEL_BIT = 1 Then
     TELLER = TELLER + 1
     
     Print At 2, 9, Dec3 TELLER
     HRSOut Dec TELLER         ; stuur de waarde van teller serieel uit
      
    EndIf
    
   TEL_BIT = 0
   
   If TELLER > 255 Then
    TELLER = TELLER - 1
   EndIf
   
   If telpuls = 0 Then
    If TEL_BIT = 0 Then
     Return
     EndIf
    EndIf
   GoTo TEL_OP
End         
Lambiek

Special Member

Op 27 april 2017 18:21:49 schreef zeeman..59:
krijg hem alleen niet zichtbaar in hyperterminal ondanks dat ik wel signaal op mijn pin 8 van pic heb.(tx)

Wil je het zichtbaar maken op de pc? Hoe heb je het één en ander aangesloten? Heb je gebruikgemaakt van een MAX232 chip, of anders?

Als je haar maar goed zit, GROETEN LAMBIEK.

Gebruik dit bordje met max232 er op in combinatie met serieel naar usb.
Deze combinatie werkt omdat ik dit heb geprobeerd met een test programmatje uit mei 2007 van het forum.

Op het printje zitten 2 led's rood en groen zodat je kan zien dat er communicatie activiteit

is.

hyperterminal staat ingesteld op: com.10, bits/sec 9600, databits 8, pariteit geen enstopbits 1.

Wil de telling zichtbaar hebben zowel in lcd display als op pc.

Uit de datasheet: TRISB.2 moet op 1 staan. Bladzijde 71 bovenaan. Deze staat bij jou op 0 = uitgang. Verander Trisb eens in 00001100. Werkt dat ?

Lambiek

Special Member

Heb je al eens geprobeerd om RSIN en RSOUT te gebruiken, daar doe ik het altijd mee. Dat werkt bij mij goed.

Als je haar maar goed zit, GROETEN LAMBIEK.

Lijkt me geen beste oplossing, om te gaan bitbangen terwijl er een 'echte' UART aanwezig is...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Klopt. Maar het kan een "tijdelijke oplossing" of een "manier om er achter te komen waarom het mis gaat" zijn.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Voordat ik verder ga met storing zoeken heb ik een vraag: het laatste programma zoals ik hem geschreven heb zou dit zo moeten werken.

Lambiek

Special Member

Op 28 april 2017 00:48:04 schreef Arco:
Lijkt me geen beste oplossing, om te gaan bitbangen terwijl er een 'echte' UART aanwezig is...

Als ik samen werk met Profilab en een controller werkt dat prima. Maar ik gebruik dan ook geen MAX232 maar een eigen ontwerp met optocouplers.

Als je haar maar goed zit, GROETEN LAMBIEK.

Lambiek dank je wel.

Ga er nu even vanuit dat mijn progje goed is.
Zal alles weer nalopen op slechte verbindingen.

Lambiek

Special Member

Ik heb even een MAX232 op een bread board gezet en aangesloten op de PC en Controller, en met dit programma werkt dat goed.

Hier heb je het voorbeeld.

pic basic code:


Device 16F887                     ; Processor type

Xtal 10                           ; Cristal 10Mhz

Asm                               ; Config settings
CONFIG_REQ            
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON 
__CONFIG _CONFIG2, WRT_OFF & BOR40V 
EndAsm
      
All_Digital true                  ; Alle poorten digitaal

Declare Adin_Res = 8              ; resolutie 8 bits
Declare Adin_Tad = frc            ; set RC osc
Declare Adin_Stime = 50           ; sample tijd 5

Declare LCD_RSPin PORTD.2         ; reset display poort D.2
Declare LCD_ENPin PORTD.3         ; enable display poort D.3
Declare LCD_DTPin PORTD.4         ; data display poort D.4 t/m D.7

Declare Hserial_Baud 9600         ; Set baudrate op 9600

Declare Hserial_RCSTA %10010000   ;  Register instelling
Declare Hserial_TXSTA %10100110   ; Register instelling 

Declare Hserial_Clear = On        ; Reset buffer bij een overflow 

Dim WAARDE As Byte                ; Variabele waarde

Clear                             ; Wis geheugen 

DelayMS 1000                      ; wacht 1 seconden

Cls                               ; wis display

         ;543210                  ; Hulpregel poort A
PORTA  = %000000                  ; Maak poort A laag
TRISA  = %111111                  ; Poort_A I/O

         ;543210                  ; Hulpregel poort B
PORTB  = %000000                  ; Maak poort B laag
TRISB  = %000000                  ; Poort_B I/O

         ;76543210                ; Hulpregel poort C
PORTC  = %00000000                ; Maak poort C laag
TRISC  = %00000000                ; Poort_C I/O

         ;76543210                ; Hulpregel poort D
PORTD  = %00000000                ; Maak poort D laag
TRISD  = %00000011                ; Poort_D I/O

         ;210                     ; Hulpregel poort E 
PORTE  = %000                     ; Maak poort E laag
TRISE  = %111                     ; Poort_E I/O

         ;76543210                ; Hulpregel analoog
ADCON0 = %00000001                ; ADCON0 register analoog

         ;543210                  ; Hulpregel analoog poort_B
ANSELH = %000000                  ; ANSEL register analoog poort_B

;==================================================================

WAARDE = 0

run:

    WAARDE = ADIn 0
    
    DelayMS 10
    
    HRSOut Dec3 WAARDE,8,8,8

    ;HRSOut Dec3 WAARDE,13
    
    Print At 1,1,Dec3 WAARDE,    
GoTo run

End   

Ik heb er even een potmeter aangehangen, die kan ik zowel op het dislpay als in Hyper Terminal af lezen. De drie achten achter "HRSOut Dec3 WAARDE,8,8,8" zorgen ervoor dat de waarde niet over het scherm gaat lopen, de waarde blijft nu stil staan. De (8,8,8) staat voor driemaal Backspace. Je kan er ook (13 in plaats van 8,8,8) achter zetten staat voor enter, dat doet precies het zelfde. Kijk maar of je er iets mee kan.

Als je alles goed aangesloten hebt moet dit bij jou ook werken.

Voor de RS232 gebruik ik ook een USB naar Serieel converter, net als jij zo te zien.

Als je haar maar goed zit, GROETEN LAMBIEK.

Ben er inmiddels uit wat er fout is.

Er van uitgegaande dat mijn programma goed is, ben ik er eindelijk achter waarom het 1 en ander niet werkte.

Is een combinatie van slecht contacten van mijn bread board en een kristal die niet lekker in z'n vel zit.

Lambiek dank voor het mee denken.

Aangezien ik starten beginner ben zit ik nog niet zo ruim in mijn onderdelen en moet ik het hebben van sloop en wat ik krijg.

Zodra ik een 887 inmijn bezit heb ga ik dit zeker uitproberen.

Het zal wel niet aan het kristal liggen, maar aan te lange verbindingen aan kristalpootjes, of de condensatoren aan het kristal. (moet zo kort mogelijk)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

De draden, soldeervlakken, en breadboadbaantjes vormen toch al gauw een aardige capaciteit. (de vaak brakke verbindingen in een breadboard daargelaten)
Bij kristal is iedere centimeter er een te veel...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Een andere vraag: hoe krijg ik mijn teller in het midden van mijn beeldscherm zoals hier onder.

teller 036 punten

Ik neem aan dat je met beeldscherm je lcd display bedoelt?... (ik noem dat niet echt een beeldscherm... :) )
Kwestie van juiste coordinaten opgeven bij Print at...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Op 29 april 2017 15:46:48 schreef zeeman..59:
Dit is toch niet te lang :-) :)

In het schema staan twee condensatoren getekend (als het goed is). Heb je die ook gemonteerd?

Ik kan me zo voorstellen dat de voorgeschreven waarde van rond de 20pF zomaar door je breadboard gehaald wordt. Prik je er dan 20pF bij, zit je met 40pF te hoog. Andersom kan evt. ook het geval zijn, dat je breadboard minder capaciteit vormt dan ik verwacht en dat ze juist WEL nodig zijn.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

@Arco: met beeldscherm bedoel ik niet het display.

Wil via de seriele verbinding,(hypeterminal) op mijn pc het zelfde zien als in mijn display.

@rew: kristal en condensatoren zitten, zoals je ziet op de foto, strak op elkaar met print pennen en wordt naast pic geplaatst.

Korter kan niet.
Oorzaak zit hem in de slechte contacten.

Wat ik nu wil is wat ik in mijn display ziet wil ook via hyperterminal op mijn pc zien.

Zoek voorbeeld/opzet om verder te kunnen experimenteren.