PIC16F1826 met HD44780 en PicBasic

Arco

Special Member

Da's wel weer software 'matige' i2c... ;)
(TS heeft hardware i2c, dus dan ga je niet met bitbangen aan de gang...)

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

Golden Member

Ik had je al een keer een voorbeeld gegeven voor de DS1307.

Dat klopt, Lambiek. Maar dat kreeg ik niet werkend.
Het was voor een PIC16F877 en moest eerst alles 'omzetten' naar een PIC 16F1826. Daarnaast gaf het bij mij een aantal compilatie-errors.

De DS3231 is functioneel gelijk aan de DS1307, zij het dat bij de DS1307 inderdaad bit 7 van adres $00 wordt gebruikt voor aan-of uitzetten van de oscillator.

De code die je zojuist gaf

pic basic code:

;------------------------------------
; LEZEN EN SCHRIJVEN NAAR DE DS1307.
;------------------------------------
 
BStart                            ; Bus start
BusIn %11010001,0,[SECONDE]       ; Lees seconde + bit7 (is osc. aan/uit)
DelayMS 10                        ; Wacht 10ms
Clear SECONDE.7                   ; Zet oscillator aan
BusOut %11010000,[SECONDE]        ; Schrijf naar rtc
DelayMS 10                        ; Wacht 10ms
BusIn %11010001,2,[UUR]           ; Lees uur
DelayMS 10                        ; Wacht 10ms
Clear UUR.6                       ; Select 24 uur klok
BusOut %11010000,2,[UUR]          ; Schrijf naar rtc
BStop                             ; Bus stop

werkt met BUSOUT. Ik begreep dat dat I2C softwarematig. Wil je gebruik maken van de ingebouwde MSSP module van de PIC, dan wordt HBUSOUT voorgesteld lees ik in de Compiler Doc.

Maar los daarvan: de HBUSIN en HBUSOUT doen bij mij gewoon niks met de RTC.
Vandaar dat ik het programma helemaal had teruggebracht (dus zonder LCD)
om alle neven factoren uit te sluiten. Maar een simpele schrijfopdracht naar de RTC lukt me maar niet....

Fouten zijn het bewijs dat je het probeert..

HET WERKT!!! die stomme LVP pin :(

Kan schrijven en lezen van een DS3231, de synchronisatie van het display met de seconden kan beter maar dat is voor later.
Mijn doel is de SecondenPin van die module te kunnen gebruiken, die blijkt heel stabiel te zijn.

pic basic code:

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2019 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 03-Oct-19                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

Device = 16F887

Config1 FOSC_INTRC_CLKOUT, WDTE_OFF, PWRTE_OFF, MCLRE_ON, CP_OFF, CPD_OFF, BOREN_ON, IESO_ON, FCMEN_ON, LVP_OFF, DEBUG_OFF
Config2 BOR4V_BOR40V, WRT_OFF

Declare Xtal 8
All_Digital true
OSCCON                = %11110000	'Oscillator goed zetten voor 8Mhz 

'-------------------------------
Declare LCD_Type 0
Declare LCD_ENPin PORTD.1   'En-pin
Declare LCD_RSPin PORTD.0    'RS pin  
Declare LCD_DTPin PORTD.4  '4 lines interface

Declare LCD_Lines 2
Declare LCD_Interface 4
Declare LCD_DataUs = 50
Declare LCD_CommandUs = 2000

;Er wordt gebruik gemaakt van de hardware (MSSP) module in de PIC
;Dat zijn RC.4 (pin 23) voor de SDA en RC.3 (pin 18) voor de SCL
   
Dim Temp1 As Byte
Dim Temp2 As Byte
Dim TempVal As Byte
 
Dim Seconden As Byte              
Dim Minuten As Byte               
Dim Uren As Byte                  
Dim Dag As Byte                   
Dim Datumdag As Byte                
Dim Maand As Byte                 
Dim Jaar As Byte                 
Dim Ctrl As Byte 
Dim Secs_last As Byte
   
DelayMS 100

 
Seconden = 00
Minuten = 30                    
Uren  = 11                      
Dag  = 1                        
Datumdag = 14                   
Maand= 10                       
Jaar = 19                       
 
Ctrl = 0                        ; Control byte)
 

GoSub Datum_Tijd_Instellen      ; initiële datum en tijd naar de RTC
Cls 
 
While 1 = 1

GoSub Datum_Tijd_Ophalen
  
  Print At 1,1, "Tijd: ", Dec2 Uren,  ":", Dec2 Minuten, ":", Dec2 Seconden
  Print At 2,1, "Dat: ", Dec2 Datumdag ,  "/", Dec2 Maand,     "/", Dec2 Jaar
  If Dag=1 Then Print At 2,15,"Ma"
  If Dag=2 Then Print At 2,15,"Di" 
  If Dag=3 Then Print At 2,15,"Wo" 
  If Dag=4 Then Print At 2,15,"Do" 
  If Dag=5 Then Print At 2,15,"Vr"
  If Dag=6 Then Print At 2,15,"Za"
  If Dag=7 Then Print At 2,15,"Zo" 
  DelayMS 500 
  Secs_last = Seconden
Wend
 
Datum_Tijd_Instellen:          'Instellen Datum en Tijd op de RTC

    TempVal=Seconden 
    GoSub BIN_TO_BCD
    Seconden=TempVal
 
    TempVal=Minuten
    GoSub BIN_TO_BCD
    Minuten=TempVal
 
    TempVal=Uren
    GoSub BIN_TO_BCD
    Uren=TempVal
 
    TempVal=Dag
    GoSub BIN_TO_BCD
    Dag=TempVal
 
    TempVal=Datumdag
    GoSub BIN_TO_BCD
    Datumdag=TempVal
 
    TempVal=Maand
    GoSub BIN_TO_BCD
    Maand=TempVal
 
    TempVal=Jaar
    GoSub BIN_TO_BCD
    Jaar=TempVal


    HBStart
    HBusOut %11010000, 0, [Seconden, Minuten, Uren , Dag, Datumdag , Maand, Jaar, Ctrl] 'Write initial values for time / Date
    HBStop
    Return

Datum_Tijd_Ophalen:


    HBStart

    HBusIn %11010001, 0, [Seconden, Minuten, Uren , Dag, Datumdag , Maand, Jaar, Ctrl]
    HBStop
  
                       'De RTC werkt met BCD waarden, daarom moeten ze worden veranderd in Binair tbv display doeleinden
    TempVal=Seconden 
    GoSub BCD_TO_BIN
    Seconden=TempVal
 
    TempVal=Minuten
    GoSub BCD_TO_BIN
    Minuten=TempVal
 
    TempVal=Uren
    GoSub BCD_TO_BIN
    Uren=TempVal
 
    TempVal=Dag
    GoSub BCD_TO_BIN
    Dag=TempVal
 
    TempVal=Maand
    GoSub BCD_TO_BIN
    Maand=TempVal
 
    TempVal=Jaar
    GoSub BCD_TO_BIN
    Jaar=TempVal
    DelayMS 100
Return

'------------Converteer BIN naar BCD -------------------
BIN_TO_BCD:


   Temp1 = Dig TempVal, 0                     
   Temp2 = Dig TempVal, 1                     
   Temp2 = Temp2 << 4                         
   TempVal = Temp1 ^ Temp2                    
Return

'------------Converteer BCD naar BIN--------------------
BCD_TO_BIN:                                   ; Converteer BCD naar BIN
   Temp1 = $0F & TempVal                      ; Clear top vier bits
   Temp1 = Dig Temp1, 0
   Temp2 = TempVal >> 4                       ; 4 posities opschuiven om een 2 BCD waarde te lezen
   Temp2 = Dig Temp2, 0
   TempVal = Temp2 * 10 + Temp1
Return

edit: er zit nog een foutje in de Datumdag omzetting, maar das niet belangrijk voor het ogenblik...een jobke voor Bavelt ;)

LDmicro user.
Bavelt

Golden Member

Nou,..het 'jobke' voor bavelt is allereerst om het maar eens aan de praat zien te krijgen...

Lukt niet.

Ik heb een PIC 16F1826. De I2C pinnnen daarvan zijn Poort B.1 voor SDA en Poort B.4 voor de SCL.

Voor de LCD datalijnen is geen andere keuze dan Poort A.0 t/m A.3 (omdat in PicBasic de poorten elkaar moeten opvolgen. A4 is al niet bruikbaar vanwege de MCLR).

Dit heb ik daarom dus aangepast in het programma.

Na de eerste HBSTART raakt het display al van streek (zo werkt de CLS dan al niet meer).
De HBUSIN geeft de genadeklap, want dan hangt de boel (of de processor zit te wachten op iets wat hij niet krijgt..)
Het is toch echt om moedeloos van te worden.

Misschien toch maar weer gaan volleyballen ipv PIC's programmeren? :'(

Fouten zijn het bewijs dat je het probeert..

Als ik mij niet vergis heb jij toch ook een 16F887 om te proberen?

LDmicro user.
Bavelt

Golden Member

Ondertussen heb ik ook maar een PIC16F877A besteld. Gewoon om eens te zien of ik de bestaande programma's hier ook werkend kan krijgen.

Je zou geneigd zijn met een wantrouwende blik naar de hardware te kijken (DS3231, SSD1306), ware het niet dat het MikroBasic programma van Arco tadeloos draait in mijn opstelling.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Als ik mij niet vergis heb jij toch ook een 16F887 om te proberen

Posten hebben elkaar net gemist. Ik heb er een paar besteld (bij tante Alie, kan nog wel even duren).

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Oops, Ik zie dat ik een PIC 16F877A heb besteld ipv een PIC16F887A..

Heb de 887 nu ook besteld (Bij Conrad, gaat sneller)...

[Bericht gewijzigd door Bavelt op maandag 14 oktober 2019 12:27:05 (11%)

Fouten zijn het bewijs dat je het probeert..

Ik heb slechte ervaringen met Alie/Ebay controllers, ze wilden niet altijd programmeren maar je weet nooit...

LDmicro user.
Bavelt

Golden Member

Ik vroeg me wel eens af: Zal dag echt wat uitmaken?
Ik had het idee dat al dat spul vaak uit dezelfde fabriek komt.

Vermoedelijk bestelt Conrad het ook daar?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ondertussen ben ik na een paar weken eigenlijk nog niet verder (behalve dan wat graafwerk in datasheets)

Ik ben kort geleden geswitched van een PIC16F628A omdat die geen MSSP module heeft met hardwarematige I2C ondersteuning naar een PIC16F1826 die dat wél aan boord heeft.

Maar zoals al 'gepost' krijg ik een ogenschijnlijk eenvoudige toepassing, een datum/tijd weergeven met een RTC (DS3231) en een LCD (HD44780) display maar niet aan de praat in PicBasic.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Voor ic's die hier weinig kosten, ga ik mijn (on)geluk niet in Verweggistan zoeken... ;) (liever helemaal niet met halfgeleiders)
Kans dat je troep krijgt is aanwezig en je moet lang wachten. (in ruil voor misschien een paar kwartjes 'winst')

Je overstap naar een andere processor heeft weinig met de problemen te maken, ik gebruik de 18F1826/27/47 heel vaak, nooit problemen.
Het zal iets met Picbasic zijn. Wellicht hebben ze de 1826 niet goed geimplementeerd. (ik weet niet hoe dat bij Picbasic gaat)

Bij Mikrobasic heb je voor iedere pic 2 files:
- 1 voor de linker (met de geheugenstructuur van de chip zodat de linker weet hoeveel geheugen er is en hoe dat in elkaar steekt)
- 1 met alle registers met hun register en bitnamen en waar ze precies zitten (adres)

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

Golden Member

Zoals al geopperd, misschien moet ik gewoon afscheid nemen van PicBasic en mijn vervolgstappen zetten in MikroBasic.
PicBasic geeft blijkbaar toch teveel beperkingen (zoals bv de datalijnen van de LCD).
Het feit dat ik al weken bezig ben om het aan de praat te krijgen is al een signaal.
Terwijl het MikroBasic programma, waar veel commando's look-a-like zijn aan PicBasic, zonder problemen draait.

Het zou ook zomaar kunnen dat het voor een andere PIC zomaar wél werkt.
Dat kan ik pas proberen als ik ze binnen heb.

Het fijne van Picbasic vond ik wel dat de cursus van PicBasic (www.picbasic.nl) heel vriendelijk en toegankelijk is opgesteld. En ook goed bruikbaar als naslagwerk. En je kon makkelijk even een kopietje maken van een programma; In MikroBasic moet je dan eerste een nieuw 'project' definiëren als ik het goed heb begrepen. Maar ok, dat is te doen.

Wellicht is er ook een (gebruiksvriendelijke) cursus van MikroBasic? Het alternatief is grasduinen in de help van de MikroBasic compiler maar dat is niet echt handig denk ik.

Voor ic's die hier weinig kosten

Waar bestel jij die dingen, Arco? Mijn lokale "e-boer" heeft niet zoveel van de PIC's. Ik kan bij hem wel bestellen bij Conrad zonder verzendkosten.
Maar Conrad heeft ook niet alles.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ik bestel meestal bij Farnell of RS...
Deze had ik al gegeven: http://download.mikroe.com/documents/compilers/mikrobasic/pic/mikrobas…

Nadeel van die picbasic cursus is wel dat alles wat er staat al 10 jaar oud is en vaak niet meer klopt...

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

Golden Member

Ik heb net even gekeken bij Farnell (kende ze niet).

Kan het echt kloppen dat je daar gewoon 1 Ic'tje bestelt en géén verzendkosten betaalt?

Ik dacht dat zoiets alleen maar vanuit China kon..

Fouten zijn het bewijs dat je het probeert..

Ja, dat doen ze. Wel is het eigenlijk de bedoeling dat je een bedrijf bent en "meer" gaat bestellen. Ik geef d'r een paar duizend euro per jaar uit, en dan zeuren ze niet als ik een keer een paar weerstandjes van bij mekaar een euro laat komen.

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

Golden Member

Op 14 oktober 2019 19:46:33 schreef rew:
Ja, dat doen ze. Wel is het eigenlijk de bedoeling dat je een bedrijf bent en "meer" gaat bestellen. Ik geef d'r een paar duizend euro per jaar uit, en dan zeuren ze niet als ik een keer een paar weerstandjes van bij mekaar een euro laat komen.

Ik heb me geregisteerd (heb een kvk- en BTW nummer) en zojuist een eerste bestelling geplaatst.
Ik keek er echt van op dat voor € 2,52 een bestelling zou worden geleverd zonder verzendkosten.
Dat maakt het inderdaad wel heel aantrekkelijk om niet bij 'Alie' te bestellen.
De levertijd is veel sneller en wellicht heb je nog beter spul ook.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ik heb het er wel eens over gehad met de rayonmanager toen die een keer langskwam.
Hij zei dat ze natuurlijk niks verdienen aan zo'n zending, maar zolang het niet te vaak gebeurt vinden ze dat niet zo erg.
Hij zei wel dat als zendingen van een paar euro heel vaak voorkomen (en nooit 'normale'), ze een 'goed gesprek' met de betreffende klant houden... ;)

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

Golden Member

Op 14 oktober 2019 20:26:21 schreef Arco:
Ik heb het er wel eens over gehad met de rayonmanager toen die een keer langskwam.
Hij zei dat ze natuurlijk niks verdienen aan zo'n zending, maar zolang het niet te vaak gebeurt vinden ze dat niet zo erg.
Hij zei wel dat als zendingen van een paar euro heel vaak voorkomen (en nooit 'normale'), ze een 'goed gesprek' met de betreffende klant houden... ;)

In ieder geval heb ik nu snel een PIC16F887. Gewoon uit nieuwsgierigheid of ik dat aan de praat krijg.

Ondertussen ben ik al begonnen de MikroBasic 'user manual' door te worstelen.

Fouten zijn het bewijs dat je het probeert..

Op 14 oktober 2019 21:36:52 schreef Bavelt:
[...]
Ondertussen ben ik al begonnen de MikroBasic 'user manual' door te worstelen.

Dan worden jij en Arco beste maatjes :)

Nog een tip, als je experimenteert moet altijd een controller nemen met genoeg IO pinnen zodat je niet moet beginnen schipperen met die IO's
Een LCD vraagt 1 volledige port en daar komen nog andere inputs en outputs bij naarmate het programma vordert.

Ik gebruik altijd een 16F876a bij het starten en kan daarna nog altijd downsizen naargelang het programma.
Deze keer heb ik de pas via CO aangekochte 16F887 gebruikt omdat die nieuwer was voor de MSSP.

Een 16F182x zou ik bv nooit kopen als ik daar geen goede reden voor had, eerder een 16F88 of een 16F886.
Ik zeg niet dat een 16F182x niet goed is hé, verre van maar in de hobbywereld weinig gebruikt.
Een hobbyist moet zich geen zorgen maken als die controller binnen 20j niet meer op de markt is, de courantste zullen 50j op de markt blijven en er is dan ook veel meer over te vinden.

LDmicro user.
Bavelt

Golden Member

Dan worden jij en Arco beste maatjes :)

Maar dat zijn wij ook, hoor! ;) Je reageert ook altijd heel snel en accuraat.

Fouten zijn het bewijs dat je het probeert..
Lambiek

Special Member

Als je haar maar goed zit, GROETEN LAMBIEK.

:)

Voor diegenen die geinteresseerd zijn heb ik 4 lijntjes bijgeprogrammeerd die op de SQW outputpin een accurate 1Hz weergeeft.
Zo heb je altijd een 1Hz signaal bij de hand zonder verdere programmering en te gebruiken bij bv. freq.counters.
Die SQW pin is wel open collector( OC).

LDmicro user.
Bavelt

Golden Member

Ik heb nu ook de MiKroProg Suite geinstalleerd. Maar die kan de Pickit3 niet vinden als 'developer tool'.

Kan het kloppen dat die (nog steed) niet wordt ondersteund door MikroBasic?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Processors als de 16F88 zijn nooit echt mainstream geweest (je ziet ze weinig) dus daar zou ik zeker niet aan beginnen.
(Hij kan ook veel minder, is trager, en kost het dubbele van de 1827...)
De 182x zie je veel in schakelingen, hoor. (hoewel er nu alweer nieuwere zijn die meer mogelijkheden hebben zoals de 1709 en 1769)

Een compromis zou een 28 pinner zijn (bij standaard schakelingen is een 40 pinner bijna altijd te veel)
Bij meer als 28 pin ga ik toch altijd voor een 24F pic vanwege de prijg/prestatieverhouding. (dil gebruik ik al lang niet meer behalve soms bij tests)

De 87x(a) is helemaal lastig, want die heeft geen interne oscillator.

Mikroprog is volgens mij alleen voor hun eigen programmer bedoeld. (ik gebruik altijd het losse Pickit programma)
Hun development boards hebben die programmer onboard, zodat je alleen maar een USB aansluiting hoeft te hebben...

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