Jednotlačítkový spínač s PIC 16F84A
Moderátor: Moderátoři
- jezevec
- Hlavní moderátor
- Příspěvky: 6101
- Registrován: 13 čer 2004, 00:00
- Bydliště: Břeclavsko
- Kontaktovat uživatele:
PPavel píše:Ale...
1/ Kdyz zkusim tim stejnym tlacitkem zapnout LED na portu RB1 (misto #DEFINE LED PORTB,0 dam #DEFINE LED PORTB,1) tak to nejede.
2/ pokud pridam v simulatoru do zapojeni zbyvajici tlacitka, tak aby to odpovidalo schematu, nejde uz zapinat ani LED na portu RB0
?????
Teď se dívám pořádně na to schema, odpory do serie s LED jsou příliš malé a port je přetížený, odtud možná ty problémy. Vždy se snaž co nejméně zatěžovat PIC, taky je lépe spínat LED proti zemi. Totéž platí pro tlačítka, dají se pak využít vnitřní upínací odpory k Ucc a nemusí být externí. Odpor 100R a dioda v obvodu resetu jsou zbytečné.
- jezevec
- Hlavní moderátor
- Příspěvky: 6101
- Registrován: 13 čer 2004, 00:00
- Bydliště: Břeclavsko
- Kontaktovat uživatele:
;*****************************************************************************
;
; Ovladani 4 LED tlacitky ON -OFF
;
; PIC 16F84A
; Osc. -XT 4MHz
;
; Konfigurace programatoru: CP - NE; PWRTE - Disabled; WDTE - NE; OSC - XT
; !!!!!!!! NEJSOU OSETRENA TLACITKA PROTI ZAKMITUM !!!!!!!!!!!!
;
;******************************************************************************
LIST p=16f84A, R=DEC ;direktivy prekladace
include<p16f84A.inc> ;definice nazvu registru
;********************* definice zapojeni hardware ***************************
#DEFINE LED1 PORTB,0 ;1. LEDka
#DEFINE LED2 PORTB,1 ;2. LEDka
#DEFINE LED3 PORTB,2 ;3. LEDka
#DEFINE LED4 PORTB,3 ;4. LEDka
#DEFINE TL1 PORTB,4 ;Tlacitko 1, ovlada LED1
#DEFINE TL2 PORTB,5 ;Tlacitko 2, ovlada LED2
#DEFINE TL3 PORTB,6 ;Tlacitko 3, ovlada LED3
#DEFINE TL4 PORTB,7 ;Tlacitko 4, ovlada LED4
;******************** Promenne *******************************************
OffRam EQU 0x0C ;offset pameti pro PIC16F84
;******************** kod programu ****************************************
;
ORG 0
GOTO Start ;skok na zacatek programu
; ORG 4
; GOTO Prerus ;skok na obsluhu preruseni
;******************** Inicializace **********************************
Start BSF STATUS,RP0 ;banka1
MOVLW 0x00 ;nastaveni OPTION
MOVWF OPTION_REG
MOVLW 0x00 ;vse na PORTA - OUT
MOVWF TRISA
MOVLW 0xF0 ;nastaveni PORTB 11110000
MOVWF TRISB
MOVLW 0x00
MOVWF INTCON
BCF STATUS,RP0 ;banka0
BSF LED1 ;vypne LED1
BSF LED2
BSF LED3
BSF LED4
;******************* Hlavni program ***************************************
Start1 BTFSS TL1 ;testuje TL1, je-li sepnuto skok na podprogram
CALL Ledka1 ;kde testuje stav LED diody
BTFSS TL1 ;ceka na uvolneni tlacitka
GOTO $-1
BTFSS TL2
CALL Ledka2
BTFSS TL2
GOTO $-1
BTFSS TL3
CALL Ledka3
BTFSS TL3
GOTO $-1
BTFSS TL4
CALL Ledka4
BTFSS TL4
GOTO $-1
GOTO Start1
;******************* Podprogramy **************************************
Ledka1 BTFSS LED1 ;testuje predchozi stav LED1 a zmeni ji na opacny
GOTO $+3
BCF LED1
GOTO $+2
BSF LED1
RETURN
Ledka2 BTFSS LED2 ;testuje predchozi stav LED2 a zmeni ji na opacny
GOTO $+3
BCF LED2
GOTO $+2
BSF LED2
RETURN
Ledka3 BTFSS LED3 ;testuje predchozi stav LED3 a zmeni ji na opacny
GOTO $+3
BCF LED3
GOTO $+2
BSF LED3
RETURN
Ledka4 BTFSS LED4 ;testuje predchozi stav LED4 a zmeni ji na opacny
GOTO $+3
BCF LED4
GOTO $+2
BSF LED4
RETURN
;************************ Konec programu ************************************
END
-
PPavel
Dioda a odpor u resetu tam byly davana kvuli moznosti programovat PIC pres ICP konektor.
Ty LEDky jsou vysocesvitive, modre 3.3V/20mA , mely slouzit pouze jako kontrolky a soucasne bud na stejnych portech PICu nebo na dalsich 4 volnych se mela pres tranzistory BC337 a BD139 spinat vetsi zatez.
Ted uz jsem se do toho tak zamotal, ze i kdyz zapojim, ja mi radite, LEDky a tlacitka proti zemi tak uz nevim jak k PICu pripojit tranzistor BC337. Puvodne jsem chtel z portu PICu pres odpor 1k2 na bazi BC337 a dale na BD139... ted nevim
ak začínaš, tak si program komentuj. Na každý riadok (aj keď je tam NOP) napíš komentár. Pomôže ti to pri hľadaní chýb, a najmä aj o hodinu budeš vedieť, čo si chcel aby procesor robil.
-
Návštěvník
Kód: Vybrat vše
/*
4 LED jednym tlacitkom
*/
#include <util/delay.h>
#include "avr/io.h"
#include <io.h>
unsigned int b,c,d,e;
unsigned char temp;
int main(void)
{
while (1)
{
if (bit_is_clear(PIND,0)) temp = 2;//pri log "0" na PIND 0 zapise do temp 2
else if (temp==2) //po prichode LOG "1" na vstup PIND 0 vykona prikaz
{
d++; //inkrementuje premennu d (urcuje pocet LED prip. kombinacie)
temp = 0; //do premennej temp zapise 0 t.j. cyklus sa bude opakovat az pri
//prichode najblizsej log "0" na PIND 0
}
else if (d==5) d = 0; //po (5) cykloch nastavi premennu d na 0
if (d==1) PORTB = 1; //LED 1
if (d==2) PORTB = 2; //LED 2
if (d==3) PORTB = 4; //LED 3
if (d==4) PORTB = 8; //LED 4
if (d==5) PORTB = 0; //LED OFF
};
};
//end;
