In een elektuur uitgave van januari 1999 staat er een ontwerp van een programmeerbaar huisalarm met een PIC16C84.
Er wordt hierbij gebruik gemaakt van hyperterminal om bepaalde instellingen in F-registers te gaan vastleggen via de PC.
De PIC stuurt meldingen naar de PC waar de gebruiker op moet antwoorden met een waarde of met een bevestiging (Y/N).
Voorbeeld:
Sirene-on time in seconds is (001...254 [3 digits!]):
180
Modify? Y/N <ENTER>
Weet iemand hoe dit stukje kommunikatie in de PIC moet geprogrammeerd worden?
[Bericht gewijzigd door Luk op ]
Erik
In order to succeed you must fail, so that you know what not to do the next time.
Heeft er iemand ervaring of voorbeelden waarbij RS232 en PIC gebruikt worden?
vb. data versturen naar ander controllersysteem over RS232
Hoe moet ik hieraan beginnen?
Moet ik zelf een protocol schrijven?
Kan iemand mij zeggen hoe?
de eenvoudigste manier om te communiceren tussen 2 systemen gebeurt met 3 draden die doorverbonden moeten worden.
RX en TX lijnen moeten gekruist worden omdat je iets zendt via de TX pin je kan ontvangen via RX pin
TX = transmit
RX = receive
Via een max232 ic wordt ttl-niveau(0V en 5V) dat afkomstig is van pic omgezet naar RS232 niveau(-12V en +12V) dat afkomstig is van de pc.
pc <-> pic
-------------------
RX - MAX232 - TX
TX - MAX232 - RX
GND - GND
pic <-> pic , pc <-> pc
-------------------
RX - TX
TX - RX
GND - GND
Om te communiceren gebruik je best een protocol, waarbij je de lengte enz. meegeeft, kwestie om een beetje foutdetectie in te bouwen.
Een veel gebruikt protocol is als volgt
1) startbyte
2) lengte upper byte
3) lengte lower byte
4) startbyte
5) databyte(s)
6) controlesom
7) stopbyte
Heb je zo geen voorbeeld in sourcecode voor een PIC?
Een simpel voorbeeldje van RS232 overdracht zou mij al een heel eind verder helpen (vb doorsturen en inlezen van een tekstje tussen 2 PIC's).
Gebruik ik hiervoor 2 willekeurige IO poorten? Hoe bekom ik een vaste baudrate van vb. 9600?
om te kunnen communiceren tussen 2 pic's heb je microcontrollers nodig die een seriele poort of uart bevatten.
de rx(pic1) aan tx(pic2) en tx(pic2) aan rx(pic1)
baudrate, aantal databits, pariteitsbit,.... moet je instellen door middel van registers. Al deze info is te vinden in de datasheet van de gebruikte microcontroller.
Bij het zenden en ontvangen wordt gebruik gemaakt van 2 bits die ook ergens in de registers zitten.
1) bij het versturen van data wordt gebruikt gemaakt van een transmit data empty bit . Via deze bit kun je controleren of verstuurde karakter verzonden is, zodat je een nieuw karakter kan verzenden.
2) bij het ontvangen kan je gebruik maken van een receive data full. Via deze bit kan je controleren of je een karakter ontvangen hebt. Via deze bit kan je controleren wanneer een karakter volledig binnengelezen is.
Je kunt 2 werkwijzen gebruiken
1) zonder interrupt:
via een lus de voorgaande 2 bits constant controleren =
gemakkelijkste manier
nadeel: je kunt niks anders doen
2) met interrupt:
bij ontvangen/zenden kan je interrupt genereren die dan een stuk code uitvoert. Het voordeel hiervan is dat je nog iets anders kan doen.
Vb. zenden/ontvangen + een looplichtje
in datasheet staan er stukjes codes die je op weg zouden moeten helpen.
In een artikel van elektuur doen ze kommunikatie met een PC via RS232 gebruikmakend van een PIC16C84. De kommunikatie blijkt daar over 2 IO poorten te lopen, nl RX = RB3 , TX = RA2. Een 16C84 controller heeft geen uart of seriële poort. Heb jij daar ervaring mee om op deze manier te kommuniceren. De betreffende schakeling heb ik bovenaan beschreven (elektuur 423 januari 1999)
Op 6 juli 2002 12:09:42 schreef Luk:
In een artikel van elektuur doen ze kommunikatie met een PC via RS232 gebruikmakend van een PIC16C84. De kommunikatie blijkt daar over 2 IO poorten te lopen, nl RX = RB3 , TX = RA2. Een 16C84 controller heeft geen uart of seriële poort. Heb jij daar ervaring mee om op deze manier te kommuniceren. De betreffende schakeling heb ik bovenaan beschreven (elektuur 423 januari 1999)
Hallo, ik heb een beetje hetzelfde probleem tegengekomen. Ik gebruik een pic16f84a, en die heeft ook geen uart. Na wat programeren, ben ik erin geslaagd om data te verzenden naar mijn PC via de serieele poort. Tot zover het deel dat goed kwam. Als ik hier nog mee kan helpen: een vrij goeie link (voor assembler code toch):
http://www.ubasics.com/adam/pic/picprog.html
in het deel ascii messages vind je al het nodige.
Mijn probleem is echter het volgdende:
Als ik data van mijn pc (via hyper terminal) naar mijn seriele poort stuur, zou ik die data willen binnen lezen in de 16f84a. Dit blijkt echter niet te lukken... De serieele data biedt ik aan op pin RB0 van de controller, wat een interrupt pin is. Dus als de lijn wijzigt, (startbit) kom ik terecht in een interrupt routine. Dan begint de controller de data in te lezen. Ik ben er zeker van dat de controller effectief data inleest, maar nooit juiste data. Het sample ogenblik is volgens mij in orde, er moet iets zijn met het inlezen en wegschreven van de bitwaarde op pin RB0 op dat moment. Elke goede aanwijzing is welkom!
k.p.meinesz
Een schizofreen is nooit alleen!
Ik heb hier ff 2 bestandjes voor je neergezet
http://members.home.nl/kpmeinesz/
zijn niet voor pic 16f maar voor de 12c
maar kunnen je een voorbeeld geven hoe het te doen
heb ze ergens van het www maar weet niet meer waar
Mercie!! 'k heb er is naar gekeken en denk wel dat het nuttig kan zijn. Mits wat aanpassingen is da idd wel in een 16f84a te programeren.
Het is wel een andere aanpak als ik van plan was. Mijn opzet was de carry-bit de juiste waarde te geven, en dan "rotate right through carry" in een register uit te voeren. Waarschijnlijk liep daar wel iets mis... Het zal alvast een reden hebben dat elke bit appart aangepast wordt eh
Ik zal het eens proberen!
k.p.meinesz
Een schizofreen is nooit alleen!
Ik zal eens kijken of ik die site voor je kan vinden
staat ook een uitleg over start bit detectie
ik heb er weer een code aan toegevoegt CODE.zip
is een rs232 voor PIC16F84 @ 4mhz
[Bericht gewijzigd door k.p.meinesz op ]
Dank voor de moeite, maar die code.zip lijkt me op het eerste zicht wel vrij ingewikkeld. Zal er wel is deftig naar kijken, ipv nu zo in de rapte.
Maar eigenlijk is er geen probleem meer hoor. Het werkt nu helemaal zoals het hoort
Met dat vorige bestandje (serialstepper.asm) heb ik veel kunnen doen, en het blijft relatief envoudig zo eh. Die startbit detectie doe ik gewoon op RB0, externe interrupt pin. Als je die pin op dalende flank laat activeren krijg je een interrupt. Dat werkt wel naar behoren, dus alles ok nu (normaal stijgende flank, maar met ne max232...)