Skrivning till flera portar samtidigt i Arduino UNO möjligt?
- Spisblinkaren
- EF Sponsor
- Inlägg: 12990
- Blev medlem: 13 december 2012, 21:41:43
Skrivning till flera portar samtidigt i Arduino UNO möjligt?
Hej!
Jag undrar om man kan skriva parallellt till flera portar samtidigt i Arduino UNO.
Om det är möjligt vore det trevligt med en liten syntax.
Syntaxen får gärna också innehålla hur man definierar vilka portar man vill skriva till.
MVH/Roger
Jag undrar om man kan skriva parallellt till flera portar samtidigt i Arduino UNO.
Om det är möjligt vore det trevligt med en liten syntax.
Syntaxen får gärna också innehålla hur man definierar vilka portar man vill skriva till.
MVH/Roger
Re: Skrivning till flera portar samtidigt i Arduino UNO möjl
Vad menar du i praktiken med "parallellt" och "samtidigt"?
Processorn i en Arduino UNO kan självklart bara göra en sak i taget,
men det kanske ändå är tillräckligt för just *dina* definitioner av
"parallellt" och "samtidigt"...
Processorn i en Arduino UNO kan självklart bara göra en sak i taget,
men det kanske ändå är tillräckligt för just *dina* definitioner av
"parallellt" och "samtidigt"...
Re: Skrivning till flera portar samtidigt i Arduino UNO möjl
Pilla på direkt på processorns register: https://www.arduino.cc/en/Reference/PortManipulation är det vad jag kan komma på. Mindre än en till två instruktioners fördröjning mellan skrivningar till olika portar är nog svårt att undvika. Annars får du väl ha nåt externt latchat shiftregister.
-
- Inlägg: 7812
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: Skrivning till flera portar samtidigt i Arduino UNO möjl
Om man bara skall svara på frågan så blir svaret rätt och slätt nej.rogerk8 skrev:Hej!
Jag undrar om man kan skriva parallellt till flera portar samtidigt i Arduino UNO.
Om det är möjligt vore det trevligt med en liten syntax.
Syntaxen får gärna också innehålla hur man definierar vilka portar man vill skriva till.
MVH/Roger
mankan föreslår en lösning om du vill ställa om fler än 8 bitar samtidigt.
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
- Spisblinkaren
- EF Sponsor
- Inlägg: 12990
- Blev medlem: 13 december 2012, 21:41:43
Re: Skrivning till flera portar samtidigt i Arduino UNO möjl
Hej mankan!mankan skrev:Pilla på direkt på processorns register: https://www.arduino.cc/en/Reference/PortManipulation är det vad jag kan komma på. Mindre än en till två instruktioners fördröjning mellan skrivningar till olika portar är nog svårt att undvika. Annars får du väl ha nåt externt latchat shiftregister.
Tack för ditt förslag.
Fast detta bekräftar vad jag redan har befarat dvs att portar i praktiken skrivs sekvensiellt.
Eftersom jag försöker skapa en sinus-generator mha UNO och R2R-stege så kan ju inte några övergångstillstånd finnas innan själva R2R-stegen (för då genereras spöksignaler) dvs alla bitar måste sättas samtidigt och därmed parallellt.
Jag har misstänkt problemet så jag har implementerat en HC375 (Octal D-F/F) som parallellt register och som bara uppdateras en gång per 8-bitars sekvensiell sättning av portar.
I praktiken får man då en 9 LSB längre total tid för genereringen vilket i fallet 60kHz a' 10steg blir en LSB-hastighet (om man får säga så) om 60k*10*9=5,4MHz vilket är alldeles för nära systemklockan för UNO (16MHz) som jag dessutom har uppfattat troligtvis är nedskalad (prescale) minst en faktor två vilket ger en faktisk systemklocka (E-klocka, "LSB") på 8MHz.
På det här ska systemet sen sampla ("samtidigt") där varje A/D-omvandling (successiva approximationer) tar 13 LSB samtidigt som 60kHz önskas ha 10 sampel dvs samplingen måste ske med 60kHz*10*13=7,8 MHz.
Slutsatsen måste bli att UNO inte klarar detta, den är helt enkelt för långsam.
Speciellt långsam blir den om man betänker all overhead som ska med, jag är dock osäker på vad detta egentligen betyder men klart är att alla klockcykler inte kan nyttjas, det måste finnas rum för ett visst antal administrativa klockcykler också.
MVH/Roger
PS
Nyquist-teoremet säger ju att man måste sampla med minst dubbla frekvensinnehållet så kanske man kan dra ner på samplingskravet och bara lägga ett relativt brant analogt filter på ingången. Problemet med sinus-genereringen kvarstår dock.
- Spisblinkaren
- EF Sponsor
- Inlägg: 12990
- Blev medlem: 13 december 2012, 21:41:43
Re: Skrivning till flera portar samtidigt i Arduino UNO möjl
Är du full, eller?lillahuset skrev:Arduino är ett gift.
MVH/Roger
- Spisblinkaren
- EF Sponsor
- Inlägg: 12990
- Blev medlem: 13 december 2012, 21:41:43
Re: Skrivning till flera portar samtidigt i Arduino UNO möjl
Jag tackar för detta!Zkronk skrev:Här står det hur man gör: https://www.arduino.cc/en/Reference/PortManipulation
MVH/Roger
-
- Inlägg: 1397
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Skrivning till flera portar samtidigt i Arduino UNO möjl
Skilj på portar och pinnar. Du KAN skriva till alla pinnar på en port samtidigt. Du kan INTE skriva till flera portar samtidigt. Sen är det upp till dig att välja åtta utgångar som sitter på samma port.
- Spisblinkaren
- EF Sponsor
- Inlägg: 12990
- Blev medlem: 13 december 2012, 21:41:43
Re: Skrivning till flera portar samtidigt i Arduino UNO möjl
Hej sodjan!sodjan skrev:Vad menar du i praktiken med "parallellt" och "samtidigt"?
Processorn i en Arduino UNO kan självklart bara göra en sak i taget,
men det kanske ändå är tillräckligt för just *dina* definitioner av
"parallellt" och "samtidigt"...
När ett digitalt värde skapas av typ en räknare i en CPU så finns alla de parallella bitarna på räknarens utgång samtidigt, eller hur?
Varför är det då så svårt att bara parallell-latcha in dom bitarna i ett gäng portar?
Ser inte att sekvensiell skrivning (som är mer intuitiv ty Von Neumann-maskin oftast) som en nödvändighet i det fallet.
MVH/Roger
- Spisblinkaren
- EF Sponsor
- Inlägg: 12990
- Blev medlem: 13 december 2012, 21:41:43
Re: Skrivning till flera portar samtidigt i Arduino UNO möjl
Nu ska vi ta och fundera lite...Mr Andersson skrev:Skilj på portar och pinnar. Du KAN skriva till alla pinnar på en port samtidigt. Du kan INTE skriva till flera portar samtidigt. Sen är det upp till dig att välja åtta utgångar som sitter på samma port.
Intressant uttalande, känner lite till den där distinktionen ändå fast då i helt andra applikationer (CPLD).
Om jag nu få vara riktigt lat:
Om jag vill skriva till följande pinnar på min UNO, tillhör dom samma port?
IO9, IO8, IO7, IO6, IO5, IO4, IO1, IO0
MVH/Roger
PS
IO3 och IO2 har jag reserverat för "de" innehåller "interrupt-on-change" vilket känns bra ur tryckknapp-avseende.
- Spisblinkaren
- EF Sponsor
- Inlägg: 12990
- Blev medlem: 13 december 2012, 21:41:43
Re: Skrivning till flera portar samtidigt i Arduino UNO möjl
Hej SeniorLemuren!SeniorLemuren skrev: Om man bara skall svara på frågan så blir svaret rätt och slätt nej.
mankan föreslår en lösning om du vill ställa om fler än 8 bitar samtidigt.
Nej, jag behöver inte ställa om fler än 8 bitar samtidigt, jag behöver ställa om exakt 8 bitar samtidigt.
Hoppas du inte tycker jag är en språkpolis nu
MVH/Roger
PS
Fast det skiter sig ändå, jag har för små marginaler både med sinus-genereringen och samplingen och jag har gett mig fan på att jag vill kunna generera och sampla 6Hz-60kHz med bra upplösning. Anledningen är att om man t.ex sveper en förstärkare inom det hörbara frekvensområdet så blir det oftast bara ett rakt streck map amplituden, det intressanta händer egentligen utanför det hörbara frekvensområdet. Om jag får drömma lite hade 1Hz till 1MHz varit än mer önskvärt.
Senast redigerad av Spisblinkaren 25 november 2016, 20:48:29, redigerad totalt 1 gång.
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Skrivning till flera portar samtidigt i Arduino UNO möjl
Spik nykter.rogerk8 skrev:Är du full, eller?lillahuset skrev:Arduino är ett gift.
MVH/Roger
Re: Skrivning till flera portar samtidigt i Arduino UNO möjl
I en microprocessor som exempelvis AVR, PIC etc, dvs de typer som kan förekomma på en Arduino, samt alla andra typer av normala processorer så är en PORT en samling av (Databitar) dvs normalt fysiska IO-pinnar, kan vara 1 bit upp till 16 som PMP-porten på vissa PICar.
Detta för att förenkla hanteringen av processorns IO-pinnar.
Du kan INTE skriva till mer än en port i taget, däremot kan du skriva till enskilda pinnar eller till alla inom en port.
Orsaken är naturligtvis bredden på databussen, samt att man helt enkelt bestämt sig för att inte kunna skriva till mer än en port samtidigt.
Dessutom ligger ofta portarna utspridda i kislet på olika icke närliggande adresser.
Detta för att förenkla hanteringen av processorns IO-pinnar.
Du kan INTE skriva till mer än en port i taget, däremot kan du skriva till enskilda pinnar eller till alla inom en port.
Det får du studera i manualen, huruvida dessa tillhör en och samma port eller är utspridda på flera portar.Om jag vill skriva till följande pinnar på min UNO, tillhör dom samma port?
IO9, IO8, IO7, IO6, IO5, IO4, IO1, IO0
Orsaken är naturligtvis bredden på databussen, samt att man helt enkelt bestämt sig för att inte kunna skriva till mer än en port samtidigt.
Dessutom ligger ofta portarna utspridda i kislet på olika icke närliggande adresser.