Tonen generen met PIC16F628A

Arco

Special Member

Ja'

Da's natuurlijk altijd zo. Het programma is niet helderziend... ;) (het weet niet wanneer jij de chip uit wilt lezen...)
Als je iets wilt uitlezen uit de chip, zul je altijd een 'read' moeten doen.

Die EEProm editor is gewoon een text editor, die doet niets met de eeprom. (die laat gewoon zien wat jij inklopt)

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

Golden Member

Jawel, maar na uitvoeren van het programma met het meegelinkte .ihex bestand (in het geval gebruik wordt gemaakt van de EEPRom Editor), ververst het scherm in de Pickit3 vanzelf.

Met de Write opdracht moet ik hem handmatig opnieuw laten lezen.
Daarvoor moet je dan wel de 'Auto Import Hex' uitzetten, anders is de Read knop disabled.

Die Auto Import Hex had ik continue aanstaan om het programma steeds te compileren en automatisch laten programmeren en het resultaat te bekijken.

Tja.
Maar ik ben blij dat het werkt. Maar daarbij ook wel weer veel geleerd vanwege grasduinen in Datasheets, raadplegen van MikroBasic helpfunctie, etc.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ja,

Dat kan niet anders. Om de chip uit te lezen moet het lopende programma gestopt worden en de chip in de programmeermode gezet worden.
Dat kan dus nooit automatisch en continu, want dan loopt je programma niet meer.

Als je dat wel wilt heb je een debugger nodig.

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

Golden Member

Het zal vast kunnen, maar kan zo snel in MikroBasic de gecombineerde expressie niet vinden.

Wat ik wil:
If Time1 = 2 And Time2 = 3 then....

Dit Accepteert de compiler niet. In de manual zie ik steeds 1 conditie staan bij de voorbeelden.
Maar je wilt natuurlijk ook AND en OR willen combineren in een afvraging.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De compiler accepteert dat wel, maar je moet wel netjes haakjes gebruiken... ;)

pic basic code:


If (Time1=2) And (Time2=3) Then
  ..
End If
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Haakjes vergeten?

If (Time1 = 2) and (Time2 = 3) then....

edit: basic kennis ;)

[Bericht gewijzigd door MGP op donderdag 24 oktober 2019 21:51:49 (17%)

LDmicro user.
Bavelt

Golden Member

Jeetje, ja.

Ik was al met de haakjes begonnen te spelen, maar net deze variant niet.

Het werkt.
Thx

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De compiler wil graag duidelijkheid scheppen... ;)
Wat tussen haakjes staat wordt als vergelijking gezien waar true of false uit komt...

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

Golden Member

Ik snap het.
De compiler dwing je ook om netjes te werken heb ik al gemerkt: eerst de Sub's bij elkaar bovenaan, geen DIM's in de programma regels, etc.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Tja, ik ben begonnen aan het avontuur van de microcontrollers.
Er zijn mensen die hebben me al dagen niet buiten gezien.. :/

En alweer heb ik een uitdaging (sorry)

Het lezen van de RTC lukt, Het maken van een melodietje ook.
Maar nu de combinatie.

In het (vereenvoudigde) programmaatje hieronder 'bederft' de Read_DS3231() het feestje; geen geluid meer

pic basic code:

 program Midsomer_1826
 '==============================================================================
Sub procedure Read_DS3231()                                'Read RTCC registers
'------------------------------------------------------------------------------
  i2c1_Start()
  i2c1_Wr(0xD0)
  i2c1_Wr(0x00)
  i2c1_Repeated_Start()
  i2c1_Wr(0xD1)
  i2c1_Stop()
  End sub
  
main:

  OSCCON = %11110000                                            '32MHz internal
  Sound_Init(PORTB, 3)
  Read_DS3231()
  Sound_Play(500, 2500)
  while true wend
end.
Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Je stuurt data naar een ongeinitialiseerde i2c poort (i2c1_init(100000) ontbreekt.)
Dan kan er van alles onvoorspelbaars gebeuren...

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

Golden Member

Ik heb er i2c1_init(100000) voor gezet.

Dat geeft geen resultaat.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Het gaat fout na het statement i2c1_Wr(0xD0)

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Een half programma werkt ook niet (goed)...

- TRISx settings ontbreken
- ANSELx settings ontbreken

Daarbij is het wel handig om ook eens de datasheet door te lezen... ;)

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

Golden Member

Dit zou ik zeker niet hebben gevonden, al had ik de datasheet wel 10 keer gelezen..

;(

Maar dat zou dus betekenen:
TRISB = %00010010

(SDA = B.1 en SCL = B.4)
Die heb ik hiermee dan als input gedefiniëerd. (toch?)
Geeft geen effect.

ANSELB = 0 er ook bij gezet. Doet ook niks.

(Ik heb ook even de Write getest, maar die werkt dus ook niet).

Wanneer ik het RTC moduultje eruit trek, loopt het programma wel door.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Wanneer ik het RTC moduultje eruit trek, loopt het programma wel door.

maar ja, dan heb ik natuurlijk geen datum en tijd... ;(

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik ben wel ietsjes verder.

Het heeft blijkbaar toch iets te maken met de Poorten.
Want als ik mijn werkende programma pak Met een LCD en RTC en daar nu het geluid aan toevoeg, dan gaat-ie wel verder met Write en Read.
Ondanks dat er veel meer gebeurt in het programma.

De LCD-poorten worden hierbij gedefinieerd

pic basic code:

dim LCD_RS as sbit at LATB5_bit
    LCD_EN as sbit at LATB2_bit
    LCD_D4 as sbit at LATA0_bit
    LCD_D5 as sbit at LATA1_bit
    LCD_D6 as sbit at LATA2_bit
    LCD_D7 as sbit at LATA3_bit

dim LCD_RS_Direction as sbit at TRISB5_bit
    LCD_EN_Direction as sbit at TRISB2_bit
    LCD_D4_Direction as sbit at TRISA0_bit
    LCD_D5_Direction as sbit at TRISA1_bit
    LCD_D6_Direction as sbit at TRISA2_bit
    LCD_D7_Direction as sbit at TRISA3_bit 

Het fijne in MikroBasic is dat je inderdaad zelf je poorten kan toewijzen voor de datalijnen (in PicBasic moeten dat 4 aaneengesloten zijn. Met MikroBasic kan ik poort B.3 vrijmaken voor het geluid).

De LCD wordt vervolgens geinitialiseerd met

pic basic code:

i2c1_init(100000)                             'Init i2c port 100kHz
  Lcd_Init()               

Laat ik dit echter weg, dan hangt ook nu het geluid!

Fouten zijn het bewijs dat je het probeert..

Op 25 oktober 2019 12:07:54 schreef Bavelt:
Het fijne in MikroBasic is dat je inderdaad zelf je poorten kan toewijzen voor de datalijnen (in PicBasic moeten dat 4 aaneengesloten zijn.

Ik zou aaneengesloten pinnen de voorkeur geven, als je met een lcd werkt heb je sowieso 1 volledig poort nodig en dat is veel overzichtelijker als je later nog eens terugblikt op het programma of dat programma nodig hebt voor een andere toepassing, desnoods kies ik nog liever een grotere pic.
Maar elk zijn meug ;)

LDmicro user.
Arco

Special Member

Laat ik dit echter weg, dan hangt ook nu het geluid!

Ja, dat is logisch.
Als je het display aanstuurt zonder initialisatie zijn er nog geen i/o pinnen aan het display toegekend... (resultaat onvoorspelbaar)
Ik gebruik voor het display ook altijd aaneengesloten pinnen, werkt veel eenvoudiger...

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

Golden Member

Maar dat lukt niet, omdat bij de 1826 Poort B.1 voor de SDA is, Poort B.4 voor de SCL. Die zijn al bezet.
Bij Poort A is de A5 de MCLR, kan ook niet worden gebruikt.

Dan zou je inderdaad een grotere PIC moeten nemen, waarbij je een compleet vrije Poort hebt, zoals MGP al voorstelt.

Maar het frappante is dat ik nu na de Read en Write van de RTC wel geluid krijg, terwijl in het sterk vereenvoudigde programmaatje zónder LCD de boel hangt (of poort B3 geeft geen geluid meer).
Terwijl ik nu 6 poorten vrij heb (RS, EN en 4 datalijnen van de LCD).

Dat is toch vreemd?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ik blijf die DS3231 een rare chip vinden. Zo staat er in de datasheet:

Zoiets vreemds heb ik bij andere i2c peripherals nog nooit gezien...
Ik gebruik gelukkig nooit RTC's ... ;)

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

Golden Member

Ik gebruik gelukkig nooit RTC's ... ;)

Tja, maar ik wilde graag mijn melodietje datum-afhankelijk maken.
Dan heb je toch zo'n ding nodig, lijkt me. Inmiddels heb ik ook een DS1307 besteld, kijken hoe dat daarmee gaat.

Maar het blijft me intrigeren waarom onderstaand programma het geluid om zeep helpt na uitvoeren van een READ_DS3231...

pic basic code:


 program Midsomer_1826
 '==============================================================================
Sub procedure Read_DS3231()                                'Read RTCC registers
'------------------------------------------------------------------------------
  i2c1_Start()
  i2c1_Wr(0xD0)
  i2c1_Wr(0x00)
  i2c1_Repeated_Start()
  i2c1_Wr(0xD1)
  i2c1_Stop()
  End sub
  
main:


OSCCON = %11110000                                            
TRISB = %00010010
ANSELB = 0
Sound_Init(PORTB, 3)
Read_DS3231()
Sound_Play(500, 2500)
while true wend
end.

Stop ik er vervolgens een LCD in, gebruik 6 extra poorten en het werkt wel..

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Mis nog steeds i2c1_init... (dit kan zo nooit werken)

Voor RTCC gebruik ik de pic zelf; die heeft tijd genoeg over om wat countertjes bij te houden... ;)

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

Golden Member

Klopt, ik had het programma niet volledig weergegeven.
Nu:

pic basic code:

 program Midsomer_1826
 '==============================================================================
Sub procedure Read_DS3231()                                'Read RTCC registers
'------------------------------------------------------------------------------
  i2c1_Start()
  i2c1_Wr(0xD0)
  i2c1_Wr(0x00)
  i2c1_Repeated_Start()
  i2c1_Wr(0xD1)
  i2c1_Stop()
  End sub

main:

  OSCCON = %11110000   
  ANSELB = 0
  TRISB  = %00010010
  i2c1_init(100000)                             'Init i2c port 100kHz
  Read_DS3231()
  Sound_Init(PORTB, 3)
  Sound_Play(500, 2500)
  while true wend
end. 
Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik heb even een proefje genomen door een routine te maken die een LED een aantal keer laat knipperen.

Het blijkt dat na Read_DS3231() de processor zit te wachten op iets wat hij niet terug krijgt; het programma gaat nl niet verder. Het is dus geen kwestie dat het geluid het niet doet, maar 'iets' dat maakt dat het gewoon stokt na Read_DS3231().

Fouten zijn het bewijs dat je het probeert..