PIC16F1826 met HD44780 en PicBasic

Het verwijderen van HBstart en HBstop geeft geen resultaat.

De klok 'loopt' ook niet; alles staat op 0 en in de loop haal ik continu de tijd op en toon deze op het display.
Dan zou je verwachten dat je de seconden ziet lopen.

Voor de zekerheid heb ik even de aansluitingen van de DS3231 gecontroleerd. Er komt inderdaad een puls van 32Khz uit de 32K aansluiting van de DS3231.
Dus de oscillator werkt.

De SDA pin zit op Port B.1 en de SCL op Poort B.4

Wellicht nog een tip?

4k7, zowel SDA als CLK

Het lijkt wel of de RTC in een 'Reset mode' staat.
In een beschrijving van een DS3231 van Maxim hebben ze het ook over een RST pin. Die zit hier echter niet op.

[Bericht gewijzigd door Henry S. op 1 oktober 2019 20:37:24 (79%)]

Ik zie toch echt /RST staan bij pin 4... ;)
Ik weet niet wat die HBusIn/Out allemaal 'onder de motorkap' doen, maar ik stuur altijd het registeradres mee als ik i2c schrijf/uitlees.
(dan weet je zeker dat de juiste registers benaderd worden)

De DS3231 heb ik zelf nooit gebruikt, maar zou hetzelfde moeten zijn als 'normale' i2c ic's (hoewel de datasheet te wensen overlaat)

[Bericht gewijzigd door Arco op 1 oktober 2019 16:24:04 (80%)]

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com
Piet_Knutselaar

Golden Member

pic basic code:

HBUSOUT %11010000, 0, [Seconden, Minuten, Uren , Dag, Datumdag , Maand, Jaar, Ctrl]

% (zijn bitjes) voor het adres (zelf dus ook overheen gekeken dus)

Ik zie toch echt /RST staan bij pin 4... ;)

Waar zou pin 4 dan moeten zitten hier?

% (zijn bitjes) voor het adres (zelf dus ook overheen gekeken dus)

Meteen geprobeerd natuurlijk (klinkt ook wel logisch, dat % teken).
Helaas biedt het geen verandering. Er komt geen tijd binnen...

[Bericht gewijzigd door Henry S. op 1 oktober 2019 20:37:04 (48%)]

Ja, je had er niet bij verteld dat 't over een kant en klare module ging... :)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Wat bij I2C wel eens een instinker is, dat is dat je adressen op 2 manieren kan interpreteren/noemen. En die worden alletwee gebruikt.

Eerst de technische situatie. Als je een device wil adresseren roep je in bit 7-1 z'n adres, en in bit 0 of je wilt lezen (1) of schrijven (0).

Als bit 7-1 dan 1010011 moet zijn voor een bepaalde chip en je wilt lezen, dan moet je dus 1010 0111 sturen. 0xA7 . En schrijven wordt 0xA6. Het is dan handig om 0xA6 het adres te noemen en +1 te doen voor "lezen".

Andere mensen zeggen dat het adres 1010011 -> 101 0011 dus 0x53 is. Dat moet je dan *2 doen om te schrijven en *2+1 om te lezen....

BEIDE conventies worden gebruikt. Als je picbasic de ene wil en je hebt de andere uit het datasheet gevist dan ben je de sjaak, adresseer je "lucht" en antwoord de DSxxxx niet.

Detecteert je i2c library of er een ACK komt als iets geadresseerd wordt? Controleer of je goed zit, of doe een scan....

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

Een goedkope LA van een tientje is onontbeerlijk als je veel met i2c of spi (problemen) werkt, heeft me dagen zoekwerk bespaard...
(zonder tast je eigenlijk in het duister wat er precies verstuurd wordt)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Op 30 september 2019 13:13:08 schreef Bavelt:

@Stynus: grappig dat het bij jou wel werkte met 'PORT'.

Is helaas afhankelijk van de versie van picbasic dat je hebt. Met updates regelmatig gemerkt dat ik voor een lcd tussen port en lat moet hebben wisselen om het een update later weer terug te moeten wisselen. Niet aan gedacht om dat ook even bij mijn bericht te vermelden.

Met vriendelijke groet, Stynus ||| http://www.elektronicastynus.be ||| http://e-stynus.com ||| --> Automatische trapverlichting <--

Het hangt zoals eerder gezegd ook af van de pinbelasting. 50pF extra geeft al 250nS vertraging, genoeg om R-M-W problemen te krijgen...

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Op 1 oktober 2019 20:43:47 schreef Arco:
Een goedkope LA van een tientje)
[bijlage]

Wat is dat, een LA? Een soort scope?

Ik heb maar even snel de PIC aan de kant gezet en mijn Arduino UNO (die ik nog nooit heb gebruikt) geïnstalleerd, met de DS3231 en de Computer als seriële monitor.
Dat werkt.

M.a.w de DS3231 doet het gewoon en is niet stuk. Dat kan ik dus uitsluiten. Wat me wel opvalt in het C-programma (vreselijke taal overigens :/ ) de Baudrate wordt gezet op 9600. Arco had het er ook onlangs over.

Kan dat nog een issue zijn waarom de communicatie niet op gang komt?

De reactie van Rew ga ik ook nog testen.

[Bericht gewijzigd door Henry S. op 3 oktober 2019 00:37:31 (59%)]

Wat is dat, een LA? Een soort scope?

Logic Analyzer: https://www.dx.com/p/zhaoyao-24m-sampling-rate-8-ch-saleae-l...ZPaVnGxWUk
Baudrate 9600 heet in ieder geval niks met i2c te maken... (i2c is standaard 100 of 400 kHz)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Je kan hem ook voor ongeveer de helft krijgen.

Op 2 oktober 2019 00:52:04 schreef Bavelt:
Wat me wel opvalt in het C-programma (vreselijke taal overigens :/ ) de Baudrate wordt gezet op 9600.

Dat is voor de (serieele) communicatie met de computer.

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

Op 1 oktober 2019 20:19:57 schreef rew:
Wat bij I2C wel eens een instinker is, dat is dat je adressen op 2 manieren kan interpreteren/noemen. En die worden alletwee gebruikt.

Eerst de technische situatie. Als je een device wil adresseren roep je in bit 7-1 z'n adres, en in bit 0 of je wilt lezen (1) of schrijven (0).

Als bit 7-1 dan 1010011 moet zijn voor een bepaalde chip en je wilt lezen, dan moet je dus 1010 0111 sturen. 0xA7 . En schrijven wordt 0xA6. Het is dan handig om 0xA6 het adres te noemen en +1 te doen voor "lezen".

Andere mensen zeggen dat het adres 1010011 -> 101 0011 dus 0x53 is. Dat moet je dan *2 doen om te schrijven en *2+1 om te lezen....

BEIDE conventies worden gebruikt. Als je picbasic de ene wil en je hebt de andere uit het datasheet gevist dan ben je de sjaak, adresseer je "lucht" en antwoord de DSxxxx niet.

Detecteert je i2c library of er een ACK komt als iets geadresseerd wordt? Controleer of je goed zit, of doe een scan....

Het is wel een heel gegoochel moet ik zeggen. Ik heb het wel 10 keer overgelezen en nog vat ik het even niet. Hoe ingewikkeld kan men het maken.
Volgens de datasheet van DS3231 is het adres %1101000x, waarbij x=1 voor lezen.

De Arduino gebruikt adres $68. Als ik naar de post van rew kijk kan ik dat met een beetje fantasie herleiden uit de %1101000.

Ik heb een I2C scanner geïnstalleerd en die geeft twee 'hits' voor de DS3231:
Adres 0x57 én 0x68.

Beide heb ik uiteraard geprobeerd bij het PIC programma; nog steeds geen resultaat bij het uitlezen.

Vervolgens heb ik een tellertje gemaakt die vanaf $57 het adres met 1 ophoogt en probeert te communiceren, maar het resultaat hiervan is dat het display alle kanten opschiet, tot het volledig 'hangen' van de uC.

Ik heb geen idee meer en raak zo'n beetje door de mogelijkheden heen om het aan de praat te krijgen.
Heeft iemand nog een ingeving?

Adres is altijd 7 bits (er bestaan er ook nog met 10 bits, maar die zullen we even erbuiten houden voor het gemak... ;) )

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

En dat er twee I2C adressen worden gevonden voor de DS3231?

Met Arduino zijn er programmaatjes, 'sketches', in omloop, waarmee je de I2C bussen scant op aangesloten devices. DIe worden dan getoond op de Seriële monitor (de PC)

Zou er ook iets zijn (of te maken) in PICBasic?
Dan kan ik op mijn breadboard een scan uitvoeren om te zien of hij de DS3231 Überhaupt wel vindt.
Idee?

[Bericht gewijzigd door Henry S. op 3 oktober 2019 00:37:52 (74%)]

Ik denk dat je daar weinig mee opschiet: je weet dan nog steeds niet waar het mis gaat (dat het mis gaat weet je al... ;) )

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Picbasic zal zelf het 0-bit aan of uitzetten.
Maar je moet wel een 8 bits waarde opgeven,
Dus 11010000

Just find out what you like and let it kill you

Op 3 oktober 2019 00:33:06 schreef hadv:
Picbasic zal zelf het 0-bit aan of uitzetten.
Maar je moet wel een 8 bits waarde opgeven,
Dus 11010000

Dat doe ik ook, voor lezen stuur ik HBUSOUT %11010001

Op 3 oktober 2019 00:22:30 schreef Arco:
Ik denk dat je daar weinig mee opschiet: je weet dan nog steeds niet waar het mis gaat (dat het mis gaat weet je al... ;) )

Nou, omdat de communicatie met de DS3231 maar niet tot stand wil komen, en het display ook af en toe raar doet (vreemde tekens op willekeurige posities), begin ik een beetje te vermoeden dat de LCD display met z'n 4 datalijnen en RW en EN misschien wel 'in de weg' zit.

Met de Arduino werkt het direct. Maar die toont de gegevens op een monitor.

Ik dacht als ik nu eens vanaf het breadboard ga scannen en het I2C adres kan vinden en tonen, dan weet ik dat de PIC communiceert via het I2C protocol.

De Display verlangt dat de datalijnen achter elkaar moeten liggen.
Bij Poort A kan je niet met 4 beginnen vanwege de MCLR.
Dus blijft alleen PoortA. 0 overals LCD_DTPIN.
Poort B kan weer niet omdat je daar zit met de SDA en SCL.

Nou, omdat de communicatie met de DS3231 maar niet tot stand wil komen, en het display ook af en toe raar doet (vreemde tekens op willekeurige posities), begin ik een beetje te vermoeden dat de LCD display met z'n 4 datalijnen en RW en EN misschien wel 'in de weg' zit.

Eureka!
Mijn vermoeden lijkt waar te zijn.
Ik heb de LCD verwijderd, de datalijnen niet gedefinieerd, zodat alleen de RTC overblijft.

Het PIC programma gedraaid om de tijd te zetten, vervolgens de RTC in de Arduino geplaatst om uit te lezen en voilá, hij heeft de tijd dus gezet.

Nu blijft de hamvraag waarom de I2C niet wil combineren met de LCD.

Het is altijd een beetje schimmig wat er precies in zo'n lcd library gebeurt...
(bij mikrobasic kun je alle pinnen apart opgeven, ook die van de databus)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Ik kan nergens uit de datasheet van de PIC16F1826 herleiden waarom de poorten A0 t/m A.4 niet zijn te combineren met de I2C Bussen op Poort B1 (SDA) en Poort B.4 (SCL).

Ik zou wel eens willen proberen of ik de DS3231 kan uitlezen, maar het resultaat te tonen op 'iets anders' dan via dezelfde PIC.
De Arduino doet het via de seriële monitor (PC via de USB ingang)

Zou het denkbaar zijn om de display bv via een andere PIC te laten lopen waarbij ik de 4 datalijnen en EN RW niet nodig heb?