mega88 tangentordsavkodnings problem - nybörjare

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
almerase
Inlägg: 7
Blev medlem: 17 september 2009, 13:25:19

mega88 tangentordsavkodnings problem - nybörjare

Inlägg av almerase »

Mitt problem är att då jag trycker på 1 så visar mina dioder att jag har tryckt på D... det verkar som om tabellen är omvänd men jag förstår inte varför den skulle bli det...

Den kod som strular:

Kod: Markera allt

const unsigned char knapp[16] = {0x77,0x7B,0x7D,0x7E,0xB7,0xBB,0xBD,0xBE,0xD7,0xDB,0xDD,0xDE,0xE7,0xEB,0xED,0xEE};
const unsigned char ascii[16] = {'1','2','3','A','4','5','6','B','5','6','7','C',0x08,'0',0x0D,'D'}; //declareras globalt

unsigned char get_key()
{
	unsigned char tecken, knapp1, knapp2, pos;

	for(pos=0; pos<16; pos++)
	{
		knapp1 = knapp[pos];
		PORTB = knapp1|PULL_UP;

		knapp2 = PINB;
		knapp2 = PINB;

		if(knapp2 == knapp1)
		{
			tecken = ascii[pos]; //hämtar samma pos i ascii tabellen men den verkar inte funka...
			return tecken;
		}	
	}

	return 0;
}	
Hela programmet:

Kod: Markera allt

#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 8000000
#include <util/delay.h>

#define PULL_UP 0x0F

const unsigned char knapp[16] = {0x77,0x7B,0x7D,0x7E,0xB7,0xBB,0xBD,0xBE,0xD7,0xDB,0xDD,0xDE,0xE7,0xEB,0xED,0xEE};
const unsigned char ascii[16] = {'1','2','3','A','4','5','6','B','5','6','7','C',0x08,'0',0x0D,'D'};
unsigned char value, value1;

void init();
unsigned char get_key();

ISR(PCINT0_vect) //interrupt för portB 
{
	cli();

	value = get_key(); //stutsavkodning
	_delay_ms(5);
	value1 = get_key();

	if(value == value1)
		PORTD = value;
	
	sei();

	return;
}


int main()
{
	cli(); //disable interrupt

	init();

	sei(); //enable interrupts
	
	while(1) 	{;}
}

void init()
{
	DDRD = 0xFF; //alla portar utgångar
	PORTD = 0x00; //sätter portarna till 0V
	DDRB = 0xF0; //Ut 4-7 in 0-3
	PORTB = 0x0F; //pullup aktiverat
	
	PCICR = 0x01; //enable pinchange interrupt
	PCMSK0 = 0x0F; //på portB pin 0-3
}

unsigned char get_key()
{
	unsigned char tecken, knapp1, knapp2, pos;

	for(pos=0; pos<16; pos++)
	{
		knapp1 = knapp[pos];
		PORTB = knapp1|PULL_UP;

		knapp2 = PINB;
		knapp2 = PINB;

		if(knapp2 == knapp1)
		{
			tecken = ascii[pos];
			return tecken;
		}	
	}

	return 0;
}	
Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: mega88 tangentordsavkodnings problem - nybörjare

Inlägg av E85 »

Det fattas en del info här... Har du t.ex kopplat rätt så du är HELT säker på att felet ligger i kodsnutten du påstår att felet ligger i?
almerase
Inlägg: 7
Blev medlem: 17 september 2009, 13:25:19

Re: mega88 tangentordsavkodnings problem - nybörjare

Inlägg av almerase »

Det är mycket sant... Har dock ingen aning om vad som skulle kunna orsaka det felet oavsett :)

detta är mitt kopplingsschema:
http://s739.photobucket.com/albums/xx33 ... an0001.jpg

(har ingen aning om hur jag får bild grejen här att funka så länk får duga)
EBD
Inlägg: 136
Blev medlem: 10 maj 2006, 18:50:48
Ort: Sundsvall

Re: mega88 tangentordsavkodnings problem - nybörjare

Inlägg av EBD »

1:an ligger på rad1, kolumn 1 som är pinne 1 och 5 på din knappsats enligt schemat. De är kopplade till PB0 och PB4. Om du skickar en nolla på PB4 med knappen intryckt så kommer PINB att läsas 11101110 binärt, vilket är 0xEE. Och det har du i din kod sagt att det är 'D'. Har du kanske blandat ihop vad som är MSB och LSB på portarna när du skrev koden?
almerase
Inlägg: 7
Blev medlem: 17 september 2009, 13:25:19

Re: mega88 tangentordsavkodnings problem - nybörjare

Inlägg av almerase »

Ah, det innebär att jag måste ha omvänd ordning på pinnarna det hade jag helt glömt bort :)

Tack för hjälpen!
Skriv svar