Nybörjare i behov av get-started-hjälp med AVR MCU

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Inlägg av BEEP »

">>BEEP, jag förstår inte riktigt vad du menar med "lysdioderna på den är kopplade till plus""
Jag glömde ett "är" i meningen, får skylla på förkylningen :)

Ett av benen på alla lysdioderna är kopplad till plus så därför behöver du ha minus för att kunna tända dom och minus är samma som 0 i PORTB registret.
sica06
Inlägg: 83
Blev medlem: 31 augusti 2008, 17:31:50
Ort: Karlskrona

Inlägg av sica06 »

Tack för svaren!

> En av benen på alla lysdioderna är kopplad till plus så därför behöver du ha minus för att kunna tända dom och minus är lika med 0 i PORTB registret.

Ah, då fattar jag. Tack! Är detta det vedertagna eller gäller det främst för STK500?

> Sidan 63-63 har en perfekt beskrivning av det.

Läste detta. Det står bl a i table 19 (sid 64): PAn will source current if ext. pulled low. Av detta drar jag slutsatsen att den INTE driver ström vid DDRB = 0 och PORTB = 1 (såvida man inte pull it low externt), dvs om jag skickar 5 v till den pinnen så kommer den (MCU:n) inte att registrera det?

Jag förstår att anledningen till att man kan ändra DDRB mellan in- och utgång är för ökad valmöjlighet. Det jag dock fortfarande inte riktigt hajat är varför man även har PORTB - jag menar, har jag programmerat den till att vara utgång så förstår jag inte varför jag behöver "bekräfta" eller "avslå" detta med PORTB? Men jag antar att detta blir väldigt uppenbart när jag väl kommer igång med kodningen.

Jag tror mig också har förstått PINB nu. Jag kan alltså inte "skriva" till PINB, utan bara använda det för att läsa av vilka pinnar som är höga/låga?
En följdfråga på det dock:
Om jag har gjort följande:
DDRB = 00001111, samt PORTB = 00110011. Efter detta skickar jag 5v-signaler till alla pinnar (11111111), sedan läser jag av PINB. Kommer jag då att få svaret (1) 11000000 (alternativt (2) kanske svaret 11000011)? Min tanke bakom detta (1) är alltså att PB 0-3 är utgångar och därmed spelar det ingen roll vad PORTB sätts till. PB 4-5 har PORTB = 1 och därmed resistorn aktiverad. PB 6-7 går för att de är ingångar samt resistorn är avaktiverad. I det andra (2) fallet menar jag att PB 0-1 också är 1 eftersom både DDRB och PORTB är 1 där. - Let me have it, hur fel ute är jag?

Tack för att ni står ut.

Mvh
Simon
pagge
EF Sponsor
Inlägg: 933
Blev medlem: 15 juni 2004, 00:15:08
Ort: Luleå
Kontakt:

Inlägg av pagge »

>Det jag dock fortfarande inte riktigt hajat är varför man även har PORTB
Du måste ju säga VAD som skall vara på utgången. DDR säger utgång, men säger inte ifall det skall vara 0 eller 5V. PORT bestämmer detta.

Förutsatt att du inte kopplat nåt till pinnen kommer du att läsa följande på PIN vid givna DDR och PORT värden

Kod: Markera allt


DDR PORT  => PIN

   0    0 => Z ( slumpmässigt värde pga brus )
   0    1 => 1 (svagt pullupad)
   1    0 => 0
   1    1 => 1


Eller kort och gott "PIN läser vad du har för spänning på pinnen.". Kortsluter du pinnen till jord kommer du alltid att läsa 0, kortsluter du till matning kommer du alltid att läsa 1 osv.

Jag rekomenderar att du kollar i STK500 manualen. Där ser du hur t.ex. lysdioderna är kopplade, vad alla jumpers gör samt mkt annat.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> varför jag behöver "bekräfta" eller "avslå" detta med PORTB?

Det gör du inte ! PORTx väljer om den ska vara "hög" eller "låg".

Du verkar helt förväxlat "in" och "ut" med "hög" och "låg"...

> Jag kan alltså inte "skriva" till PINB, utan bara använda det för att läsa av vilka pinnar som är höga/låga?

Exakt !

> Let me have it, hur fel ute är jag?

Svårt att säga, det var så rörigt så jag orkade inte igenom det.
Ta en sak i sänder och blanda inte ihop in/ut så mycket i samma mening... :-)

Men varför försöka skriva om det som finns i databladet ?
Det är t.o.m förklarat med färre ord där än det där du försökte med.

Som sagt, du har rört ihop DDR och PORT, du tror att de har (delvis)
samma funktion, så är det inte. När du tänker om där, så tror
jag att allt annat ger sig.
sica06
Inlägg: 83
Blev medlem: 31 augusti 2008, 17:31:50
Ort: Karlskrona

Inlägg av sica06 »

>> Du måste ju säga VAD som skall vara på utgången. DDR säger utgång, men säger inte ifall det skall vara 0 eller 5V. PORT bestämmer detta.

Detta förstår jag. Jag menade isåfall att man DDR = 1 direkt skulle innebära 5v, men jag förstår begränsningarna i det nu.

>> Eller kort och gott "PIN läser vad du har för spänning på pinnen.".

Det du alltså menar är att 1 på PORTx (oavsett DDRx) ger 5v på pinnen. Jag tycker det är lite konstigt, för det står i manualen att då DDRx är satt till 0 och PORTx är satt till 1 så The MOS pull-up resistor is activated - innebär detta att resistansen "kopplas bort"?

PINx kommer alltså att visa det du skrev nedan. Om jag utifrån skickar 5v-signaler till pinnarna, kommer PINB att visa 1 på alla dessa ställen då, oavsett hur PORTx är programmerad?

Alltid drygt "prata" om såna här grejer via text, ganska säker på att jag hade fattat galoppen på två minuter via tele.

//Simon
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Ytterligare ett försök att förklara:

Utgång:
1) Sätt önskad DDR-bit till 1.
2a) Vill du ge ut en hög signal (5V)? Sätt PORT-biten till 1
2b) Vill du istället ge ut en låg signal (0V)? Sätt PORT-biten till 0

Ingång:
1) Sätt önskad DDR-bit till 0.
2a) Vill du ha en vanlig högimpedans-ingång? Sätt PORT-biten till 0
2b) Vill du istället aktivera det inbyggda pull-up-motståndet? Sätt PORT-biten till 1
3) Läs av värdet genom att kolla önskad bit i PIN-registret.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Jag menade isåfall att man DDR = 1 direkt skulle innebära 5v, men jag förstår begränsningarna i det nu.

"Begränsningarna" ?? Det är totalfel... :-)

> Det du alltså menar är att 1 på PORTx (oavsett DDRx) ger 5v på pinnen.

Ger och ger...
Vad en etta i PORTx får för resultat beror på DDRx (och även vad som är anslutet till pinnen).
Om DDRx har satt pinnen till utgång, så kommer processorn att försöka driva pinnen till 5V,
om den lyckas med det beror på hur den är ansluten utanför processorn.
Om du t.ex har kopplat den direkt till 0V, så kommer den aldrig att bli 5V... :-)

> så The MOS pull-up resistor is activated - innebär detta att resistansen "kopplas bort"?

"Activated" är *inte* detsamma som "kopplas bort", det är precis tvärtom...

> Om jag utifrån skickar 5v-signaler till pinnarna, kommer PINB att visa 1 på alla dessa ställen då, oavsett hur PORTx är programmerad?

Ja.
(Och även oavsett hur DDRx är satt, men är DDRx satt fel så kan du paja kretsen...)
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Inlägg av BEEP »

Du kan ha fyra olika inställningar med DDRxn och PORTxn registret.

1. DDRxn = 0 och PORTxn = 0, Ingång.

2. DDRxn = 0 och PORTxn = 1, Ingång som har ett motstånd till plus.

3. DDRxn = 1 och PORTxn = 0, Utgång som är låg.

4. DDRxn = 1 och PORTxn = 1, Utgång som är hög.


13.2.1 Configuring the Pin
Each port pin consists of three register bits: DDxn, PORTxn, and PINxn. As shown in “Register
Description” on page 88, the DDxn bits are accessed at the DDRx I/O address, the PORTxn bits
at the PORTx I/O address, and the PINxn bits at the PINx I/O address.

The DDxn bit in the DDRx Register selects the direction of this pin. If DDxn is written logic one,
Pxn is configured as an output pin. If DDxn is written logic zero, Pxn is configured as an input
pin.

If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is
activated. To switch the pull-up resistor off, PORTxn has to be written logic zero or the pin has to
be configured as an output pin.

Datablad - ATmega48/88/168 (376 pages, revision M, updated 09/07)
Senast redigerad av BEEP 7 november 2008, 23:26:18, redigerad totalt 2 gånger.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

En liten detalj bara...

Det är inte så speciellt bra att klippa in text från *fel* datablad. det mesta
är i och för sig korrekt, men det blir lite förvillande när texten inte är
den samma som i det rätta databladet och en del saker blir helfel,
som t.ex "As shown in ”Register Description” on page 87...". Om man
tittar på sidan 87 i *rätt* datablad så blir det riktigt förvirrat... :-)
sica06
Inlägg: 83
Blev medlem: 31 augusti 2008, 17:31:50
Ort: Karlskrona

Inlägg av sica06 »

>> 2a) Vill du ha en vanlig högimpedans-ingång? Sätt PORT-biten till 0
2b) Vill du istället aktivera det inbyggda pull-up-motståndet? Sätt PORT-biten till 1

Jo, det jag egentligen undrar här är alltså i vilket läge - ta gärna ett exempel - då jag vill aktivera det inbyggda pull-up motståndet. Om jag har något externt som t ex en knapp som sänder en signal på 5 v, är det då nödvändigt att aktivera motståndet?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Det är det vanligaste.
Man har en knapp som kopplar pinnen till GND (0V) och låter det inbyggda
"pullup" motståndet dra pinnen till 5V när man inte trycker på knappen.

Utan det inbyggda pullup motståndet så får man montera ett externt
motstånd mellan 5V och pinnen, vilket fungerar lika bra, men det blir
ju en komponent till...

Att koppla knappen mellan pinnen och 5V är ju lite korkat (och inte
så vanligt av helt andra orsaker) eftersom man du inte kan använda
den inbyggda pullup funktionen alls...
sica06
Inlägg: 83
Blev medlem: 31 augusti 2008, 17:31:50
Ort: Karlskrona

Inlägg av sica06 »

ok, så ofta är det så att de som väljer att inte aktivera motståndet gör det för att de har en källa som märkbart större eller mindre än 5v och vill ha större kontroll (eftersom man slipper räkna med den resistans som ligger på pinnen) över hur mycket som faktiskt går in till MCU:n? Vart kan jag läsa hur stor resistansen är?

Tack för hjälpen

//Simon
Mindmapper
Inlägg: 7122
Blev medlem: 31 augusti 2006, 16:42:43
Ort: Jamtland

Inlägg av Mindmapper »

>Vart kan jag läsa hur stor resistansen är?

Databladet kan man tänka! Ca 10kohm om jag inte minns fel.
Många grejor behöver inte pull-up för att de redan har aktiv pull-upp. T.ex. de flesta IC-kretsars utgångar (inte de som har open kollektor). Alla grejor som kan lämna positiv utsignal behöver normalt inte pull-up hjälp i MCU.

Edit: En enkel tryckknapp kan lämna positiv spänning men är högohmig när den ej är påverkad, och därför inte vettig att ge signal till högohmiga ingångar. Kopplad så att den ger positiv signa,l behöver den isåfall pull-down när den är öppen. Kopplad till GND, dvs. ger NOLL, när den sluter var vettigare som tidigare sagt, då behöver den pull-up.
Senast redigerad av Mindmapper 8 november 2008, 16:10:28, redigerad totalt 1 gång.
sica06
Inlägg: 83
Blev medlem: 31 augusti 2008, 17:31:50
Ort: Karlskrona

Inlägg av sica06 »

Tack för hjälpen, nu tror jag mig kunna fortsätta med lite mer kött på benen!

Till nästa gång =)
Mindmapper
Inlägg: 7122
Blev medlem: 31 augusti 2006, 16:42:43
Ort: Jamtland

Inlägg av Mindmapper »

Titta på dom här övningarna. Dom ger en hel del förklaringar hur man kopplar samtidigt som du lär dig programmera.

http://www.avrtutor.com/tutorial/thermo/welcome.php

Edit: Byte lör mot lär.
Skriv svar