logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AT90S2313] sterowanie zapalaniem diod z klawiatury

sim-ns 09 Maj 2010 20:51 1303 4
REKLAMA
  • #1 8056243
    sim-ns
    Poziom 2  
    Witam!

    Potrzebuje zrobić programik, który działa nastepujaco: majac klawiature numeryczną i 8 diod , po nacisnięciu np. klawisza z numerem 5 ma się zapalić 5 pierwszych diod od D1 do D5 i analogicznie z innymi klawiszami, przy czym po nacisnieciu klawisza z cyfrą 0 zapalonne diody maja gasnąć lub ma ssie nic nie dziać jesli symulacja jest co dopiero odpalona. Teraz powstaje pytanie jak to zrobić?

    Zadeklarowanie diod i klawiszy z rezystorami na odpowiednich nóżkach:
    D1 VDD PB0  ; x: Panel LEDs 1 - 8
    D2 VDD PB1
    D3 VDD PB2
    D4 VDD PB3
    D5 VDD PB4
    D6 VDD PB5
    D7 VDD PB6
    D8 VDD PB7
    
    K0 VDD PD0 LATCHED
    R00 VSS PD0 1k
    
    K1 VDD PD1 LATCHED
    R01 VSS PD1 1k
    
    K2 VDD PD2 LATCHED
    R02 VSS PD2 1k
    
    K3 VDD PD3 LATCHED
    R03 VSS PD3 1k
    
    K4 VDD PD4 LATCHED
    R04 VSS PD4 1k
    
    K5 VDD PD5 LATCHED
    R05 VSS PD5 1k
    
    K6 VDD PD6 LATCHED
    R06 VSS PD6 1k
    
    K7 VDD PD7 LATCHED
    R07 VSS PD7 1k
    
    K8 VDD PD8 LATCHED
    R08 VSS PD8 1k


    i program, który według mnie powinien robić to co jest w zamysle:
    volatile char i;
    volatile unsigned char stanKlawiszy;
    
    ISR(TIMER0_OVF0_vect){
    	 i++;
    	
    	 stanKlawiszy = PINB &9;
    
    	 switch(stanKlawiszy){
    	 	case 0:
    		{
    			DDRB = 0;
    			break;
    		}
    		case 1:
    		{
    			DDRB = 2-1;
    			break;
    		}
    		case 2:
    		{
    			DDRB = 4-1;
    			break;
    		}
    		case 3:
    		{
    			DDRB = 8-1;
    			break;
    		}
    		case 4:
    		{
    			DDRB = 16-1;
    			break;
    		}
    		case 5:
    		{
    			DDRB = 32-1;
    			break;
    		}
    		case 6:
    		{
    			DDRB = 64-1;
    			break;
    		}
    		case 7:
    		{
    			DDRB = 128-1;
    			break;
    		}
    		case 8:
    		{
    			DDRB = 256-1;
    			break;
    		}
    	 }
    }
    
    int main(void) {
    	 DDRD = 4;
    	 TCNT0 = 100;
    	 TCCR0 = 3;
    	 TIMSK = 2;
    	 sei();
    	
    	 while(1){
    	 }
    }


    Programuje w środowisku VMLAB 3.12

    Bazrdo prosze o pomoc! Problem jaki mam z tym programem napewno jest błachy aczkolwiek nie siedze w tym na codzień i nie mam wiekszego doświadczenia.
  • REKLAMA
  • #2 8057204
    grysek
    Poziom 19  
    Witam,

    A co się dzieje po uruchomieniu tego programu? Może pokaż jak podpiąłeś przyciski do procka :P Nie znam za dobrze języka C, lecz zauważyłem kilka rzeczy które są dla mnie nie zrozumiałe: skoro przyciski masz podpięte do portu D to czemu sprawdzasz rejestr wejściwy portu B? Po drugie jedynki lub zera ustawiamy na wyjściu wpisując odpowiednią liczbę do rejestru PORTx (w Twoim przypadku portb). Po trzecie brak ustawienia kierunku portów.

    I jeszcze problem prawdopodbnie może wystąpić też w tym ze wszystko dzieje się za szybko. No i block case tez jest nie za dobrze skonstruowany bo jesli masz klawisze podpięte np do kolejnych pinów portu D, to raczej sprawdzaj czy na porcie występuja potęgi dwójki, no chyba że masz jakąś inną klawiaturę. Podaj więcej szczegółów oraz najlepiej schemat.

    Pozdrawiam :P
  • REKLAMA
  • #3 8057242
    sim-ns
    Poziom 2  
    Po uruchomieniu tego programu nic sie nie dzieje a powinno być tak że np. kiedy wcisniemy klawisz z numerem 3 to diody D1, D2 i D3 sie zapalają i analogicznie co do innych przycisków. Poprostu wartość liczbowa na przycisku ma odpowiadać ilości zapalanych diod przez ten przycisk.

    Dodano po 4 [minuty]:

    na porcie B sa podpięte diody a na porcie D przyciski z resztą widać to w pierwszym kodzie
  • REKLAMA
  • Pomocny post
    #4 8057267
    grysek
    Poziom 19  
    No więc cały port B ustawiasz jako wyścia, oraz cały port D jako wejścia tzn że na na samym początku programu powinno być:

    DDRB = 0xFF;
    DDRD = 0;


    I całą tą funkcję można zbudować dużo prościej.
    Po wcisnieciu przycisku np 2 będą zapalane diody D1 i D2 czyli
    PORTB = PIND - 1; (bo wiadomo że na pinie PD2 pojawi się 1, czyli wczytamy liczbę 4, a musimy zapalić PB0 i PB1 czyli wpisac liczbę 3)
    No chyba że masz podciągnięte do plusa wtedy trzeba napisac to w ten sposób że: PORTB = (~PIND) - 1;

    W ten sposób pomijamy cały blok case. :P
  • #5 8057315
    sim-ns
    Poziom 2  
    ok, wielkie dzieki! Działa już wszystko SUPER!

    Pomógł +1 :)
REKLAMA