Kommunikation mellan olika processorer - Hur gör ni?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av Al_Bundy »

Så då använder du interrupt och lägger den "färdiga" byten i någon buffer då?
Nja, snarare i en variabel om det är så du menar.

Här fattar jag inte ett skvatt. Vad menar du med "Master -> slave -> master -> slave -> dator: 255 eller högre."?
IceCap sa något att man måste skicka '\r' och det gör inte jag. Så när jag skickar 22 så gör jag det för många gånger och då blir det kanske över 255. Osäker.
Jag menar att du skall skicka ett hårdkodat värde från slaven direkt till dator "Slave->dator termial". T.ex 65 vilket då borde bli tecknet "A" på terminalen om du skickar binärt eller tecknen "65" om du sickar ASCII.
Om jag skickar från slaven till min dator, t.ex 65 så läser den som 65 via Serial.print(65) som omvandlar ASCII 'A' till 65. Så, ja det är i sin ordning. Men skickar jag talet 65 från slaven till min master så måste jag kanske skicka '\r' där efter. Eller?
Dessutom fattar jag inte varför du säger 255 eller högre är rätt, när du sedan säger att du skickar talet 22 eller 1. Högre än 255 innebär ju att talet du skickar är större än 1 byte. Tar du hänsyn till det i mottagaränden?
Mottagaren kan inte ta emot högre än 1 byte. Bufferten på min ATmega är på 64 bytes så det kan hända att det lagras.
Jag måste kolla lite mer på det där.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av sodjan »

> Beträffande TX sidan,
> Slå på interrupt för "Plats i TX-buffer/reg"

Tomas, eftersom TS kör programvaru-USART (vilket inte framgick
från början i och för sig, men TS förstainlägg brukar ju inte vara så
tydliga eller kompletta), så finns det ingen interrupt hantering.

> Det finns en interrupt som talar om att det finns en byte redo.

Om du tror det så har du problem.

> Så då använder du interrupt...

Nej, det gör TS inte. SoftwareSerial är pollad.

Märkligt att det alltid måste bli så förbannat förvirrat! :-)
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av Kaggen »

>Ja, då blir det rätt.
>Master -> slave -> master -> slave -> dator: 255 eller högre.

>Fast jag skickar bara ett tal t.ex 10 och sedan gör jag inget mer.

Får inte ovanstående att gå ihop. Ena gången säger du att när det funkar så får du 255 eller högre och i nästa inlägg säger du att du skickar 10.

serial.write() sänder data binärt. Kör du mySerial.write(65) mot terminal så bör du se ett "A" på skärmen.

serial.read() läser första byten av inkommande data. Skickar du fler byte så får du göra flera read().

Det är ju upp till dig om du skickar en speciell kod för att markera att det är slut på bytes. Skall ju dock inte behövas om du enbart skickar en byte. Då skall ju varje byte vara valid.

Förstår inte hur något så simpelt kan gå fel.
Användarvisningsbild
SeniorLemuren
Inlägg: 8426
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av SeniorLemuren »

Jag orkar inte läsa igenom alla tokigheter, men alla inlägg verkar handla om ev, kodningsfel. Jag kan inte ett smack om Arduion men man kan läsa följande i databladet;

Each pin can provide or receive a maximum of 40 mA and has an internal pull-up resistor (disconnected by default)

Så min fråga är. har du slagit på internal pull-up på de portar du använder för sändning, som ju är avslagen som default? Annars kan det bli hur som helst.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av Al_Bundy »

Kaggen skrev: Får inte ovanstående att gå ihop. Ena gången säger du att när det funkar så får du 255 eller högre och i nästa inlägg säger du att du skickar 10.
Jag testar olika värden. Problemet är att jag alltid får nära 255 när jag skickar tal mellan 1 till 22.
serial.write() sänder data binärt. Kör du mySerial.write(65) mot terminal så bör du se ett "A" på skärmen.
Ja. Jag ser A om jag inte gör om det till decimal :)
serial.read() läser första byten av inkommande data. Skickar du fler byte så får du göra flera read().
Så jag behöver inte avsluta med något '\r'?

Sodjan skrev:Nej, det gör TS inte. SoftwareSerial är pollad.
Vad är pollad?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av sodjan »

Motsatsen till interrupt, i princip...

http://en.wikipedia.org/wiki/Polling_%2 ... science%29
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av Al_Bundy »

Angående interuppts, visst kan man först skicka LYSSNA från master till slaven. Sedan en whileloop som innehåller en if-sats "Lyssnar den? JA eller nej". Är det JA, så skicka värdet då via serial.print(), inte write.

På slaven så läser den hela tiden av om någon kommer. Tänk typ en while loop med en if-sats "Kommer det något? JA eller nej." Om det kommer något, läs av det.

Jag märkte att SoftwareSerial har något som heter isListning(), listning() och println(). Ska testa köra med det.
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av Icecap »

Al: Lite saker:
* Jag skrev att man kan, inte ska. Lär dig gärna skillnaden, t.o.m. jag som är utlänning känner till skillnaden. Fördelen med att avsluta ett block med ett tecken som inte ingår i dataströmmen är att µC'n kan reagerar på detta, det betyder ju <detta är det sista på detta block>.

* Testa att googla "polling". Detta ger runt 50.700.000 träffar.

Dagens tips: lär dig förstå hur värden sparas i datorer. Förstå bits, bytes, words osv. Det kommer att betyda en hel del studier för dig men med en hel del tur kan du nog komma i mål.

I vanlig ordning blandar du ihop allting i en enda röra, detta kombinerat med att du inte fattar vad du gör kommer ganska säkert inte att ge användbara resultat.

Jag har sedan länge fattat att du har seriösa problem med att systematisera men du behöver att göra det, nu eller senare. "Senare" betyder i detta fall (och många andra) att det tar än längre tid innan du kan göra fungerade applikationer - så varför inte bara börja direkt?

Frågor som du ska ta reda på:
* Hur skickar du en sträng/flera bytes på det vis du gör?
* Hur tar du emot en sträng/flera bytes på det vis du gör?

Gör en testcase, kolla att allt blir som du har tänkt(eller... nåja...), testa att det fungerar i verkligheten.
När du kommer så långt kan du använda det i projektet.

EDIT: Interrupt verkar du behöva läsa på om också! Du har helt klart inte någon aning om vad det är och det är på höga tid att du kollar upp det också.

Och jag vet att du idiotförklarar mig varje gång jag inte stryker dig med håren men det kan jag lätt ta när det kommer från dig. Jag är inte PK, inte heller pedagog - men jag kan µC, jag vet vad jag gör (oftast) och om du hade förmågan att läsa och förstå ville du ha kommit mycket längre än där du är nu.

Jag har många gångar lovat mig själv att du är för dum att förstå något så du inte är värd att spilla tid på, ändå försöker jag gång efter gång.
Och det är väl definitionen på idioti: Att göra samma sak gång efter gång och förvänta sig ett annorlunda resultat.

Så jag må väl vara idiot när jag försöker hjälpa dig.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av sodjan »

> Nej, det gör TS inte. SoftwareSerial är pollad.

Om man ska utveckla det lite så verkar det som att SoftwareSerial
*internt* använder interrupt-on-change på den pinne som man har
konfigurerat som RX. Men man har inget interrupt som går upp till
applikationsnivån (den egna koden), där får man anropa ("polla")
available() regelbundet för att se om det har kommit något.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av Al_Bundy »

"Och jag vet att du idiotförklarar mig varje gång jag inte stryker dig med håren men"

Nej, det gör jag inte.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av Al_Bundy »

sodjan skrev:> Nej, det gör TS inte. SoftwareSerial är pollad.

Om man ska utveckla det lite så verkar det som att SoftwareSerial
*internt* använder interrupt-on-change på den pinne som man har
konfigurerat som RX. Men man har inget interrupt som går upp till
applikationsnivån (den egna koden), där får man anropa ("polla")
available() regelbundet för att se om det har kommit något.
Okej. Så available() är typ ett avbryt för att kolla om någon post finns. Jo, det känner jag till.
Jag kollar nu i slaven och jag får väldigt mycket overflow direkt när jag börjar sända. Ja, den läser av. Jag vet inte varför den får overflow vid första försöket efter uppstart.
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av Icecap »

Overflow betyder att när du tömmer av en byte har det kommit två eller mer.
Du kollar alltså för sällan om det finns bytes att hämta.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av Al_Bundy »

Lite ironi det där att jag kollar för sällan.

Jag har en loop som gör endast en sak, nämligen kolla om det finns något. :)

Jag fick inte riktigt svar på denna fråga:
Om jag skickar ett värde från master till slave. Hur stor sannolikhet är det att värdet kommer "pricka rätt", dvs komma till slavens buffert för att senare bli läst?

Brukar det inte vara vanligt att än fast man har skickat, så finns det inget i bufferten?

Om jag har en liten delay efter jag har skickat från mastern så kan jag se att slaven tar emot alla värden fint och sakta (ca 5 sekunders intervall bara). Men däremot från slaven till master blir det nog fel som vanligt.
Senast redigerad av Al_Bundy 22 februari 2015, 15:57:40, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av Icecap »

Något jag lärde mig för ett tag sedan är att när man initierar en portpinne som UART börjar man oftast med att ha portpinne på '0'.

Detta betyder att fram till man skickar första byte är nivån '0' - medan en seriell port har '1' i viloläge.

Så när jag initierar en seriell utgång sätter jag den till '1' som ett led i initieringsprocessen, detta har låtit mig släppa många problem som jag hade innan.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Kommunikation mellan olika processorer - Hur gör ni?

Inlägg av sodjan »

> Så available() är typ ett avbryt för att kolla om någon post finns.

Nej, det är inget "avbryt", i alla fall ifall du menar avbrott/interrupt.
Det är bara en funktion som kollar om bufferten innehåller 1 tecken eller mer).

> och jag får väldigt mycket overflow...

Alltså via funktionen overflow() i SoftwareSerial?
Ja, det betyder bara att bufferten är full och att tecken kastas bort.
Tveksamt om det finns tillräckligt i tråden för att svara på varför.
Skriv svar