Sida 1 av 1

mega88 tangentordsavkodnings problem - nybörjare

Postat: 31 oktober 2009, 18:51:14
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;
}	

Re: mega88 tangentordsavkodnings problem - nybörjare

Postat: 31 oktober 2009, 19:35:15
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?

Re: mega88 tangentordsavkodnings problem - nybörjare

Postat: 31 oktober 2009, 21:28:30
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)

Re: mega88 tangentordsavkodnings problem - nybörjare

Postat: 31 oktober 2009, 22:28:43
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?

Re: mega88 tangentordsavkodnings problem - nybörjare

Postat: 31 oktober 2009, 22:42:22
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!