Sida 1 av 1
Portar på AVR
Postat: 14 juli 2007, 11:11:12
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
Postat: 14 juli 2007, 11:23:27
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.
Postat: 14 juli 2007, 11:42:29
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
Postat: 14 juli 2007, 11:49:54
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.
Postat: 14 juli 2007, 12:25:00
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 ?
Postat: 14 juli 2007, 12:49:06
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
Postat: 14 juli 2007, 14:36:22
av Nisse
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