Sida 1 av 1
Kan inte läsa av ingångar Atmega168
Postat: 2 februari 2016, 22:22:00
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
int Address = 0x50;
if(PinA0())
Address |= 1 << 0;
if(PinA1())
Address |= 1 << 1;
if(PinA2())
Address |= 1 << 2;
Re: Kan inte läsa av ingångar Atmega168
Postat: 2 februari 2016, 22:41:56
av dmiller
Och här är schemat...
Re: Kan inte läsa av ingångar Atmega168
Postat: 2 februari 2016, 22:52:48
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.
Re: Kan inte läsa av ingångar Atmega168
Postat: 3 februari 2016, 04:36:59
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.
Re: Kan inte läsa av ingångar Atmega168
Postat: 3 februari 2016, 14:58:58
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
Re: Kan inte läsa av ingångar Atmega168
Postat: 3 februari 2016, 15:26:42
av dmiller
Tack för info!
Skall stämpla ut från jobbet direkt och åka hem o testa !!
Re: Kan inte läsa av ingångar Atmega168
Postat: 3 februari 2016, 17:51:59
av dmiller
Tack, det funkar kanon!
Re: Kan inte läsa av ingångar Atmega168
Postat: 3 februari 2016, 18:18:57
av Magnus_K
Kul att det fungerade, och tack
adent för bekräftelse. Alltid kul att höra från en AVR-guru
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
Re: Kan inte läsa av ingångar Atmega168
Postat: 3 februari 2016, 20:52:12
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!
Re: Kan inte läsa av ingångar Atmega168
Postat: 7 februari 2016, 20:43:50
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.
Bifogar ett meningslöst schema jag ritade för att jag skulle få allt att fastna bättre...
DSC_3051.JPG
Re: Kan inte läsa av ingångar Atmega168
Postat: 7 februari 2016, 21:33:22
av danwi
Tack!

Ditt schema är klockrent för att ytterligare tydliggöra det jag skrev, det blir betydligt mer konkret med en bild!
Re: Kan inte läsa av ingångar Atmega168
Postat: 7 februari 2016, 22:08:39
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.