Kan inte läsa av ingångar Atmega168

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dmiller
Inlägg: 159
Blev medlem: 21 oktober 2010, 23:09:29

Kan inte läsa av ingångar Atmega168

Inlägg av dmiller »

Har en Atmega 168.

3 jumpers är anslutna till PortB 1, 2, 3
10k till respektive som pull down
ingångarna sluts mot 3V3 när jumper ansluts.

Variabeln Address förblir 0x50, hur jag än jumprar ingångarna...

Vad gör jag för fel?

Tack

Kod: Markera allt

#define PinA0() bit_is_set(PORTB,0)
#define PinA1() bit_is_set(PORTB,1)
#define PinA2() bit_is_set(PORTB,2)

Kod: Markera allt

DDRB  = 0b00000000;

Kod: Markera allt

int Address = 0x50;
	
if(PinA0())
	Address |= 1 << 0;

if(PinA1())
	Address |= 1 << 1;
	
if(PinA2())
	Address |= 1 << 2;
dmiller
Inlägg: 159
Blev medlem: 21 oktober 2010, 23:09:29

Re: Kan inte läsa av ingångar Atmega168

Inlägg av dmiller »

Och här är schemat...
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Kan inte läsa av ingångar Atmega168

Inlägg av lillahuset »

Jag är ingen expert och det var länge sedan jag använde AVR. Men en gissning är att du missat någon detalj i inställningen av porten.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Kan inte läsa av ingångar Atmega168

Inlägg av Magnus_K »

Obs. Kan väldigt lite om AVR men försöker lära mig mer.

Vad jag kan se så ska man läsa ut "PINx"-registret istället för "PORTx". Tror att du bara läser "0" då PORTB är satt till ingång (0)
Fungerar det om du gör som nedan?

Kod: Markera allt

#define PinA0() bit_is_set(PINB,0)
#define PinA1() bit_is_set(PINB,1)
#define PinA2() bit_is_set(PINB,2)
Ps. Ref 14.2.4 i databladet. Sid 78. Ds.
Användarvisningsbild
adent
Inlägg: 4245
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Kan inte läsa av ingångar Atmega168

Inlägg av adent »

Det Magnus_K säger stämmer precis.

PORTX är för att skriva till en utgång och PINX är för att läsa från en ingång.
Faktum är att du kan via mjukvara eneble:a en intern pull-up genom att sätta Pinne Y på Port X till ingång.
Därefter skriver du en 1:a till utångsregistret PORTX på den pinne (bit) du vill ha pull-up på.

Tyvärr kan du inte få pull-down, men det löser du i mjukvaran sen.

MVH: Mikael
dmiller
Inlägg: 159
Blev medlem: 21 oktober 2010, 23:09:29

Re: Kan inte läsa av ingångar Atmega168

Inlägg av dmiller »

Tack för info!

Skall stämpla ut från jobbet direkt och åka hem o testa !!
dmiller
Inlägg: 159
Blev medlem: 21 oktober 2010, 23:09:29

Re: Kan inte läsa av ingångar Atmega168

Inlägg av dmiller »

Tack, det funkar kanon!
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Kan inte läsa av ingångar Atmega168

Inlägg av Magnus_K »

Kul att det fungerade, och tack adent för bekräftelse. Alltid kul att höra från en AVR-guru :wink:

När ändå huvudämnet verkar vara uppklarat så hoppas jag att det går bra att låna tråden för en ganska relaterad fråga.
Om det finns någon här som pysslat lite med både dom senare PIC:arna och AVR:erna; kan man göra en direkt jämförelse mellan port-registren enligt nedan?

Kod: Markera allt

AVR                 PIC

DDRx       ->       TRISx
PORTx      ->       LATx
PINx       ->       PORTx
danwi
Inlägg: 386
Blev medlem: 16 oktober 2008, 17:00:59
Ort: Linköping

Re: Kan inte läsa av ingångar Atmega168

Inlägg av danwi »

En liten reflektion är att om de interna pull-up:erna på porten är aktiva så kommer spänningen på pinnarna inte vara 0 V vid öppen bygling utan ligga någonstans mellan 3,3 V och 0 V genom spänningsdelningen mellan internt och externt motstånd. Databladet säger att pull-up-värdet (RPU, sid 311 i databladet) ligger i intervallet 20-50k vilket ger en spänning i spannet på 0,65-1,1 V på pinnen med 10k pull-down externt (utan att ta hänsyn till toleranser). Högsta specade spänning för att kretsen garanterat ska tolka det som 0:a på ingången (VIL, sid 310) är 0.3*Vcc, d.v.s. nominellt 0.99 V i detta fall - då finns det en risk att du kör kretsen utanför spec. Nu lär det knappast ge några problem för din del men det känns ju onödigt.

Det finns flera bra sätt att undvika detta - här är några sätt (det finns nog fler) och det räcker med ett av dessa:
  • Stäng av pull-up:erna genom PUD-biten i MCUCR-registret (om du inte behöver pull-up:er på någon pinne).
  • Stäng av pull-up:er för de specifika pinnarna genom att sätta pinnarnas motsvarigheter i PORTB-registret till 0.
  • Minska det externa motståndets värde. 8,6 kOhm ger teoretiskt max på 3,3*8,6/(20+8,6) = 0.99... V men med tanke på toleranser bör man välja ett lägre värde, typ max 7 k.
  • Byt polaritet på din externa koppling så att du kör med byglingarna mot 0 V i stället för mot 3,3 V.
Gör du enligt sista punkten så kan du till och med skippa de externa motstånden då du kan köra med de interna pull-up:erna. Vill du att byglingarna ska ha samma mening/värde internt som nu så räcker det ju att invertera värdet när du läst det från pinnarna.

Som sagt så lär det inte spela någon roll om du gör det eller inte i detta fall men det kan vara bra att vara medveten om det potentiella problemet. Skulle du bygga en produkt som görs i stor serie kommer felet kanske/sannolikt dyka upp någonstans och det kan vara rent (lägg-till-lämpliga-kraftuttryck-här) hopplöst att hitta det!

Lycka till!
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Kan inte läsa av ingångar Atmega168

Inlägg av Magnus_K »

Såna inlägg som danwi just gjorde är det bästa som kan hända på forumet.
Informationsrikt och författat så nästan vem som helst kan förstå. Även idéer om förbättringar och att-tänka-på:are. :tumupp:

Bifogar ett meningslöst schema jag ritade för att jag skulle få allt att fastna bättre...
DSC_3051.JPG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
danwi
Inlägg: 386
Blev medlem: 16 oktober 2008, 17:00:59
Ort: Linköping

Re: Kan inte läsa av ingångar Atmega168

Inlägg av danwi »

Tack! :) Ditt schema är klockrent för att ytterligare tydliggöra det jag skrev, det blir betydligt mer konkret med en bild!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Kan inte läsa av ingångar Atmega168

Inlägg av sodjan »

Sen så blir mycket av detta ett icke-problem om man gör som man
brukar göra, d.v.s. använda pull-up istället för pull-down motstånd.
Det spelar då t.ex. ingen roll om interna pull-up också är påslagna.
Skriv svar