Sterrenhemel

Dit topic is gesloten

Bavelt

Golden Member

De routine is wat complex, doordat de tijd om 3 uur 's nachts wordt teruggezet, en de tijdstippen 02:00 en 03:00 die nacht dus 2x voorbij komen...

Klopt, dat was ook mijn probleem. In een vorige proef deed ik dat door een vlaggetje in de EEprom te zetten zodat je weet of de wisseling al heeft plaatsgevonden.
(Het moet immers ook gewoon werken als je op een willekeurig moment de spanning er weer op zet en alles wordt gereset).

Ik ga deze routine eens uitproberen in het programma!

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik krijg het nog niet echt rond met deze module.
Het switchen van wintertijd naar zomertijd gaat makkelijk, van 02:00 uur naar 03:00 uur werkt.
Dan tel ik bij de uren eentje op.

Zo niet (wintertijd dus) dan tel ik niks op. Dat zou dan de "echte" tijd moeten zijn.

Maar de terugschakeling van zomer naar winter gaat niet, omdat de RTC klok immers op 02:00 uur staat en de wintertijd pas om 03:00 begint.

In deze routine lees ik de RTC tijd. Time[2] zijn de uren.

pic basic code:

'========================================================================================
 Sub procedure Read_DS3231()                         'Read Date in RTC registers
'========================================================================================
  Soft_I2C_Start()
  Soft_I2C_Write(0xD0)
  Soft_I2C_Write(0x00)
  Soft_I2C_Start()
  Soft_I2C_Write(0xD1)
  Time[0] = Bcd2Dec(Soft_I2C_Read(1))
  Time[1] = Bcd2Dec(Soft_I2C_Read(1))
  Time[2] = Bcd2Dec(Soft_I2C_Read(1))
  Time[3] = Bcd2Dec(Soft_I2C_Read(1))
  Time[4] = Bcd2Dec(Soft_I2C_Read(1))
  Time[5] = Bcd2Dec(Soft_I2C_Read(1) And 0x7F)
  Time[6] = Bcd2Dec(Soft_I2C_Read(0))
  Soft_I2C_Stop()
  
  tYear        = Time[6]
  tMonth       = Time[5]
  tMonthday    = Time[4]
  tHour        = Time[2]
  
  If Is_Dst(1).0 = 1 then
     Inc(Time[2])                                    'Indicates Summer Time
     Lata.6 = 1
  Else
    lata.6 = 0                                       'Indicates Winter Time
  End If
 End Sub

Maar dit gaat dus niet goed....

[Bericht gewijzigd door Bavelt op woensdag 10 februari 2021 22:44:01 (88%)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik krijg het maar niet voor elkaar met deze module de tijd terug te krijgen van 03:00 naar 02:00 uur op het moment dat de wintertijd ingaat...

Is dat nu echt zo complex?

Fouten zijn het bewijs dat je het probeert..
bprosman

Golden Member

Op 11 februari 2021 14:00:22 schreef Bavelt:
Ik krijg het maar niet voor elkaar met deze module de tijd terug te krijgen van 03:00 naar 02:00 uur op het moment dat de wintertijd ingaat...

Is dat nu echt zo complex?

Welke clock chip gebruik je ?

De jongere generatie loopt veel te vaak zijn PIC achterna.
Arco

Special Member

Je kunt er niet zomaar een uur bij optellen, dat gaat mis bij tijden na 23:00 uur. Je zou dan bijv. 24:30 krijgen ipv 0:30
(en ook de datum klopt dan niet meer...)

Je moet de Time_dateToEpoch() en Time_epochToDate() functies gebruiken om er 3600 sec bij op te tellen...

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

Golden Member

Fouten zijn het bewijs dat je het probeert..
bprosman

Golden Member

De jongere generatie loopt veel te vaak zijn PIC achterna.
Arco

Special Member

Als je de tijd eenmalig wilt aanpassen bij de overgang, dan moet je die gewijzigde waardes wel terugschrijven naar dat klok ic.
Anders is 'ie bij de volgende uitlezing weer teruggezet...
Of zomer/wintertijd is gewijzigd sinds de vorige aanroep van de routine kun je zoals gezegd aan bit 1 zien...

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

Golden Member

Op 11 februari 2021 17:56:25 schreef Arco:
Als je de tijd eenmalig wilt aanpassen bij de overgang, dan moet je die gewijzigde waardes wel terugschrijven naar dat klok ic.
Anders is 'ie bij de volgende uitlezing weer teruggezet...
Of zomer/wintertijd is gewijzigd sinds de vorige aanroep van de routine kun je zoals gezegd aan bit 1 zien...

Ik heb dit nu ook inderdaad gedaan (ik wilde het zonder terugschrijven doen, maar dat gaat dus niet).
Het werkt nu weer!

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 19 januari 2021 21:02:06 schreef Arco:
Hier staat het gewijzigde pickit2 programma + devicefile:
https://www.microchip.com/forums/m1034543.aspx

Omdat ik wat aan testen was:
Met dit programma + pk2datfile werkt de PicKit2 en PIC16F18857 óók met het schrijven en lezen van EEROM..

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Dat klopt, hij heeft behoorlijk wat moeten wijzigen in de devicefile (21 extra scripts voor alles in goede banen te leiden) en in het pc programma...

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

Golden Member

Het is de bedoeling dat in de sterrenhemel tussen de sterren, de planeet Mars op komt, langs de hemel zijn baan trekt en weer weggaat.

Dat heb ik nu met 4 extra Oranje leds (3mm) die op de panelen zijn gemonteerd tussen de witte leds (de sterren).

Ze lichten dan één voor één op met een behoorlijke tijdsinterval. Op die manier zie je hem dan soms linksboven, dan weer rechtsonder.
Hiervoor gebruik ik vier A-Poorten.

Nu zou het fraai zijn, als een van deze led's oplicht dat langzaam gaat (dus van uit tot helder).
Ik kan dat doen met PWM. De PIC16F18857 heeft 3 PWM's. Dan kom ik er al eentje tekort.

Maar zou ik het wellicht slimmer kunnen doen? Er brandt immers steeds maar eentje tegelijk...

Ik zat te denken in de richting van het gebruik van de PIC12F1572. Die heeft 3 CCP's. Als ik er twee neem, kan ik dus 6 leds aansturen.
Het is wel zo, dat de lichtopbrengst van een led die aan bv CCP 3 hangt (Port RA2), de lichtopbrengst maar gering is. Ook bij

pic basic code:

Pwm3_Set_Duty(Duty)

met duty = 255.
(De led rechtstreeks aan de Poort, dus geen weerstand ervoor).

[Bericht gewijzigd door Bavelt op maandag 15 februari 2021 00:44:46 (22%)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Vreemd.
In de Help van MB staat een voorbeeld voor PWM: (PIC12F1572)

pic basic code:

'Example Set duty ratio to 75%:

PWM1_Set_Duty(192)
 

Diezelfde compiler pikt het echter niet en wil daar geen getal maar een variabele...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Bij de 16F1709 wordt dat gewoon geaccepteerd...

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

Golden Member

Dit klopt ook niet:

De praktijk is dat 65535 = 100% duty-cycle en niet 255

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Dat komt doordat het 16 bit PWM is, dat was er vroeger nu eenmaal niet... ;)

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

Golden Member

Op 15 februari 2021 17:35:51 schreef Arco:
Dat komt doordat het 16 bit PWM is, dat was er vroeger nu eenmaal niet... ;)

Ah, natuurlijk...

Maar dan is de Help niet afgestemd op deze PIC.

Ik begreep al uit eerdere reacties dat de Help van MB een beetje een ondergeschoven kindje is..

Maar op zich werkt het. Ik kan deze PIC gebruiken om de Mars-leds langzaam te laten oplichten en weer uitdoven.
Dan gebruik ik voor de Mars-Ledjes twee van deze PIC12F1572's en stuur ze aan vanaf de hoofd uc, de PIC 16F18857.

Het wordt nog wat.... :)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik had hier ook nog een paar PIC16F1827's liggen. Die hebben zelfs 4 CCP-modulen!
Weliswaar geen 16 bits, maar wel voldoende om 4 Leds te dimmen.

Dat werkt keurig!
;)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Het is overigens nog wel even puzzelen om het dimmen van een LED 'geliijkmatig' te laten verlopen, met een 8 bits PWM.

Het effect (lichtopbrengst) van de duty cycle tussen bv 0 en 20% is veel groter dan van 20 -99%...

De minimum waarde is dus 1 (0,4%). Maar dan zie je het ledje al voorzichtig oplichten. ben je bij de 10%, dan brandt het al 'behoorlijk'.

Ik heb maar voor 500 Hz gekozen als frequentie.
Wellicht ligt het ook aan het type ledje.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik heb hier ook nog een PIC16F18875. Die heeft ook meerdere CCP's.
Dan zou ik geen aparte uC hoeven te gebruiken (is op zich lastig om dat er dan 2 programma's zijn)

Maar wat is nu het verschil tussen de CCP's en PWM Out?

CCP wordt toch gebruikt voor PWM?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Dat klopt. De module die (onder andere) PWM doet heet de CCP (Capture, Compare, en Pwm...)

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

Golden Member

Dus ik kan hier 7 PWM's gebruiken begrijp ik? (5 CCP's die meer kunnen dan alleen PWM en 2 voor PWM?)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

En waarvoor moet ik kiezen als TRIS wanneer ik PWM gebruik?

Output? Of ze als input definiëren?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ja, 7 PWM's. (PWM is altijd een output (TRISx = 0))

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

Golden Member

Done.

Ik heb hem nog niet aan de praat (bv CCP3). Ik las in de Datasheet dat de CCP op TMR1 werkt. Die moet ik dan blijkbaar nog configureren?

Ik dacht dat dit voldoende was:

pic basic code:

PWM3_Init(500)
 PWM3_Start() 
Duty = 127
PWM3_Set_Duty(Duty)

Fouten zijn het bewijs dat je het probeert..

Dit topic is gesloten