Jednotlačítkový spínač s PIC 16F84A

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
PPavel

#16 Příspěvek od PPavel »

Watch Dog mam OFF a oscilator XT
Uživatelský avatar
jezevec
Hlavní moderátor
Příspěvky: 6103
Registrován: 13 čer 2004, 00:00
Bydliště: Břeclavsko
Kontaktovat uživatele:

#17 Příspěvek od jezevec »

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é.
Uživatelský avatar
jezevec
Hlavní moderátor
Příspěvky: 6103
Registrován: 13 čer 2004, 00:00
Bydliště: Břeclavsko
Kontaktovat uživatele:

#18 Příspěvek od jezevec »

Tady máš zapojení a funkční program, můžeš si doplnit ošetření tlačítek proti zákmitům.

Obrázek

;*****************************************************************************
;
; 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

#19 Příspěvek od PPavel »

Dobre, tlacitka i LED proti zemi... to zatim chapu. Jak se to potom projevi na programu, kdyz to budu mit zapojeny misto na +5V na ZEM?

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
Uživatelský avatar
jezevec
Hlavní moderátor
Příspěvky: 6103
Registrován: 13 čer 2004, 00:00
Bydliště: Břeclavsko
Kontaktovat uživatele:

#20 Příspěvek od jezevec »

Dal jsem ti ten program v asm na upload, abys sis ho mohl nahrát do MPLABu, je tam přeci jenom přehlednější.
S těmi tranzistory je to jednoduché
Obrázek
PPavel

#21 Příspěvek od PPavel »

Diky moc, zkusim to predelat a uvidim
Uživatelský avatar
ViPali
Příspěvky: 524
Registrován: 21 lis 2005, 00:00
Bydliště: Bratislava

#22 Příspěvek od ViPali »

Chcel som niečo hodiť do mplabu, ale nedostal som sa k tomu. Myslím, že k jezevcovi niet čo dodať, snáď len toľko,
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

#23 Příspěvek od Návštěvník »

nieco som skusil napisat v C tak ked to niekomu pomoze , je to sice na ATMEL ale ani s PICkom by nemal byt problem mozno to niekomu pomoze

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;








Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“