Hantera rs232 "kommandon" i pic

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hantera rs232 "kommandon" i pic

Inlägg av Icecap »

Knappast men om du använder index-registret (INDF) blir det mycket enklare.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Hantera rs232 "kommandon" i pic

Inlägg av v-g »

Jag kör ett enkelt protokoll när jag kollar av datat på min acctank/el-övervakning. Fungerar som så att när man ska ställa in mätaren skickar man S12345678 (där 1-8 är det värdet man vill ha på elmätaren) ) om man vill att PICen ska skicka data skickar jag bara "V". Ingen felkontroll än sålänge. En eller ett par paritetsbitar är ju inget svårt att ordna heller om man så önskar.

Dvs man tar emot "starta mottagning" sen spar man värdet i en temporär variabel när sen det förväntade data ankommit så kan man enkelt beräkna pariteten eller en checksum först då detta stämmer "använder" man värdena.

Jag kör mottagning i klartext sen drar jag av 48 (eller hur det nu var :) ) och vips får man ut siffervärdet.
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: Hantera rs232 "kommandon" i pic

Inlägg av Bosen »

hmm v-g .... jag fattar inte mycket av vad du skriver.... men jag håller med att om man drar av ascii koden för tecknet 48 vid siffrorna så blir det rätt värde... men det är svårare när man skall ha ett tal som är 100...
men i detta fallet så är det 'S' och 'V' som är dina kommandon??? Har du fler kommandon?

Gör du som det sades innan att du läser av CR först innan du kollar resten av kommandot eller ligger pic:en och väntar på tecknet 'S' innan resten av avläsningen??
TotteBasicPic
Inlägg: 36
Blev medlem: 30 december 2008, 11:38:08
Ort: Halmstad

Re: Hantera rs232 "kommandon" i pic

Inlägg av TotteBasicPic »

Här är ett gammalt exempel.

http://www.tronics.se/PC_och_Comcard2_%202004-12-19.doc

Hoppas att det blir lite lättare.

H.Thomas
ie
EF Sponsor
Inlägg: 1379
Blev medlem: 23 oktober 2006, 13:12:57
Ort: Tyresö

Re: Hantera rs232 "kommandon" i pic

Inlägg av ie »

Läs in all tecken innan tills du får <CR>. Säkerställ att bufferten inte överfylls. Om första tecknet är <LF> kastar du bort det. (Det kommer tillsammans med <CR> på raden innan om ditt terminalprogram är inställt så.)

Om du tar emot <BS> (ASCII 8 ) tar du bort senast mottagna tecken (om du inte redan står på första positionen). Utan detta kommer du att svära en del när du märker att du skrivit fel.

En annan anledning att ta emot hela raden först (förutom att kunna redigera den) är om du går över till "binär" kommunikation och lägger på checksumma, så kan du inte göra något innan du kontrollerat att checksumman är korrekt.

Att ta emot ett decimaltal är inte så svårt.

Ta emot så länge det är siffror. Multiplicera tidigare resultat med 10 och lägg till senast mottagna siffra.
Nerre
Inlägg: 27257
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Hantera rs232 "kommandon" i pic

Inlägg av Nerre »

Jag skulle nog lösa det "tvådelat" så att säga.

Dels en interrupt-driven mottagningsfunktion som läser in ett tecken och sen antingen nollställer bufferten (i princip bara nollar pekaren) eller petar in tecknet i bufferten. Sen kan den också sätta en global flagga som talar om att ett helt kommando tagits emot och självklart se till att bufferten inte överfylls.

Sen kan då huvudprogrammet bara vänta på att den där flaggan sätts, då läser det av kommandot (det blir ju en hel rad med jämförelser, en del kan loopas och andra blir mer "case"-satser).
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Hantera rs232 "kommandon" i pic

Inlägg av vfr »

Precis! Det var ungefär så jag tänkte, även om det kanske inte framgick helt klart. Att inläsningen skall vara avbrottsdriven tycker jag är självklart i ett sånt här fall. Förmodligen kommer huvudprogrammet ändå att ha annat att göra under tiden.
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: Hantera rs232 "kommandon" i pic

Inlägg av Bosen »

ok... tvådelat hadde jag tänkt mig... så där é jag med....

Men jag skulle behöva ha lite exempel på Indirect File adressing
det som står i databladet om INDF förstår jag inte så bra....

Någon som har en bra länk eller lite exempelkod?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hantera rs232 "kommandon" i pic

Inlägg av sodjan »

> kan man göra en lookup table som ser ut såhär?:

En lookup table med RETLW är tänkt för fasta tabeller som ligger i programminnet (flash).
Det fungerar absolut *INTE* för den typ av buffert som du behöver !

Allokera med buffert med hjälp av RES som Icecap visade.
Ladda INDF med med adressen till bufferten och läs på...
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hantera rs232 "kommandon" i pic

Inlägg av Icecap »

FSR är en pekare som du kan sätta till att peka i RAM'en och du läser och skriver via INDF.

Tänk dig att du har en buffer från 20h-30h och du vill läsa alla byten i den ett efter ett.

Steg 1: Ladda FSR med 20h (adressen på första byte)
movlw Buffer
movwf FRS
Steg 2: Läs första byte från RAM-adressen som FSR pekar på
movf INDF, W
... Gör med det lästa värde vad som göras ska ...
Steg 3: Nästa byte
incf FSR, F
Steg 4: Kolla om FSR är högre än bufferns slutadress
... nej, den får du klura ut själv ...
Gå till steg 6 om den är klar.
Steg 5: Om den inte är högre är det alltså bara att köra på
Gå till steg 2
Steg 6: klart

Så FSR är adressen och INDF är en "låtsasbyte" i RAM'en, på det vis kan man leka med buffrar osv. Inte världens mest effektiva funktion men den fungerar.
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: Hantera rs232 "kommandon" i pic

Inlägg av Bosen »

Förklaringen är bra icecap.. men det är lite som jag inte får till:
Hur vet jag var min buffer börjar om jag allokerar med

Kod: Markera allt

buffer     RES 9
??
Steg 1: Ladda FSR med 20h (adressen på första byte)
movlw Buffer
movwf FRS

Jag misstänker att FSR är felskrivet :)
Det du har kallat buffer skall igentligen vara h'20' va? Om nu min buffert börjar på den adressen? eller kan jag bara skriva buffer om min variabel heter just buffer?
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: Hantera rs232 "kommandon" i pic

Inlägg av Bosen »

Jag har nu hunnit testa lite med FSR och INDF i MPLAB och kommit fram till att man kan peka på adressen till buffer genom att helt enkelt skriva

Kod: Markera allt

movlw    buffer
movwf    FSR
Jag fick det att funka och nu förstår jag även hur INDF och FSR fungerar! Tack än en gång för detta eminenta forum! :bravo:
Nerre
Inlägg: 27257
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Hantera rs232 "kommandon" i pic

Inlägg av Nerre »

Bosen skrev:Det du har kallat buffer skall igentligen vara h'20' va? Om nu min buffert börjar på den adressen? eller kan jag bara skriva buffer om min variabel heter just buffer?
Som du redan har listat ut så blir buffer som en "variabel" som innehåller den adress som den hamnar på. På så vis slipper man bekymra sig om vilken adress den hamnar på, det håller kompilatorn reda på åt dig och om du petar in flera variabler så kan de flyttas omkring utan problem eftersom du talat om för kompilatorn hur stor plats den ska reservera för dem och du använder deras "namn" istället för adresserna.

Så koden "buffer RES 9" betyder typ reservera 9 bytes i minnet och sätt namnet buffer till att peka på var de börjar.

buffer står ju först på raden och är därmed en LABEL för dina reserverade 9 bytes.

(Nu vet jag inte om 9:an står för bytes eller om den står för words, men principen är densamma.)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hantera rs232 "kommandon" i pic

Inlägg av sodjan »

> Hur vet jag var min buffer börjar om jag allokerar med RES
> buffer RES 9

Som andra har sagt och som du har upptäckt, så är det inget *du* behöver veta. :-)
Om du ändå är nyfiken så finns den aktuella adressen i MAP filen.
Notera att adressen naturligstvis kan vara (och ofta är) olika för varje "build"...

Se också till att du har kläm på användningen av IRP biten i STATUS. Om "buffer"
ligger i bank 2 eller 3 så ska den vara "1", annars "0". Även det går att fixa med
lite kod så att det blir automatiskt.

> (Nu vet jag inte om 9:an står för bytes eller om den står för words,...

Bytes, eftersom det är RAM (GPR) som vi reserverar från. Det finns inga "words" där.
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: Hantera rs232 "kommandon" i pic

Inlägg av Bosen »

Ska kolla lite mer på IRP
... Jag använder ju UDATA_SHR och den fyller ju antagligen upp Bank0 först sen börjar den på en annan bank... men hur vet jag om den har gått till nästa bank???
Skriv svar