Nieuws:

Nu in MSM 244 REPORTAGE: De Nederlandse Modelspoordagen * A4 Dioramawedstrijd * Virtuele Messe 2024

Hoofdmenu

Waar zijn we nu mee bezig ? Microcontrollers

Gestart door ToThePoint, 13 januari 2012, 10:27:28 AM

raf

hoi Peter

je dat heb ik gedaan hoor want anders krijg je ze helemaal niet gecompileerd
en saai zou ik niet willen zeggen ;ik noem het eerder gecompliceerd alee voor mij dan toch
je ziet wel dat er tegenwoordig meer in jal word geprogrammeerd
maar het is april dus treinen aan de kant en nu weer aan de boten bezig
oktober kunnen we weer
wil niet zeggen dat ik niet met microprocessoren bezig ben maar dan op een andere manier

ik wil een comunicatie over 2 draden gaan maken
aan de zender kant 2 potmeters en 2 schakelaars
aan de andere kant 2 servo's en 2 schakel kanalen

enig idee ?? want die ser instructie heb ik nog nooit gebruikt
eens kijken of ik daar iets van in de handleiding vind
16F877
met deze zou ik het willen gaan doen
die s88 is dat geen serieel commando ik dacht het wel
en can bus daar wil ik echt niet meer aan beginnen daar heb ik mijn buik van vol
gr raf
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

dani

een zender en ontvanger via 2 draden ? 
Dat zou ik in "mijn" platformtaaltje gewoon oplossen door  2 ATMel controllers te linken via  I2C , de library  "wire.h" laden en klaar, je kan communiceren op "de I2C bus" met zo veel toestellen als je wil  , tot max 999 dacht ik.

of als je niet houdt van I2C dan gewoon  UART/TTL (korte afstand) of RS 232   (met een MAX232 IC en een handjevol condensatortjes aan beide kanten)  en  de ingebouwe  "Serial"  instructies gebruiken.

Maar ik ben dan ook nog maar in het beginners stadium.  :-) :-) :-) :-)
De kruik is te water gegaan...
De kruik is niet meer.

Gerolf

I2C heeft maximaal 127 adressen ;-)

Als het gewoon over twee toestellen gaat, zou ik voor RS232 gaan
Groeten uit "Marche-en-Bières"   ** Modelspoor is plezant **   TPIII-H0-DC-Zelfbouw

dani

Citaat van: Gerolf op 02 april 2015, 11:14:41 AM
I2C heeft maximaal 127 adressen ;-)

Als het gewoon over twee toestellen gaat, zou ik voor RS232 gaan

127 (+ 0 voor de master = 128 ) klopt als een bus....   I stand corrected  (jer hebt maar 7 significant data bits in een I2C adres)

en het tweede klopt ook. 

Zelfs met meerdere toestellen.  de Arduino Mega heeft max 4 hardware seriële poorten  (Serial, Serial1,Serial2, serial3)
en met  "softserial" poorten nog meer.
De kruik is te water gegaan...
De kruik is niet meer.

raf

ik zou wel een 75 meter ver moeten geraken
het idee er achter
oudere zenders hadden een seriële uitgang en de ontvangers een seriële ingang
zo kon je dus iets laten zien op een tentoonstelling zonder dat je een frequentie in beslag neemt

nu met onze duikboten (onderzoeks en filmboten)vaar je eigenlijk niet veel maar wel veel draaien en op en neer
nu de camera zit vast met een kabel want 2.4  en vooral video signaal naar boven zenden wekt niet (zelfs bij de echte niet)
nu die kabel er toch zit kunnen we evengoed ook de besturing signalen via de kabel mee sturen
of er nu een 2 of een 3 aderige kabel gebruikt word maakt dus niet zoveel uit

de 2 potmeters zijn voor de motoren (regelaars in de boot)en de 2 schakel kanalen zijn voor de verlichting en de pompsturing
licht hebben we genoeg kijk zelf maar

10 sipper led's zitten hier in en de update heeft 20 van die leds + nog een 3 watt led in het midden

het sturen van de pic is geen probleem dat programma kan ik schrijven en het ontvanger gedeelte daar krijg ik ook een stuk van klaar
maar juist dat serieel gedoe daar heb ik dus helemaal geen kaas van gegeten
eens kijken wat die voorgestelde systemen allemaal kunnen

mijn idee was elke variabele uitlezen
BV
pot1 = 12500
pot2 = 10000
schak1=800
schak2 = 15000
en deze zo via de seriële link verzenden
dan terug inlezen in pot1,pot2 enz.
en dan kan ik daar de betreffende regelaars mee sturen
gr raf die nu effe gaat spitten in de gekregen info
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

dani

* Met 2 aderige kabel kan je geen RS 232 gebruiken, daar heb je 3 draden voor nodig.   RX-Gnd-TX
* I2C over een afstand van 75 meter is om problemen vragen


Persoonlijk zou ik over een afstand van 75 meter opteren voor een symmetrisch seriëel protocol/bedrading zoals  RS-485 .
Dan heb je 2 draden voor zenden en 2 voor ontvangen volledig gescheiden.  dus in totaal 4 draadjes , en met de nodige hardware natuurlijk.


De  MAX-232 chip heeft 2   omzetters vane UART naar  RS 232 aan  boord


Er is ook een MAX485  chip beschikbaar  (8 pins IC)  die een  UART signaal omzet naar een symmetrisch RS485 signaal.  Dus dat is wat je volgens mij best zou kunnen gebruiken.   Alhoewel, de meeste toepassingen die ik zie  voor de  MAX485  zijn  "omgekeerd", dus om een  2-aderige UTP  kabel te gebruiken tussen 2 data punten.  (en die data punten sturen dan eigenlijk  gewoon RS232 op de 485 poorten in/out door de 2  min draden samen te leggen.)  Je valt dan wel terug op half duplex maar voorjouw toepassing lijkt me dat niet echt een ramp.


Steek eens je licht op bij  "aquaticus", daar ga je volgens mij veel fijne dingen vinden voor je onderzeeërs.

http://www.google.be/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&ved=0CAcQjRw&url=http%3A%2F%2Faquaticus.info%2Frs485&ei=JCYdVbezLYnfPa7sgKAI&bvm=bv.89744112,d.ZWU&psig=AFQjCNGTGkK6LveePf_uzmBlrkXpwXei-g&ust=1428059977499479


De kruik is te water gegaan...
De kruik is niet meer.

raf

hallo Dani

er is geen terug koppeling nodig dus alleen tx van de zender uit
de zender hoeft niet te weten wat de ontvanger doet

nu is het zo dat via de seriële verbinding dit signaal verstuurd word

een puls van 4MS en dan de stuur pulsen met een max van 2 ms
dus 4 + 2 + 2 + 2 + 2
bij 4 reset de ontvanger zich
de pulsen van 2 ms kunnen minimum 1 ms breed zijn of max 2 ms lang zijn met een pauze van steeds 1 ms
de ontvanger schakelt op de opgaande flank van de puls en meet dan de tijd die de puls lang is
een 4 kanaals ontvanger telt dus eigenlijk tot 5
zo kun je BV bij een 8 kanaals zender toch een 4 kanaals ontvanger gebruiken
je zend
4+2+2+2+2+2+2+2+2 voor een 8 kanaals ontvanger
en de 4 kanaals ontvanger krijgt dit binnen
4+2+2+2+2 ++++waar hij dus met de laatste 4 niks doet en gewoon wacht op de reset puls
ik zal eens kijken of ik dit signaal op een scoop kan krijgen


beeld gevonden en dat legt ongeveer uit wat ik bedoel
het kan zijn dat dit voor een meer moderne ontvanger/zender is wat ik schreef was van jaren geleden

gr raf
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

conducteur

Citaat van: dani op 02 april 2015, 13:09:54 PM
Citaat van: Gerolf op 02 april 2015, 11:14:41 AM
I2C heeft maximaal 127 adressen ;-)

Als het gewoon over twee toestellen gaat, zou ik voor RS232 gaan

127 (+ 0 voor de master = 128 ) klopt als een bus....   I stand corrected  (jer hebt maar 7 significant data bits in een I2C adres)

en het tweede klopt ook. 

Zelfs met meerdere toestellen.  de Arduino Mega heeft max 4 hardware seriële poorten  (Serial, Serial1,Serial2, serial3)
en met  "softserial" poorten nog meer.
Aanvulling: er bestaat ook een 10-bit mode dacht ik? In welke mate dat er hardware is die dat ondersteund weet ik niet....
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

patrick smout

Citaat van: dani op 02 april 2015, 13:23:47 PM
* Met 2 aderige kabel kan je geen RS 232 gebruiken, daar heb je 3 draden voor nodig.   RX-Gnd-TX
* I2C over een afstand van 75 meter is om problemen vragen


Persoonlijk zou ik over een afstand van 75 meter opteren voor een symmetrisch seriëel protocol/bedrading zoals  RS-485 .
Dan heb je 2 draden voor zenden en 2 voor ontvangen volledig gescheiden.  dus in totaal 4 draadjes , en met de nodige hardware natuurlijk.

Voor RS485 of 422 (differential transmitter/receivers) kom je theoretisch toe met 2 (getwiste) signaallijnen, echter in praktijk zal je ook de 0V van de systemen onderling moeten doorverbinden. Achterliggende reden is dat de common mode voltage van de zender/ontvangers beperkt is tot ongeveer 10V. Anders gesteld, als je niet kan garanderen dat het potentiaal verschil van de (0V van de ) ontvangers onderling niet meer dan 10V verschilt heb je kans om de zenders/ontvangers stuk te helpen. Potentiaal verschillen tussen toestellen kunnen optreden door bvb. de grote afstanden, lekstromen naar aarding, statische elektriciteit , etc).

mvg,

Patrick Smout
Met vriendelijke groeten,

Patrick Smout

Harm

Citaat van: PeterC op 01 april 2015, 19:46:13 PM
lees tenminste de datasheets alvorens

Daar zal ik niets meer over vragen, wees gerust.  ;)
Ik heb nog wel wat simpelers, maar mij zegt het niets.
Ik krijg onderaan de blz bij de proton IDE de volgende regel:

WARNING: WORD Variable "GB2DTEL" Crossing Bank boundary 0-1

wat betekent dat?

groet Harm




raf

@ harm

ik heb dit gevonden

"Problems may also arise if a word or dword variable crosses a BANK boundary. If this happens, a warning message will be displayed in the error window. Most of the time, this will not cause any problems, however, to err on the side of caution, try and ensure that word or dword type variables are fully inside a BANK. This is easily accomplished by placing a dummy byte variable before the offending word or dword type variable, or relocating the offending variable within the list of Dim statements."


dus het kan helpen om de dim statements anders te schikken en zo kan het zijn dat deze error verdwijnt
ja ik kan op het proton forum gaan kijken hé LOL

gr raf en hopelijk heb je der iets aan
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

PeterC

Citaat van: Harm op 07 april 2015, 20:56:35 PM
Citaat van: PeterC op 01 april 2015, 19:46:13 PM
lees tenminste de datasheets alvorens
...Daar zal ik niets meer over vragen, wees gerust.  ;)

::) ::) ::)  ;)

Citaat van: Harm op 07 april 2015, 20:56:35 PM
WARNING: WORD Variable "GB2DTEL" Crossing Bank boundary 0-1
wat betekent dat?

Harm, zoals Raf al zei: een dummy variabele definiëren...
MAAR de compiler is niet dom en alleen definiëren volstaat niet!
De variabele moet ook geïnitialiseerd en gebruikt worden (niet geïnitialiseerde - of eenvoudiger gezegd: gedefiniëerde variabelen
die niet effectief worden gebruikt - worden door een slimme compiler genegeerd).

Dus (in pseudo-basic):


Dim dummy as byte       'definitie
Dummy = 1               'initialisatie
Dummy = Dummy + 1       'dummy bewerking om zeker te zijn dat de variabele wordt gecompileerd


Ik vermoed dat je probleem op die manier wordt opgelost.  Lukt het niet met één byte variabele, plaats er dan nog (één of meerdere) dummy variabelen bij.

Het is wel de eerste keer dat ik dit probleem bij een compiler hoor.  Dat is onder andere één van de belangrijke taken die een compiler in de gaten moet houden (variabelen optimaal in de verschillende geheugenbanken schikken).
Groetjes, Peter


raf

hoi

peter ik heb het eens voorgehad dat een variabele te groot werd om nog in 1 bank te passen
vroeger met de z80 moesten we daar bij bankswitching ook mee op passen en inderdaad dummy variabele bij maken
maar met de processoren heb ik dat probleem dus nog nooit niet voorgehad

gr raf
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

Harm

Citaat van: raf op 07 april 2015, 21:17:03 PM
If this happens
Dank Raf.
Ik heb in de lijst van 130 variabelen een PICnep als byte bijgeschreven (bit werkte niet) en in een subroutine zet ik die eerst op 0 en daarna INC PICnep.
Heb eerst nog geschoven met wat variabelen(dan staat het niet meer op alfabet) maar dan verschuift de errormelding naar een andere variabele.

Crossing bank boundary zegt me nu nog steeds niets, maar de error is weg.


PeterC

Citaat van: Harm op 09 april 2015, 15:28:30 PM
Crossing bank boundary zegt me nu nog steeds niets, maar de error is weg.

Harm,

Even een poging om dit probleem uit te leggen...  ...Maar eerst wat PIC geheugen theorie:

Ik neem als voorbeeld een 16F88 (enkele pagina's terug heb ik gezien dat je daar mee werkt).  Neem de datasheet (lap, daar gaat hij weer...) en in het hoofdstuk 'Register File Map' kan je zien dat het RAM geheugen (random-access memory) verweven zit tussen de SFR's (Special Function Registers).  SFR's die niet worden gebruikt, kunnen als RAM worden gebruikt.
In de begindagen van de PIC's was er niet veel RAM nodig en waren die SFR's ook vrij beperkt.  Nieuwe types komen, meer SFR is nodig, meer RAM wordt ook noodzakelijk...

...Nieuwe SFR's en meer RAM betekent het volledige ontwerp van de controller hertekenen...  Duur, heel duur en niet meer 'backwards compatible' met eerdere types (heel belangrijk!).

Oplossing?  Heil zoeken in een reeds oude (en haar sporen verdiende) oplossing: uitbreiding van het geheugen (en SFR's) door parallel aan de bestaande SFR's en vrij geheugen nieuwe geheugenplaatsen te creëeren.
Voordeel?  Je kan hetzelfde adresbereik blijven behouden.  Nadeel?  Eén geheugenadres kan/moet meerdere geheugenlocaties aanspreken.  In welke geheugenlocatie je bezig bent hangt af van in welke geheugenbank je op dat moment aan het werken bent.
Je geheugenpointer verwijst naar je geheugenadres, één 'Special Function Register' bepaalt in welke geheugenbank je bezig bent.  Heb je bvb een geheugenpointer die 128 plaatsen (plaats 0 tot plaats 127 = 2^7° = 128 bytes) kan aanspreken en je wil een totaal geheugen van 512 bytes (512 = 4 * 128 bytes = 2^9°).  Je hebt dan je 7 adresbits en de resterende twee adresbits ga dus 'ergens' moeten halen.  Oplossing: maak een 'Special Function Register' waar je die twee resterende adresbits in kwijt kan.  Bij een 16F88 is dit bit RP0 en RP1 (SFR -> STATUS<6> en STATUS<5>).

Totdaar de theorie. 

Wat is nu jou probleem: iedere vrije RAM plaats is slechts één byte (8 bits).  Elke keer je een byte variabele declareert (en initialiseert), wijst je compiler die toe aan een nog vrije geheugenplaats (om het even in welke geheugenbank).  Ga je een word-variabele (16 bits = 2 geheugenplaatsen) of een dword (32 bits = 4 geheugenplaatsen) creëren, gaat je compiler die voor zijn eigen gemak in opeenvolgende geheugenplaatsen zetten (opeenvolgende om nadien veel efficiënter met die groter wordende variabelen te kunnen rekenen).

Stel je hebt (zoals bij een 16F88) 128 geheugenplaatsen per bank en de eerst vrije plaats is adres 126.  Je vraagt geheugen (declareren) voor een dword (32 bits = 4 * 8 bits = 4 bytes).  Je eerste 2 bytes 'passen' nog in die bank en de andere twee moeten sowieso naar een andere bank en dan krijg je het 'Crossing bank boundary' error.

Moet je daar rekening mee houden?  Neen!  De compiler moet dat doen. Als die ziet dat je slechts 2 bytes meer over hebt op het einde van je bank en je wil er vier voor een variabele, moet hij die in een andere bank steken en die 2 resterende van de vorige bank markeren als 'vrij voor 2 bytes'.  Blijkbaar doet jou compiler dat niet (...)!

Moet je daar rekening mee houden?  Ja!  Als je net als Geert in assembler werkt en als je hersenen dienst doen als compiler.  Het grote voordeel is dan dat je alles in de hand hebt, het grote nadeel is dan dat je je datasheet binnenste buiten moet kennen en dat je iedere stap van je controller moet binnenste buiten kennen!

Ik hoop dat mijn uitleg te begrijpen valt...


Groetjes, Peter