PIC16F887

Arco

Special Member

Maar dat zou betekenen dat ik bij iedere compilatie de waarde weer moet wijzigen van deze constante.

Dat begrijp ik even niet... :/
Bij compilatie zet je er bijv. 0xAA in. Als de pic dan opstart weet 'ie dat het de eerste keer is, en zet de waarde dan op bijv. 0x55...
(dat blijft ook zo tot de pic opnieuw geprogrammeerd wordt...)

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

Golden Member

De 1847 kan zijn eigen flash programmeren: zie hoofdstuk 11 datasheet...

Daar had ik al naar gekeken en vandaar dat ik het zocht in iets als

pic basic code:

[code="picbasic"]FlashRead[0] = Flash_Read(0x0D00)
  If FlashRead[0] = 0 then
     Set_DateTime()
     FlashWrite[0] = 0x0001
     Flash_Write(0x0D00, FlashWrite)
  End if

Je kan flash lezen, schrijven, etc.
Maar nogmaals, ik zie niet dat het de startrun is.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Wat is FlashRead[]? Wat is Flashwrite[]?
Heb je iets compleets?

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

Golden Member

pic basic code:

Dim FlashWrite As Word[4]
    FlashRead  As Word[4]

en verderop:

pic basic code:

FlashRead[0] = Flash_Read(0x0D00)
  If FlashRead[0] = 0 then
     Set_DateTime()
     FlashWrite[0] = 0x0001
     Flash_Write(0x0D00, FlashWrite)
  End if

Het idee was om een waarde in de flash te stoppen. Wanneer deze 0 is dan moet de tijd worden gezet (= schone lij).
Dan na het schrijven van de RTC de waarde 1 erin, waardoor hij het de volgende keer overslaat.
Dat zou werken als de compilatie (en alleen die) de flash weer op 0 zet. Maar dat is dus niet zo.

Dus dit werkt niet.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Voorbeeld (werkend):
Eerste run gaat led 1 aan, verder alleen led 2

pic basic code:


Program Test

Const MyConst As Byte[1]   = (0xAA) Org 0x1FFF
Dim MyByte As Byte
    led1   As sBit At Latb.0
    led2   As sBit At Latb.1
    Dummy  As Byte
    WrBuff AS Word[4]

main:

  trisb  = 0
  anselb = 0
  latb   = 0
  Dummy  = MyConst[0]
  '--------------------------------------------
  
  MyByte = Flash_read(0x1FFF)
  If MyByte = 0xAA Then
    led1 = 1   delay_ms(1000)   led1 = 0
    Flash_erase(0x1FE0)   'Min. erase = 32 words
    WrBuff[0] = 0x3FFF    'Min write = 4 words
    WrBuff[1] = 0x3FFF
    WrBuff[2] = 0x3FFF
    WrBuff[3] = 0x0055
    Flash_Write(0x1ffC, WrBuff)
  Else
    led2 = 1   delay_ms(1000)   led2 = 0
  End If
  While True  Wend
End.

Bij nieuwere pics moet je wel in flash werken, want die hebben geen eeprom meer.
(met de 24F pics is 't wel makkelijker, want daar kun je hele blokken geheugen tegelijk verwerken)

[Bericht gewijzigd door Arco op zondag 26 april 2020 21:17:15 (10%)

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

Golden Member

Ja, het werkt nu wel. Bedankt!
Ik had zelf een soort oplossing gevonden met EEprom (versienr in de EEProm schrijven en bij iedere nieuwe release eentje ophogen).
Maar dit werkt natuurlijk mooier. Ik hoef nu niets handmatig aan te brengen.

Toch even kijken of ik het een beetje kan volgen:

Je plaatst een constante met de waarde 0xAA op het laatste adres van de flash.
Met de dummy voorkom je dat de compiler aan het sloop-en breek werk begint.

Dan ga je met Flash__Erase de hele zaak schoonvegen, maar liefst 32 Words vanaf adres 0x1FE0.

Daarna schrijf je een buffer naar de flash van 4 woorden.

De waardes 0x3fff en 0x0055 ontgaan me even. Je schrijft ze vanaf adres 0x1ffc.
De waarde van de constante 0xAA is nu weggepoetst.

Maar wat ik nog niet begrijp, bij het starten van het programma komt hij toch de instructie

pic basic code:

Const MyConst As Byte[1]   = (0xAA) Org 0x1FFF

tegen waardoor de waarde 0xAA er toch weer in komt?

Waarom gebeurt dat niet?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Waardes van constantes bestaan niet in een firmwarefile, alleen in de sourcecode. Als jij in je programma schrijft:

pic basic code:


const MyConst As Byte[1] = (0xAA)
..
..
..
myByte = MyConst[0]

dan wordt de constante door de compiler meteen vertaald en eruit gesloopt. Wordt dan:

pic basic code:

 
myByte = 0xAA

Bij het wissen van een 32 word block (kleinste mogelijk) moet je vooraf wel de overige words lezen als je ze weer wilt herstellen...
De waarde 0x3FFF voor de overige bytes is eigenlijk 'leeg', zodat die bytes ongebruikt blijven.

Als er een ORG achter staat, wordt de waarde op die plaats geschreven tijdens programmeren.
Als je die later zelf verandert, blijft die veranderde waarde gewoon bewaard...

Normaal zijn constantes er alleen voor de leesbaarheid, je kunt ook net zo goed meteen een waarde gebruiken.
Het kan trouwens nog eenvoudiger. Default zijn alle geheugenplaatsen leeg (0x3FFF)

Je kunt ook waardes schrijven zonder eerst te wissen, zolang het aantal '0' bits maar groter wordt.
(je kunt van een '1' een '0' maken, maar niet andersom)

pic basic code:


Program Test

Dim MyByte As Byte
    led1   As sBit At Latb.0
    led2   As sBit At Latb.1
    WrBuff AS Word[4]

main:

  trisb  = 0
  anselb = 0
  latb   = 0
  '--------------------------------------------
  
  MyByte = Flash_read(0x1FFF)
  If MyByte = 0xFF Then
    led1 = 1   delay_ms(1000)   led1 = 0
    Flash_erase(0x1FE0)   'Min. erase = 32 words
    WrBuff[0] = 0x3FFF    'Min write = 4 words
    WrBuff[1] = 0x3FFF
    WrBuff[2] = 0x3FFF
    WrBuff[3] = 0x0055
    Flash_Write(0x1ffC, WrBuff)
  Else
    led2 = 1   delay_ms(1000)   led2 = 0
  End If
  While True  Wend
End.

Je hebt dan geen const nodig. Wel moet je de linkerfile (.mlk) voor de 16F1847 aanpassen zodat de compiler de laatste 4 bytes niet gebruikt.

code:


<MCU>
        <DEVICE_NAME>P16F1847</DEVICE_NAME>
        <ROM>
                <MIN_ADDR>0x0</MIN_ADDR>
                <MAX_ADDR>0x1fff</MAX_ADDR>
        </ROM>

De 0x1fff moet dan 0x1ffb worden.

[Bericht gewijzigd door Arco op maandag 27 april 2020 00:06:00 (42%)

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

Golden Member

Dank voor de uitleg, Arco. Ik waardeer dat zeer.

Ik heb vanmorgen de adressen en bits lopen uittekenen op een vel papier, om te kijken of ik nou door heb wat er precies gebeurt.
Maar toch heb ik het niet helder.

Als je bijvoorbeeld schrijft vanaf adres 01FE, 32 woorden lang (512 bytes), dan kom je uit op adres 21EO.
Maar welk raakvlak heeft dat nu met de waarde je leest op

pic basic code:

MyByte = Flash_read(0x1FFF)

?

Vervolgens schrijf je vanaf 0x1FFC 4 woorden, dan kom je uit op adres 0x203C.

Ik zie dat verband niet.

Ook de lol van de laatste write

pic basic code:

  WrBuff[3] = 0x0055

snap ik niet. Waarom 0x0055?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Op 27 april 2020 12:40:36 schreef Bavelt:
Als je bijvoorbeeld schrijft vanaf adres 01FE, 32 woorden lang (512 bytes), dan kom je uit op adres 21EO.
??? - Rare words heb jij, mijne zijn 2 bytes lang... ;)
Ook de lol van de laatste write

pic basic code:

  WrBuff[3] = 0x0055

snap ik niet. Waarom 0x0055?
De waarde was oorspronkelijk 0xAA, ik schrijf er een andere willekeurige waarde naar toe om die te veranderen.
En 0xAA / 0x55 worden daar vaak voor gebruikt, omdat ze precies tegengestelde bitpatronen hebben.

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

Golden Member

??? - Rare words heb jij, mijne zijn 2 bytes lang..

Die van mij nu ook... :/

Nou, dit werkt dus helemaal goed. Weer wat geleerd!

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Er is wel een grafische library voor bijv. de KS0107/08 chipset...

Die kende ik niet. Heb er even naar gekeken. Ze zijn groter, ook wat duurder
(alhoewel, rond een tientje..).

Ze hebben geen hoge resolutie zo te zien.

Eigenlijk jammer dat die Oleds maar tot 1,3" gaan. Tenminste ik heb ze nergens groter gezien (behalve een TFT). Met die dingen bereik je best wel een hoge resolutie met die kleine pixeltjes.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Na het proefje met temperatuur en een lichtsensor, dacht ik nu aan iets wat reageert op geluid. Zijn daar ook sensortjes van (behalve dan natuurlijk microfoontjes)?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Je zou een piezo buzzer kunnen gebruiken, maar waarom? (iets beters al een electret microfoontje is er eigenlijk niet...)

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

Golden Member

Ik dacht misschien is er wel iets leuks om uit te lezen met I2c of SPI..
Ik dacht aan (wellicht bestaat het niet eens) dat je het geluidsniveau kan uitlezen en afhankelijk daarvan 'iets' in het programma kan laten doen.

Of anders analoog werken. Heb ik nog geen ervaring mee met de PIC's.

[Bericht gewijzigd door Bavelt op dinsdag 28 april 2020 00:31:29 (60%)

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Neem iets als de 16F1709, daar zitten 2 opamps in die je als microfoonversterker kunt gebruiken...
Als het perse digitaal moet, kun je een MEMS microfoon proberen. Maar dan moet je wel met de I2s bus werken...

[Bericht gewijzigd door Arco op dinsdag 28 april 2020 01:00:28 (36%)

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

Golden Member

Neem iets als de 16F1709, daar zitten 2 opamps in die je als microfoonversterker kunt gebruiken...

Ik heb gezien dat Farnell deze op voorraad heeft.
Lijkt nog wel een aardig ding. 8K RAM en ook MSSP plus de 2 Op Amps

Maar dan moet je dus wel analoog werken (microfoon versterken) en dan een geluidsniveau bepalen dat er wat gebeurt (te beginnen met ledje).
Electret Microfoontje heb ik al wel.

Weer een uitdaging...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Anders de genoemde MEMS met I2s...
Met e-paper displays kun je wel grotere klokken maken (een 4.2" is nog geen USD 20.-)

Aansturen is wel wat lastiger door de aparte opbouw van e-paper.
Voordeel: kost in rust geen stroom... (als je de spanning eraf haalt blijft 't eeuwig 3 uur... ;) )

[Bericht gewijzigd door Arco op dinsdag 28 april 2020 12:12:25 (12%)

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

Golden Member

e-paper..Hé, dat is interessant. Ook maar eens naar kijken.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Als je 'bewegende beelden' wilt tonen, kijk dan wel naar een display wat 'partial refresh' ondersteunt, anders wordt 't niks...
Moet een 2 kleuren display zijn (zwart/wit), een 3 of 4 kleuren display is ongeschikt voor bewegende beelden.
(er zijn er n.l. ook met bijv. wit/zwart/geel, wit/zwart/rood, wit/zwart/geel/blauw)

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

Golden Member

Je zou een piezo buzzer kunnen gebruiken, maar waarom? (iets beters al een electret microfoontje is er eigenlijk niet...)

Dat gaat hem inderdaad wel worden denk ik. Het lijkt het meest simpele, terwijl die dingen compleet met insteekmoduultje werkelijk niets kosten.
Ik zag al schema's met een enkele transistor als voorversterker waarbij de uitgang zo de PIC in kan.
(bij gebrek aan de PIC16F1709)

Inmiddels is ook de PIC16F1939 van Farnell binnen.
Kortom: werk aan de winkel...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

e-paper..Hé, dat is interessant. Ook maar eens naar kijken.

Toch zat ik me even af te vragen rond displays:
Als ik een lichtkrantje wil maken van 8 Led-matrixen, heb ik 8 x een Max7219 voor nodig (tenzij het anders kan maar volgens mij is dat het meest voor de hand liggende?).

Maar zo'n Oled displaytje heeft een SSD1306 aan boord die 128 kolommen * 64 rijen in zijn eentje aanstuurt.
Is dat dan niet bruikbaar voor 8 van die display's?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De SSD is een COG (Chip On Glass), ligt als een 'blob' op de glasplaat direct aan de glaselectrodes vast. Hoe wou je daar wat mee doen?
(ze verkopen losse dies, maar dat lijkt me nog veel lastiger... ;) )

Daarbij zou er nog een bult extra drivers bijkomen om de leds aan te sturen. (de chip kan maar micro amperes leveren)

Neem anders 14 of 16 segments displays. Kun je er 8 aansturen met 2x max7219 of 1x HT16K33...

https://lh3.googleusercontent.com/proxy/tOINNUFnw9pK9JywxTrZALNtdBaXvM5bAxemEHcXwdao6O0rl7T3adnZ85SBgFu5HGZmBhUElf2vTUjaGlTlWPl5WpVXTG5wjmunbphwjaOhol-ngBfjeOBJB24-Q_Q-HyxsILvz3w

De HCMS-2972 vind ik ook heel mooi, heeft serieele interface...

Heel mooi, heel duur, en heel klein... ;)

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

Golden Member

Ok, COG...

Maar het blijft wel dat de SSD 128 * 64 pixels individueel kan aansturen. Dat heeft-ie dan wel weer aan boord.

De MAX7219 is op zich een 'makkelijke'chip, maar toch bij een toepassing met 8 matrix-displaytjes heb je er dan toch 8 nodig. En ze zijn met hun 24 pinnen best fors.
Keerzijde is dat je geen weerstanden en aanvullende drivers hoeft te hebben
Tja..

de HCMS-2972 ljikt me ook een aardige. In "kloon uitvoerig" zijn ze ca € 2,75, incl bezorgkosten zag ik.
Zal wel kwalitatief minder zijn, maar wellicht wel leuk om eens mee te spelen.

Ik heb echter ook een aantal Kingsbright TC-07 matrixjes. Die kan je naadloos tegen elkaar aan monteren. Vergt wel weer meer solderen.

Het blijft mooi spul... :)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik zag dat de de aansturing van die HCMS-2972 met een seriële interface verloopt.
Is dit weer iets anders dan I2C of SPI?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Is een SPI interface.
Zoals gezegd zou je niks aan die SSD hebben, die kan maar enkele uA (of minder) leveren. Dan heb je een bult aan drivers nodig.

Waar vind je die displays zo goedkoop? Ik heb ze nog nooit onder de 20 euro gezien...

[Bericht gewijzigd door Arco op zaterdag 2 mei 2020 02:35:43 (23%)

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