Arduino PortManipulation Hoe werkt het ?

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • D deere
  • Registratie: September 2010
  • Laatst online: 20-05-2024
Hallo medetweakers,

Voor mijn project van school moeten we een Digital-Analog-Converter maken. Met deze DAC moeten we 2 verschillende signalen maken, een 'huis' vormig signaal en een gewone 'sinus' signaal. Dit is allemaal prima gelukt, maar nu moeten we nog tussen deze 2 signalen kunnen switchen. Ik heb dus nu 2 aparte codes met een van het huis en een van de sinus. Hierin gebruiken we ook al portmanipulation. Ik weet wel hoe dat werkt. We hebben al onze bits ( 0 tot 256 ) uitgerekend en de arduino maakt daar een binaire code van. Die binaire code staat dan weer voor de poorten die aan (1) of uit (0) staan.
Maar om weer verder te gaan naar de switch werken we dus in deze codes met microsecondes, dus kunnen we helaas niet switchen met 'digitalRead', want dat is te langzaam. Hiervoor moeten we dus Portmanipulation gebruiken, echter krijg ik het niet voor elkaar ( ben er nog geen ster in :P ). Om onze DAC aan te sturen gebruiken we digital pins 0 tot 7 al , dus wou ik graag switchen op een van de poorten van 8 tot 13.

informatie:

B (digital pin 8 to 13)
C (analog input pins)
D (digital pins 0 to 7)

PORTD maps to Arduino digital pins 0 to 7

DDRD - The Port D Data Direction Register - read/write
PORTD - The Port D Data Register - read/write
PIND - The Port D Input Pins Register - read only

PORTB maps to Arduino digital pins 8 to 13 The two high bits (6 & 7) map to the crystal pins and are not usable

DDRB - The Port B Data Direction Register - read/write
PORTB - The Port B Data Register - read/write
PINB - The Port B Input Pins Register - read only

PORTC maps to Arduino analog pins 0 to 5. Pins 6 & 7 are only accessible on the Arduino Mini

DDRC - The Port C Data Direction Register - read/write
PORTC - The Port C Data Register - read/write
PINC - The Port C Input Pins Register - read only

https://www.arduino.cc/en/Reference/PortManipulation <-- site


Ik heb geprobeerd om een kleine code te maken, waar die met portmanipulation switched. zie hier onder
Ik dacht dus; eerst moet ik poorten 9 en 10 ( waar ik op switch ) aangeven dat het het inputs zijn en daarna kan ik daar een if statement van maken. Als 9 hoog is, doe dan dit. Maar dit werkt dus niet.

void setup() {
// put your setup code here, to run once:
DDRB = B00000000; // sets all pins to inputs
}

void loop() {
if (PINB == B00000100) { //9
digitalWrite(2, HIGH);
}


if (PINB == B00001000) { //10
digitalWrite(3, HIGH);
}
}

De code klopt dus niet, dat weet ik, maar dan hebben jullie een beetje een ideetje hoe het moet zijn.
Ohja waar die digitalWrite staat, moet dus die code van het huis signaal en de sinus signaal staan.
Ik hoop dat jullie me kunnen helpen met dit en mij het portmanipulation wat beter kunnen uitleggen.

Alvast bedankt !

met vriendelijke groeten,

Dennis,

A man who doesn't know to stop his electronics madness

Alle reacties


Acties:
  • 0 Henk 'm!

Anoniem: 159174

Op het eerste gezicht, je leest de waardes van 8 input pins tegelijk. Hoe weet je dat die andere 0 zijn, en niet 1?
Los daarvan: waarom twee inputs, is toch of de een, of de ander?

Acties:
  • 0 Henk 'm!

  • D deere
  • Registratie: September 2010
  • Laatst online: 20-05-2024
Jaa dat is goede, ik kan de andere wel op GND lijn zetten, dan weet ik zeker dat ze 0 zijn.
En het mag inderdaad ook met 1 input, dan moet ik if...else... gebruiken. Maar vond het wel leuk om een 3 standen schakelaar te gebruiken, als dat kan. Een met niks en de andere 2 met de signalen

A man who doesn't know to stop his electronics madness


Acties:
  • +1 Henk 'm!

Anoniem: 159174

Misschien eens kijken naar een bitwise and? Anders heb je weer een probleem als een andere input moet worden gebruikt... En bij de drieweg, zorg voor een pull down weerstand?

[ Voor 60% gewijzigd door Anoniem: 159174 op 04-02-2018 13:12 ]


Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
Je zal inderdaad de ongebruikte bits moeten maskeren. Maar als debug optie, schrijf gewoon naar je seriele poort wat hij inleest, en dan kan je waarschijnlijk zien waarom het niet goed gaat.

Acties:
  • 0 Henk 'm!

  • D deere
  • Registratie: September 2010
  • Laatst online: 20-05-2024
Ik heb nu van de poorten 8 tot 13 allemaal op de GND gezet, op nummer 9 na dan, die staat op de 5V. Ik heb alles ook op de serial monitor en alles klopt, nummer 9 is hoog.
Nu zit ik nog met een ding. Als ik dus zeg van PINB (B is voor digital pins 8 tot 13) == moet het dan 00000010 of 000010 zijn, want ik heb in een voorbeeld gezien dat ze bij D ( digital pins 0 tot 7 ) "acht" 0'en of 1'en gebruiken, dit komt ook omdat het 8 poorten zijn, maar geld dat ook voor pins 8 tot 13, want dat zijn er maar 6. Daarnaast zou het wel kunnen met 8 cijfers want er is ook een "poort" 14 (AREF ) en 15 ( staat niks bij ), deze poorten heb ik ook op de GND.

dus moet het if( PINB == 00000010 ) of if( PINB == 000010 ) zijn.

A man who doesn't know to stop his electronics madness


Acties:
  • 0 Henk 'm!

  • D deere
  • Registratie: September 2010
  • Laatst online: 20-05-2024
Ik heb de code werkend gekregen, het was dus:

if (PINB == B000010) {
...........
}

met alle andere inputs aan de GND

Iedereen bedankt voor tips !!

Dennis,

A man who doesn't know to stop his electronics madness


Acties:
  • +2 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 28-05 16:11
Als je van een bepaalde ingang de status wilt hebben (1 bit), en je hebt de status van de hele poort (1 byte op dit platform) moet je op een of andere manier die specifieke pin weten te filteren.

Dat doe je door er een AND masker toe te passen, waarbij je alleen de ingangen die je wilt weten 1 maakt.
Stel je wilt ingang 4 weten:

code:
1
2
3
uint8_t port = 0b00111000;
uint8_t mask = 0b00010000; // ( 1 << 4 ) of _BV( 4 ) in het Atmel universum
bool pin = port & mask;


Hoe de ingangen/pinnen van de Arduino gemapt zijn op de ingangen/poorten van de microcontroller zal in de documentatie van de betreffende Arduino te vinden moeten zijn. Ook de datasheet van de controller zelf mag niet ontbreken als je wilt snappen hoe het allemaal in elkaar zit.

[ Voor 20% gewijzigd door farlane op 04-02-2018 23:42 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Zou toch grappig zijn als je altijd van die 8 pinnetjes er maar 1 kan gebruiken :D

Acties:
  • 0 Henk 'm!

  • jeroen3
  • Registratie: Mei 2010
  • Laatst online: 15:56
D deere schreef op zondag 4 februari 2018 @ 23:07:
Ik heb de code werkend gekregen, het was dus:

if (PINB == B000010) {
...........
}
Je moet gewoon even de C operators kennen. Dan kun je het volgende maken.
C: Één bit controleren
1
if( PINB & (1<<bitnummer) )

C: Één bit aan zetten
1
PORTB |= (1<<bitnummer);

C: Één bit uit zetten
1
PORTB &= ~(1<<bitnummer);

C: Één bit toggle
1
PORTB ^= (1<<bitnummer);

Er zijn nog wel meer geintjes. Het kan ook andersom.
Let erop dat (1<<bitnummer) met een literal door de compiler kan worden vervangen voor een nummer. De bitshift is dan weggelaten, dus de extra << notatie kost je niets.
Pagina: 1