Home › FORUM › Microcontrollers › Flowcode4 cijfers opslaan in EEprom geheugen

FORUM

Log in om antwoord te posten of de notificatie-service te gebruiken.

1   2     volgende

Onderwerp: Flowcode4 cijfers opslaan in EEprom geheugen

Author Post

Jan Wortel

24 berichten

Op bezoek
Op bezoek

Read post 01-12-2009 09:57

Hallo allemaal,
Ik ben recentelijk begonnen met Flowcode4 en probeer een ontwerp te maken voor een telefoonkiezer waarbij ik een telefoonnummer van 16 digits max. in het Eepromgeheugen kan programmeren via een Keypad en het er weer uithalen om er mee te kiezen.

Heeft iemand ervaring hiermee hoe dat zou moeten gebeuren?
Ik heb geen programmeer ervaring in C vandaar de Flowcode4.

Het volgende heb ik zelf al gevonden op het forum (kwam geloof ik van Henko) en denk dit te zoals aangepast te kunnen gebruiken:

(voorlopig met een PIC 16F877A)
Een variabele Telnr1 (INT) (ik wil 4 telnr geheugens maken)
en dan nog twee extra Byte variabelen:
LSB1=TELNR1
MSB1=TELNR1 >> 8

en teruglezen:
TELNR1=LSB1
TELNR1=TELNR1+(MSB<<8)

Maar hoe moet ik dit nu verpakken in FLOWCODE?
Moet ik hier een macro voor maken per TELNR

Wie kan mij verder helpen?

Jan

Schueler

1330 berichten

Expert¹
Expert¹

Read post 01-12-2009 10:59

Ik kan je wel een voorzetje geven...

Ik zou geen int gebruiken maar gewoon byte ( char ).
Dat houdt het overzichtelijker.
Voor een telefoonnummer zou je een array kunnen maken.

Byte telmem[16]

Nu heb je een reeks gemaakt met zestien hokjes die je ieder kunt adresseren met tel_nummer[0] tot en met tel_nummer[15].

Zover ik weet ondersteund flowcode geen 2D array maar dat is te omzeilen...

Nu om meerdere telefoonnummers op te slaan in de array kun je het volgende doen:

eeprom_address[16*aantal_nummers]

Op de volgende manier kun je nummers opslaan of eruit halen

eeprom_address[16*gewenste_nummmer + i ]

Hierbij staat i voor 0 tot 15 om zo het digits eruit te halen.


Misschien is het slim om bij elke telefoonnummer een extra byte toe te voegen met info of er op die locatie een nummer staat en zo ja hoeveel digits deze heeft.

b.v. een fictief mobiel nummer: 06 12345678

als je dit opslaat krijg je dan het volgende:

[ 0x0A, '0', '6', '0', '1', '2', '3', '4', '5', '6', '7', '8' ]

De 0x0A geeft dus aan dat er tien cijfers zijn.
Als een locatie leeg is kun je dit aangeven met een 0x00.


even een voorbeeldje om op te slaan:

eeprom[ locatie * 17 ], aantal_digits
for i = 1 to aantal_digits
  eeprom[ locatie * 17 + i], tel_nummer[i-1]


en om het weer op te halen:

aantal_digits = eeprom[ locatie * 17 ]
for i = 1 to aantal_digits
  tel_nummer[i-1] = eeprom[ locatie * 17 + i]



Kun je hier wat mee?
Als je wilt kan ik in de demo versie van flowcode 4 een opzetje voor je maken, maar misschien juist wel leuk om het eerst eens zelf te proberen.


Ben

Jan Wortel

24 berichten

Op bezoek
Op bezoek

Read post 05-12-2009 11:21

Hartelijk dank voor je hulp Ben.

Aanvankelijk zat ik ook in die hoek te denken maar dacht dat het niet zo moest.

Ik ga nu met jouw voorstel aan de slag.

Ik wil deze nummers "On the Fly" kunnen invoeren.
Bijvoorbeeld: ik zet de dialler in de programmeerstand en voer dan het gewenste telefoonnummer op de gewenste geheugenplaats in.

Kan je me daar ook een voorzetje in geven?

Ik heb in het verleden heel veel ontwikkeld met discrete componenten (C0-mos 4000 serie) en daar kon ik heel goed mee gogelen maar nu moet ik totaal anders gaan denken en dat is ff wennen.


Jan

Walbeek

181 berichten

Stamgast
Stamgast

Read post 05-12-2009 12:16

Hoi Jan,

Hier een klein voorbeeldje in Flowcode.
Misschien kun je hier wat mee.

Rinie

AttachmentInlezen Keypad in EEprom.fcf

Schueler

1330 berichten

Expert¹
Expert¹

Read post 05-12-2009 14:21

Mocht je nog in de problemen komen met te weinig geheugen dan kun je er nog voor kiezen om de nummers in nibbles op te slaan.
Even voor de duidelijkheid dat zijn halve bytes of te wel 4 bits.

Als je dat wilt weten hoe dat zou kunnen wil ik j daar wel mee helpen. Maar dan niet in Flowcode V4 omdat ik dat niet heb...


Ben

Jan Wortel

24 berichten

Op bezoek
Op bezoek

Read post 05-12-2009 22:52

Hoi Rinie,

Hartelijk dank voor het voorbeeldje.

Ik ben al een groot deel van de dag bezig geweest om het eerste gedeelte, het in de programmeerstand of checkstand zetten van de kiezer met displayindicatie en ledjes voor elkaar te krijgen. En dat lukt al aardig. Alle begin is moeilijk.

Het is de beste manier "learning by doing" om het denkproces in Flowcode bij mij aan de gang te krijgen. Maar ik doe het met groot plezier en met jullie hulp is het helemaal fantastisch.

Ik zie nu pas zat. 22:40 uur dat je het voorbeeldje gestuurd hebt, en zal het goed bestuderen. Ik leer er veel van.
Ik kom er later nog op terug.

Jan

Jan Wortel

24 berichten

Op bezoek
Op bezoek

Read post 18-12-2009 10:53

Beste Ben,

Met dank voor jouw voorzetje inzake het EEprom probleem.
Maar C is voor mij nog te hoog gegrepen in ben al blij dat ik iets in flowcode kan maken. Ik ben nu al een aantal dagen (met groot plezier overigens) met flowcode bezig en om een kiezer te ontwikkelen en dat gaat (met wat hulp van jullie) best lukken.
Ik ben al een heel eind, maar ik weet niet hoe ik in flowcode nibbles kan opslaan in een EEEprom. Ik heb maar 4 telefoonnummers nodig van ieder maximaal 16 digits (inclusief 0 buitenlijn) + jouw tip om een extrat byte te gebruiken omhet aantal digits per telefoonnummer in op te slaan, dus 17 x 4 = 68 bytes van de 256.
voorlopig heb ik voldoende geheugen. Maar ik wil wel weten hoe ik het beter kan doen. Moet ik dan een stukje C (routine van jouw) in een custom macro schrijven waarbij nibble most or lest ingesteld kan worden? Nogmaals ik ken (nog) geen C.

vr.gr.

Jan

Schueler

1330 berichten

Expert¹
Expert¹

Read post 18-12-2009 11:21

Jan,

Ik heb al geregeld berichten van je voorbij zien komen.
Goed bezig!

C is zo moeilijk of makkelijk als je het zelf wilt maken.

Je kunt het bij de basis houden en dat gaat eigenlijk altijd goed. Als je meer wilt halen uit de compiler en meer zelf invloed hebben hoe dingen verlopen wordt het al gauw wat spannender.

De C wat gebruikt kan worden bij Flowcode is niet zo heel moeilijk.
Er is een standaard blokje wat je in je code kunt hangen en daar kun je wat C code invoeren.

Maar als je alleen maar 4 nummers hoeft op te slaan is geheugen geen limiterende factor voor je. Mijn advies is dan ook om het niet moeilijker te maken dan noodzakelijk.

Als je wilt kan ik wel ets voor je in elkaar zetten in flowcode (v3) wat de nibble doet en wat met de 17 waarden werkt.
Wordt dan ergens eind volgende week ( rond de kerst hehe ).
Een versie met flowcode blokken en een versie met gebruik van C.

Je zou je code eens kunnen posten ( of mailen door op mijn naam te klikken )zodat ik er eens naar kan kijken. Ik heb ook flowcode v4 geïnstalleerd maar dit is een evaluatie versie dus de meeste ic's worden niet ondersteund.
Maar de code moet wel leesbaar zijn voor mij.


Ben

Jan Wortel

24 berichten

Op bezoek
Op bezoek

Read post 18-12-2009 12:19

Hoi Ben,

Daar Ben ik weer,

Hier is de file als attachment.

Ik ben benieuwd wat je er van vindt.


vr.gr.
Jan

Attachmenttelefoonnr programmeren 6-5.fcf

Attachmenttelefoonnr programmeren 6-5.obj

Attachmenttelefoonnr programmeren 6-5.cof

Schueler

1330 berichten

Expert¹
Expert¹

Read post 18-12-2009 14:47

Als eerste liep ik tegen het probleem dat je code niet open in FC4.0.
Dit is een bekende bug van FC want dit heb ik voorgaande versies ook al gehad. Erg vervelend. Maar goed, De laatste versie gedownload en geïnstalleerd en ik kan je code nu bekijken.
Ik kan echter geen wijzigingen doe op je code omdat ik een evaluatie versie heb ( max 4 macro's met ieder maximaal 16 blokken ).

Aangezien jij geen macro's gebruikt ( wat wel aan te raden is om je code leesbaar te houden ) kan ik je jammer genoeg daarmee niet helpen in de zin van voorbeelden.

Wat me opvalt is dat je veel jumps ( Spring naar connection point ) gebruikt. Daar is op zich niets mis mee maar je kunt beter loop gebruiken om je code overzichtelijk te houden.

Als voorbeeld:

A:
lees toetsenbord
Kijk of de toets losgelaten is ( 255 )
zo niet, jump naar A:


Dit kan ook zo:

loop
lees toetstenbord
zolang toets niet losgelaten


En aangezien je dit vaak gebruikt zou je dit weer in een macro kunnen zetten. Dat maakt het dan weer overzichtelijker.

Bij het inlezen van een toets gebruik je weer wel een while loop maar gebruik je een jump om uit de loop te komen. Dit is niet wenselijk mar het werkt wel...

Beter is om de check op het einde van de loop te zetten met "Keypressed <> 255" en de if statement en jump weg te halen.
De while loop blijft lopen totdat keypressed een andere waarden heeft als 255.


Mijn advies is om een keyboard macro te maken waarbij je een variabele mee geeft. In deze macro lees je het keyboard uit net zolang dat het keyboard deze waarden geeft. Dit kun je gebruiken om te wachten totdat een bepaalde toets aangeslagen word of dat er geen toets meer is ingedrukt ( 255 ).

Los daarvan kun je ook een macro maken dat geen variabele mee krijgt maar er juist eentje terug geeft als er en toets ingedrukt wordt. Dus als je die marco aanroept zal het net zolang wachten totdat er een toets wordt ingedrukt en deze teruggeven aan de gebruiker.
Dit kun je vergelijken met de macro keyboard wat je al gebruikt maar dan blijft deze wachten totdat er een toets ingedrukt wordt.

Hier kan ik wel een voorbeeldje van maken ( is minder dan 16 blokken ).

Als je dan je code op die manier toepast is je code al meteen een stuk leesbaarder. De rest zal ik vanavond eens bekijken.


Ben

Bericht bewerkt door Schueler op 18-12-2009 14:48

Bericht bewerkt door Schueler op 18-12-2009 14:49

Log in om antwoord te posten of de notificatie-service te gebruiken.

1   2     volgende

Payoff
Payoff

Volg ons ook op:

      

Direct doen

The School of Electronics

 

Elektor eVents, vakboeken, cursussen en meer. Kortom, innovatief studie- en onderwijsmateriaal met educatieve content!

Nu in prijs verlaagd

Elektor OSPV1

Tijdelijk € 210,- korting!

Dit zelfbalancerende indoor voertuig is ideaal voor bijvoorbeeld fabriekshal, magazijn of school.