Fel värde på PORT med bcd/hex strömställare?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
GustafRG
Inlägg: 6
Blev medlem: 13 juni 2009, 01:49:35

Fel värde på PORT med bcd/hex strömställare?

Inlägg av GustafRG »

Hej,
Jag har hållit på med PIC-programmering i snart ett år, använder MPLAB och HI-TECH C.
Hårdvaran utgörs av en PIC16F887, en hex-strömställare och en 2x16 LCD.

Jag har haft följande problem med anslutning av Hex-kodade strömställare med både 16-läges vridströmställare och 9-läges tumhjuls.

Koden populerar en variabel med värdet av en PORT i mitt fall PORTC. den läser av en BIT i taget och resultatet blir en fyra-bitars representation av strömställarens värde.

Kod: Markera allt

int read_hex_switch()
{	
    PORTC = 0x00; // Clear PORTC
    TRISC = 0x0f; // Set PORTC 0-3 to Input
    int position = 0;
    position = RC0;
    position |= RC1 << 1;
    position |= RC2 << 2;
    position |= RC3 << 3;
    //position ^= 0x0f; om In Low uncomment this to reverse bits.
    return position;
}
Detta skrivs sedan ut på displayen:

Kod: Markera allt

void main(void)
{	
	ANSEL = 0; // No analogue pins
	ANSELH = 0;
	lcd_init();

	while(1)
	{
		char buf[16];
		lcd_clear();
		lcd_goto(0);	
		lcd_puts("9 state hex sw.");
		lcd_goto(0x40);
		
		lcd_puts("Pos: ");
		
		int hex_pos;
		for(;;)
		{		
			DelayMs(100);
			lcd_goto(0x45);
			hex_pos = read_hex_switch();
			sprintf(buf,"%2d",hex_pos);
			lcd_puts(buf);
		}
	}
}
Nu till det intressanta, och det jag för mitt liv inte kan reda ut:
PIC:en läser av rätt värde, men bara intermittent! Värdet skrivs ut på LCD:n och sedan växlar den värde "slumpmässigt"!
Har jag ställt vredet på 4 visar den t.ex.: 4...11...15...12...4...8...15...4...
Har jag ställt vredet på 7 visar den t.ex.: 11...7...15...7...12...9...7...15...

Det verkar alltså, som om den läser av rätt värde men bara ibland?
Är detta sannolikt ett elektriskt eller ett programmatiskt fel?

Har haft liknande fel med en enklare applikation, en PIC som, genom att blinka en LED, simulerar fyrkaraktärer som man väljer med ett 16-läges vred. Felet då var att den verkade tycka att en av PIN-arna var låg (i IN LOW) dvs "1". och bytte fyrkaraktär på eget bevåg. Kretsen verkade vara mycket känslig för störningar, det räckte att jag andades på kretsen för att den skulle bete sig underligt... eller rörde handen ca 10-15 cm från kretskortet??

Koden fungerar felfritt vid simulering!

Video finns på
(Lite dålig videokvalitet)

Detta är mycket frustrerande, hjälp tas tacksamt emot!

Mvh,
Gustaf
B1n4ry
EF Sponsor
Inlägg: 1327
Blev medlem: 30 november 2005, 20:02:50
Ort: Borås
Kontakt:

Re: Fel värde på PORT med bcd/hex strömställare?

Inlägg av B1n4ry »

Det låter som om det fattas "Pull Down" motstånd.
Anslut 10k motstånd från varje datapinne på din switch till jord.

När din switch står i läge "8" så är Bit 3 garanterat hög eftersom switchen sluter den mot "c" som du kopplat till +5. Men de andra pinnarna svävar fritt och påverkas av störningar som gör att processorn kan tolka dom som 1:a även om du vill att dom skall vara 0:a...

//B1N4RY
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Fel värde på PORT med bcd/hex strömställare?

Inlägg av sodjan »

Sannolikt problem: Öppna ingångar (hex-switchen sluter bara till jord, t.ex)
Tänkbar Lösning: Pullup på PIC pinnarna via externa motstånd eller WPU (sök på WPU i databladet).
GustafRG
Inlägg: 6
Blev medlem: 13 juni 2009, 01:49:35

Re: Fel värde på PORT med bcd/hex strömställare?

Inlägg av GustafRG »

Wow,
Tack för snabbt svar!
Jo, nu när jag tänker efter så har nog de värden som den har växlat mellan alltid varit högre än det vredet varit inställt på!

Vad jag förstår så kan man ställa en PORT som input i två lägen IN HIGH och IN LOW. Vid IN HIGH, som jag använder, behöver man alltså "pull-down" mot 0V och vid IN LOW pull-up mot +5V. Jag tror att PORTC saknar WPU om jag läst databladet rätt...

Hur ska man resonera när man väljer storlek på resistorerna beroende på pull-up eller pull-down? Varför just 10k? såg ett exempel på youtube som visar principen, och varför man inte vill ha öppna ben. Där användes pull-up på 300 Ohm.

/Gustaf
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Fel värde på PORT med bcd/hex strömställare?

Inlägg av sodjan »

> Vad jag förstår så kan man ställa en PORT som input i två lägen IN HIGH och IN LOW.

Låter helgalet. Var har du fått det ifrån ? Någon referens ?
Du "ställer" aldrig en ingång till något alls, du bara läser den..

> Varför just 10k?

Av ingen speciell anledning alls, det är bara ett vanligt värde. Vad som helst
mellan 1k till 100k fungerar säkert helt OK.

> Där användes pull-up på 300 Ohm.

Ett onödigt lågt värde för vanliga pullup, men kan vara OK i vissa
speciella fall som vid vissa kommunikationslösningar.

> ...eftersom switchen sluter den mot "c" som du kopplat till +5.

Det är vanligare (av orsaker som vi inte behöver gå in på här) att
sluta mot GND och ha pullup till +5V. D.v.s koppla "c" på switcharna
mot GND.

> Jag tror att PORTC saknar WPU om jag läst databladet rätt...

Mycket möjligt. Notera också att WPU är pull *UP*, så om du använder
en port med WPU (och vill använda WPU) så *måste* du koppla "c" till GND.

En liten sidoeffekt är att du får in värderna inverterade, men det är ju
enkelt att fixa i koden...
GustafRG
Inlägg: 6
Blev medlem: 13 juni 2009, 01:49:35

Re: Fel värde på PORT med bcd/hex strömställare?

Inlägg av GustafRG »

>> Vad jag förstår så kan man ställa en PORT som input i två lägen IN HIGH och IN LOW.

>Låter helgalet. Var har du fått det ifrån ? Någon referens ?
>Du "ställer" aldrig en ingång till något alls, du bara läser den..

Nja, jag läste databladet igen och det står om PORTC:
bit 7-0 RC<7:0>: PORTC General Purpose I/O Pin bit
1 = Port pin is > VIH
0 = Port pin is < VIL
Det var jag som snurrade till det lite bara. Det står bara ju att biten är en 1:a om spänningen är tillräckligt hög, det hade inget med inställningar att göra.

En sak jag reagerade på dock, när jag sluter pinnarna mot jord så dämpas belysningen i displayen märkbart, som om det går åt en massa ström?

Återigen, tack för mycket bra hjälp!
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Fel värde på PORT med bcd/hex strömställare?

Inlägg av sodjan »

> Det står bara ju att biten är en 1:a om spänningen är tillräckligt hög, det hade inget med inställningar att göra.

Exakt. Och normalt brukar man inte bry sig om de där nivåerna (VIL/VIH),
man har ju nästan alltid 5V eller jord som nivåer i alla fall.

> när jag sluter pinnarna mot jord så dämpas belysningen i displayen märkbart,

Vilka "pinnar" ??

> som om det går åt en massa ström?

Och gör det det ? Är det inte enklare att kolla det direkt
i kopplingen som du har än att fråga här ? Vi har ju
lite svårt att kolla det i din koppling... :-)

Du måste vara betydligt tydligare om vad du frågar
om, vi kan inte sitta och gissa vad du menar. Eller,
tja, det kan vi kanske, men det är inte säkert att vi
gissar rätt, så därför avstår jag från gissningar... :-)
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Fel värde på PORT med bcd/hex strömställare?

Inlägg av jesse »

Kod: Markera allt

    int position = 0;
    position = RC0;
    position |= RC1 << 1;
    position |= RC2 << 2;
    position |= RC3 << 3;
Nu är jag inte van vid PIC, men måste du verkligen läsa bitarna en och en? Normalt kan man ju läsa av allihop på en gång rakt in i ett register. Om du sedan inte vill ha med bitarna 4-7 så använder du en bitmask: AND 0b00001111, nåt i stil med (det kan vara syntaxfel, jag har aldrig programmerat PIC, men principen):

Kod: Markera allt

char read_hex_switch() // returnerar en 8-bitars char
{   
    return PORTA & 0b00001111;
}
Det ska inte gå någon märkbar ström om du kopplar ingångar till jord. (om det är det du menar med "pinnar"). Om du inte har satt dit pull-up motstånd ska strömmen vara nära noll.

Om det går en ström från pinnen till jord så är den antagligen inte programmerad som ingång.

Varför 10K?

Ju lägre värde desto större ström går genom motståndet när man sluter kontakten. Det är ju onödigt att slösa ström. Därför kan ju t.ex. 100k vara ett bra värde. Men ju högre värde du har desto större risk för störningar på ingången. Använder du en kondensator (mot kontaktstuds t.ex) så fungerar även motståndet som en del i ett RC-filter och fördröjer signalen en stund.

Är man orolig för störningar ska man ha ett lågt värde på R, t.ex. 10 k eller mindre. Jag håller mig ofta kring 33-67 k för pull-up. 300Ω verkar extremt onödigt om det inte är så att signalkällan är något annat än en brytare. T.ex. optokopplare behöver ofta pull-up i storleken 300Ω till 2kΩ för att ge en bra spänningsnivå till ingången.


Så nu har du ett par saker att göra:
1) identifiera felet varför det går ström som inte ska gå.
2) antingen aktivera interna pull-up resistors på ingångarna och koppla din BCD-omkopplares gemensamma anslutning till jord istället för +5V och invertera det inlästa värdet i koden, eller så behåller du koden oförändrad och sätter dit 4 st motstånd (ett för varje ingång) kopplade till jord.
Skriv svar