Portar på AVR

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Nisse
Inlägg: 908
Blev medlem: 9 juli 2006, 23:25:46
Ort: Kumla

Portar på AVR

Inlägg av Nisse »

Har en liten frågeställning mest för att kolla att jag tänker rätt.
Scenariot är följande:
Har en pinne på en port som skall användas för dubbelriktad seriell kommunikation.
När AVR:en sänder data så skall den för 1:a sätta pinnen i tristate och låta en pull-up dra upp signalen. För 0:a så skall pinnen sänka ström som utgång.

Min tanke är då att jag sätter pinnen till 0 en gång i början på programmet:
CBI PORTD, PORTD7
Sedan så modifierar jag bara rätt bit i DDRD för att ändra mellan 1 och 0 närhelst det behövs i programmet.
CBI DDRD, PORTD7 = nolla
SBI DDRD, PORTD7 = etta

Detta skall väl inte påverkas att programmet då och då använder porten som ingång genom att läsa av PIND? Bit 7 i PORTD fortsätter väl vara nolla?

Mvh
Nisse
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Ha detta i åtanke då du designar mjukvaran:
Saxat från datablad:

Kod: Markera allt

When switching between tri-state ({DDxn, PORTxn} = 0b00) and output high ({DDxn,
PORTxn} = 0b11), an intermediate state with either pull-up enabled ({DDxn, PORTxn} =
0b01) or output low ({DDxn, PORTxn} = 0b10) must occur. Normally, the pull-up
enabled state is fully acceptable, as a high-impedant environment will not notice the difference
between a strong high driver and a pull-up. If this is not the case, the PUD bit in
the SFIOR Register can be written to one to disable all pull-ups in all ports.

Switching between input with pull-up and output low generates the same problem. The
user must use either the tri-state ({DDxn, PORTxn} = 0b00) or the output high state
({DDxn, PORTxn} = 0b11) as an intermediate step.
Användarvisningsbild
Nisse
Inlägg: 908
Blev medlem: 9 juli 2006, 23:25:46
Ort: Kumla

Inlägg av Nisse »

Hmm, få se nu.....

Jag kommer aldrig växla mellan tri-state och output high. De gånger pinnen används som utgång så ska den sänka signalen.

Därimot så stöter jag på det andra fallet, växlar mellan input with pull-up och output low. Där skall jag alltså se till att först gå till Tri-State.

Tack för detta Karlstedt. Hade inte sett detta i databladet. Ska genast titta närmare i mjukvaran.

Men i övrigt så tänker jag rätt i mitt första inlägg?

Mvh
Nisse
Användarvisningsbild
Nisse
Inlägg: 908
Blev medlem: 9 juli 2006, 23:25:46
Ort: Kumla

Inlägg av Nisse »

Glömde nämna att den pull-up jag talar om är extern. Jag använder alltså inte någon gång AVR:ens inbyggda pull-up.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> ...dubbelriktad seriell kommunikation.

Ibland kan det underlätta förståelsen av vad som är tänkt
genom att tala om vad det är man ska köra. I2C ? 1-Wire ?
Användarvisningsbild
Nisse
Inlägg: 908
Blev medlem: 9 juli 2006, 23:25:46
Ort: Kumla

Inlägg av Nisse »

Jag pratar med en SHT11 från Sensirion. DATABLAD

Har fått ihop ett program som funkar skapligt. Dock missar det i kommunikationen ibland. Ska skriva om hela rasket och se till att kolla ACK-signaler osv. nogrannare. Men innan jag gör det så ville jag få bekräftat att jag tänkte rätt angående hur jag kan använda utgångspinnen.

Mvh
Nisse
Användarvisningsbild
Nisse
Inlägg: 908
Blev medlem: 9 juli 2006, 23:25:46
Ort: Kumla

Inlägg av Nisse »

Bild

Ut funkar i alla fall utmärkt. Övre är data, sänder 10101010 och undre är klockan.
In verkar också funka bra, men jag missar i kommunikationen ibland. Men det tror jag hänger på andra saker.

mvh
Nisse
Skriv svar