PIC 16F887 en MikroBasic

Omdat bestaande topics al heel oud zijn, en ik een actueel issue heb, maak ik er maar een nieuw Topic van.

Ik ben net begonnen met de PIC16F887, in combinatie met MikroBasic, maar loop tegen een startprobleem op.

Als ik deze PIC selecteer in het project, dan herkent hij de commando's ANSELA en LAT niet.
Ik heb gekozen voor de interne oscillator. Maar begrijp niet waarom de compiler de instructies niet accepteert.
De instructies staan gewoon in de datasheet van de 887.

pic basic code:



program Matrix
' Declarations section

main:


  ANSELA = 0
  TRISA  = 1                                    
  TRISB  = 0
  
  While true
     LATA.0 = 1
     delay_ms(500)
     LATA.0 = 0
   Wend

end.

De 887 is een oud beestje, heeft geen LATx registers...
En de ANSEL registers heten daar ANSEL en ANSELH (staat in de datasheet)

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

Ik had het wel zien staan in de Datasheet, maar ze heten toch ook in de 1826/1827 ANSEL?

Ik heb het nu zo:

pic basic code:

 program Matrix
' Declarations section

main:

  ANSEL.B0 = 0
  TRISB.0 = 0

  While true
     PORTB.0 = 1
     delay_ms(500)
     PortB.0 = 0
   Wend

end. 

Maar er gebeurt niks (daar waar ik een knipperend ledje had verwacht op Poort B.0

Volgens de datasheet van de PIC16F887 staat dat ANSELH bij PORTB hoort, dus even beter lezen in de goede datasheet.

Edit: Als ik de code goed begrijp is de led 500ms aan, gaat uit, sprongetje naar begin van de while, led weer aan. Een tweede delay ontbreekt.

[Bericht gewijzigd door Hunter op 1 november 2019 22:54:55 (39%)]

Zolang het probleem niet duidelijk is, is het zinloos om naar een oplossing te zoeken.

In de 1826 heten ze ANSELA en ANSELB, bij de 887 heten ze ANSEL en ANSELH...
De led gaat nu inderdaad maar iets van 400nS uit op 20MHz; ik neem aan dat je dat niet ziet... :)

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

Ik ben niet thuis in dit dialect, maar kan je PORTB en PortB door elkaar gebruiken?

Zolang het probleem niet duidelijk is, is het zinloos om naar een oplossing te zoeken.

Ja,

't Is gelukkig niet zo'n gruwelijke taal met (zinloze) case sensitivity... :)
(ik heb in één 'C' programma wel eens 3 labels gezien: 'loop', 'Loop', en 'LOOP'. Daar wordt je niet vrolijk van...)

[Bericht gewijzigd door Arco op 1 november 2019 23:20:23 (41%)]

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

Inmiddels werkt het:

pic basic code:

program Matrix
' Declarations section

main:


         '76543210
PORTD  = %11111111
TRISD  = %00000000

  While true
     PORTD.1 = 1
     delay_ms(200)
     PORTD.1 = 0
     delay_ms(200)
   Wend
end. 

Ik heb ook geen zin in een hele discussie, maar LOOP, Loop en loop in één programma verruimen je carriërekansen aanzienlijk.

Je krijgt heel snel ruimte voor nieuwe kansen...

Zolang het probleem niet duidelijk is, is het zinloos om naar een oplossing te zoeken.

Maar wat me wel opvalt: er zijn (heel) veel PIC's die nét weer hun eigen 'dialect' hebben. Zie bijvoorbeeld de ANSEL instructies.

Maar zou dat geen schone taak zijn voor een programmeertaal zoals MikroBasic om daar een vorm van standaard in te organiseren?

Je geeft immers op welke PIC je gebruikt in je programma. Dan kent hij de PIC met zijn eigenschappen en zou deze toch moeten kunnen 'vertalen' naar de standaard?

Nu is het iedere keer grasduinen in Datasheets (en dat valt niet mee voor iemand zoals ik die net begint).

Maar misschien zie ik het verkeerd.

Op 1 november 2019 23:18:09 schreef Arco:
(ik heb in één 'C' programma wel eens 3 labels gezien: 'loop', 'Loop', en 'LOOP'. Daar wordt je niet vrolijk van...)

Die vent/vrouw kan niet programmeren. Zo snel mogelijk dat soort code deleten!

Bezoek mijn neefjes' site: www.tinuselectronics.nl

ANSEL is geen instructie, het is een register. Registers worden beschreven in de datasheet.

Alle begin is moeilijk maar datasheets zijn eenvoudig te downloaden. De meeste problemen zijn met de goede datasheet op te lossen. Het is soms veel lezen en puzzelen, maar ik heb geen idee hoe het anders kan.

Zolang het probleem niet duidelijk is, is het zinloos om naar een oplossing te zoeken.

Dit heeft niks met de compiler te maken: de registers heten nu eenmaal zo.
Als je ze een andere naam gaat geven wordt het helemaal een chaos...
(je kunt ze toch zo opzoeken? Als je met een nieuwe processor begint moet je toch de datasheet vooraf doorlezen)

De namen zijn nu eenmaal historisch zo gegroeid, doordat de pics steeds groter werden.

Eerst zaten de analoog/digitaal settings in een paar bits van het ADCON register.
Daarna kwam ANSEL. Toen dat te klein werd is er een ANSELH aan vast geknoopt.
Toen dat ook vol was kreeg iedere poort een eigen register ANSELx.

In de begintijd speelde natuurlijk ook mee dat geheugen toen duur was. Iedere byte die je kon uitsparen was meegenomen.

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

Ok, Ik snap het.

Blijf wel dat ik bij de beschrijvingen in de Datasheets steeds weer 3 keer een regel moet nalezen voordat ik snap wat er wordt bedoeld. Als je daar meer ervaren / bedreven in bent dat weet je waarschijnlijk ook waar je moet zoeken.

Stug volhouden dus...

Als je ziet dat de eerste pics (16C5x) maar 25 bytes RAM hadden begrijp je dat ze zuinig moesten zijn... ;)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com
Zolang het probleem niet duidelijk is, is het zinloos om naar een oplossing te zoeken.

Ik ben aan het speuren geweest naar een voorbeeld van MikroBasic in combinatie met een PIC16F887 en een MAX7219 / Led Matrix.

Ik krijg wel veel C-oplossingen, maar MikroBasic is toch redelijk dun gezaaid.

C is een programmeertaal, BASIC is een anachronistisch dialect.

Zolang het probleem niet duidelijk is, is het zinloos om naar een oplossing te zoeken.

C is een programmeertaal, BASIC is een anachronistisch dialect

Mwah, gedurfde stelling.. :)

Als ik bv kijk naar het Visual.NET ontwikkelplatform van Microsoft, dan is Visual Basic.NET een heel stuk fijner dan C++ of C# vind ik.
De grote kracht van BASIC is dat je heel snel kunt lezen en begrijpen wat er gebeurt (zelfverklarend).

Bij C is het een 'Accoladefeestje...'

Maar het is vooral wat je gewend bent, denk ik.

Microsoft is wel het slechtste voorbeeld dat je kan noemen.

Zolang het probleem niet duidelijk is, is het zinloos om naar een oplossing te zoeken.

Ik ben aan het speuren geweest naar een voorbeeld van MikroBasic in combinatie met een PIC16F887 en een MAX7219 / Led Matrix.

Ik kan al een eind op weg geholpen worden wanneer ik weet wat de equivalent is van SHOUT (Picbasic), maar dan in MikroBasic.

Wat doet SHOUT? (de MAX7219 heeft zo te zien gewoon een SPI interface)

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

Dat gaat met dit commando

pic basic code:



latch = 0
SHOUT DataPin, ClockPin, MSBFIRST, [Kolom \ 8, Kar_Tabel [Kolom - 1]] 
latch = 1

Ik zag net bij MikroBasic de SPI library. Die ga ik eerst maar eens doorspitten

Valt niet veel te spitten... ;)

pic basic code:


Spi_Init()
..
Chipselect = 0
Spi_Write(byte1)    'command
Spi_Write(byte2)    'data
Chipselect = 1
Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Ik heb het zo aangesloten:
Datapin op B.7, Clock op B.6 (zit de programmer overigens ook op)

Als latch B.2

De code:

pic basic code:

 Program Matrix

Dim ClockPin as sbit at PORTB.6
DIM Latch as sbit at PORTB.2
DIM Datapin as sbit at PORTB.7

Dim Kolom as Byte
Dim Inhoud as Byte


Sub Procedure Max_Write()
latch = 0
SPI1_Write(Kolom)
SPI1_Write(Inhoud)
latch = 1
end sub

Sub Procedure Max7219_Init()
Spi1_Init()
                                    'Hier worden de registers geïnitialiseerd
Kolom = $09                         'Decode Mode Register:
Inhoud = $00                        'Code B for digits
Max_Write ()

Kolom = $0B                         'Scan-Limit Register:
Inhoud = $07                        'Digit 0,1,2,3,4,5,6,7 ($00-$07)
Max_Write()

Kolom = $0C                         'Shutdown Register:
Inhoud = $01                        'Normal Operation
Max_Write()

Kolom = $0A                         'Intensity Register
Inhoud = $00
Max_Write()
delay_ms(500)
end sub

Sub Procedure Display_Testen()      'Testen van het display; alle LEDS aan
Kolom = $0F
Inhoud = $01
Max_Write()
DELAY_MS(1000)

Kolom = $0F                         'Weer terugzetten naar normal operation
Inhoud = $00
Max_Write()
DELAY_MS(1000)

end sub


Sub Procedure Uitzetten_Leds()

DIM i1 AS BYTE
i1 = 0
FOR i1 = 1 TO 8
  Kolom = i1
  Inhoud = %00000000
  Max_Write()
NEXT i1
End sub

main:

'        76543210
PORTB = %00000000
TRISB = %11111111

 Display_Testen()
 Uitzetten_Leds()

while true wend

END. 

Maar het display 'doet maar wat'