Fórum témák
- • Hűtőgép probléma
- • Borhűtő vezérlő panel
- • Érdekességek
- • Vicces - mókás történetek
- • Felajánlás, azaz ingyen elvihető
- • LED-es index
- • Szünetmentes táp javítása, élesztése
- • A műhely (bemutató topik, ahol az alkotások készülnek)
- • Arduino
- • Teljesítmény -LED, powerLED (pl. Cree, Luxeon) vezérlése
- • Autóriasztó és központi zár
- • Audiofil, High End Audio
- • Számítógép hiba, de mi a probléma?
- • Menetszámolós tekercselőgép házilag
- • LED-es világítás
- • Kombikazán működési hiba
- • Biciklilámpa / bringalámpa
- • Parkside akkuk javìtása
- • Aszinkron motorok tekercselése
- • Erősítő mindig és mindig
- • Tranzisztorok helyettesítése
- • Elektromos távirányítós kapunyitó
- • Analóg oszcilloszkóp javítása
- • Szárítógép problémák
- • Li-Po - Li-ion akkumulátor és töltője
- • Kazettás magnó (deck) javítása
- • Opel Astra elektromos hibák
- • Fejhallgató erősítő
- • DSC riasztó
- • Forrasztási 1×1 forrasztástechnikai miértek
- • Elfogadnám, ha ingyen elvihető
- • Villanyszerelés
- • Orsós magnók
- • HESTORE.hu
- • Mosógép vezérlők és általános problémáik
- • Rendelés külföldről (eBay - Paypal)
- • Függvénygenerátor építése
- • Suzuki Swift elektronika
- • Autós erősítős kérdések, problémák
- • USB 3.2 HUB modul
- • GPS GSM modulok programozása
- • Rádió adó építése
- • Klíma beszerelése, fűtés-hűtés házilag
- • Oszcilloszkóp vétel, mit gondoltok?
- • Alternativ HE találkozó(k)
- • Mozgásérzékelős lámpa
- • Mosogatógép hiba
- • Napelem alkalmazása a lakás energia ellátásában
- • Eberspacher állófűtés javítása
- • Sprint-Layout NYÁK-tervező
- • Rádióamatőrök topikja
- • Westen 240 Fi gázkazán hiba
- • Léptetőmotorok (vezérlése)
- • Nagy áramú pwm vezérlő építése
- • Videoton RT7300S
» Több friss téma
|
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Szia!
Mint előbb is írták, valószínűleg szoftveres lesz a hiba. Esetleg a kvarc vagy kondi nem érintkezik rendesen, az nálam is okozott ilyet. De ha ezek rendben vannak, akkor a programban lesz a hiba.
Timer0-ra van megszakítás beállítva. Ha megszakítás generálódik, akkor növelem a másodpercet. Ebben nincs mit nagyon elrontani, nem?
Gondolom ASM. Másold be a megszakító rutint.
C
void interrupt INT(void)
{
if(PIR1bits.TMR1IF == 1)// Display Handle
{
switch(DisplayCounter)
{
case 0:
{
SEGMENT1 = 0;
DISPLAY = Numbers[MinuteLow];
SEGMENT4 = 1;
break;
}
case 1:
{
SEGMENT4 = 0;
DISPLAY = Numbers[MinuteHigh];
SEGMENT3 = 1;
break;
}
case 2:
{
SEGMENT3 = 0;
DISPLAY = Numbers[HourLow];
SEGMENT2 = 1;
break;
}
case 3:
{
SEGMENT2 = 0;
DISPLAY = Numbers[HourHigh];
SEGMENT1 = 1;
break;
}
}
DisplayCounter++;
TMR1H = 255;
TMR1L = 100;
if (DisplayCounter ==4) DisplayCounter = 0;
PIR1bits.TMR1IF = 0;
}
if (INTCONbits.T0IF == 1) //Clock Handle
{
SecondLow++;
if (SecondLow == 10)
{
SecondLow = 0;
SecondHigh++;
}
if (SecondHigh == 6)
{
MinuteLow++;
SecondHigh = 0;
}
if (MinuteLow == 10)
{
MinuteLow = 0;
MinuteHigh++;
}
if (MinuteHigh == 6)
{
HourLow++;
MinuteHigh = 0;
}
if (HourLow == 10)
{
HourLow = 0;
HourHigh++;
}
if ((HourHigh == 2) && (HourLow == 4))
{
HourHigh = 0;
HourLow = 0;
}
INTCONbits.T0IF = 0;
}
}
A TMR0 hogy van beállítva ? Ha jól számoltam, akkor a 32768 Hz az 65536-os osztásnál 2s-os periódusidőt ad !?
256-os előosztás van beállítva. Amit furcsálok is, mert én úgy számoltam, hogy 32768/4 = 8192. Amit 32-es osztóval beállítva kijön az 1Sec, de mégsem így történik. És nem értem miért.
Hogy hajtod a Timer0-t? Mert neki nincs belső oszcija, tehát nem tud külső kvarcról menni, csak stabil négyszögjelről (T0CKI). Tehát a Timer0-t közvetlenül nem lehet külső kvarcról hajtani. Viszont a Timer1-et igen. Tehát a Timer1 megszakításba kell rakni az időléptetést, és a Timer0-ba a kijelzést, és akkor mehet az idő külső kvarcről.
Hogy vannak beállítva a timer regiszterek?
Belső órajerről hajtom a TIMER0-t. Akkor a FOSC/4 az órajele ha jól tudom.
De itt az egész kód:
#include <pic.h>
__CONFIG (WRT_OFF & WDTE_OFF & CP_OFF & FOSC_XT & PWRTE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & CP_OFF & DEBUG_ON);
#define _XTAL_FREQ 32768
//7Segment display PIN
#define a PORTDbits.RD0
#define b PORTDbits.RD1
#define c PORTDbits.RD2
#define d PORTDbits.RD3
#define e PORTDbits.RD4
#define f PORTDbits.RD5
#define g PORTDbits.RD6
#define DISPLAY PORTD
//7Segment display Numbers
unsigned char Numbers [] = {0b01000000,
0b01111001,
0b00100100,
0b00110000,
0b00011001,
0b00010010,
0b00000010,
0b01111000,
0b00000000,
0b00010000};
unsigned char DisplayCounter = 0; //Wich display switch on
//7Segment display Select
#define SEGMENT1 PORTCbits.RC4
#define SEGMENT2 PORTCbits.RC5
#define SEGMENT3 PORTCbits.RC6
#define SEGMENT4 PORTCbits.RC7
unsigned char SecondLow = 0;
unsigned char SecondHigh = 0;
unsigned char MinuteLow = 0;
unsigned char MinuteHigh = 5;
unsigned char HourLow = 0;
unsigned char HourHigh = 2;
void init(void)
{
OPTION_REG = 0b00000111;
INTCON = 0b11100000;
T1CON = 0b00000101;
PIE1bits.TMR1IE = 1;
TRISD = 0b00000000;
TRISC = 0b00000000;
PORTC = 0;
}
int main ()
{
init();
while(1)
{
NOP();
}
}
void interrupt INT(void)
{
if(PIR1bits.TMR1IF == 1)// Display Handle
{
switch(DisplayCounter)
{
case 0:
{
SEGMENT1 = 0;
DISPLAY = Numbers[MinuteLow];
SEGMENT4 = 1;
break;
}
case 1:
{
SEGMENT4 = 0;
DISPLAY = Numbers[MinuteHigh];
SEGMENT3 = 1;
break;
}
case 2:
{
SEGMENT3 = 0;
DISPLAY = Numbers[HourLow];
SEGMENT2 = 1;
break;
}
case 3:
{
SEGMENT2 = 0;
DISPLAY = Numbers[HourHigh];
SEGMENT1 = 1;
break;
}
}
DisplayCounter++;
TMR1H = 255;
TMR1L = 100;
if (DisplayCounter ==4) DisplayCounter = 0;
PIR1bits.TMR1IF = 0;
}
if (INTCONbits.T0IF == 1) //Clock Handle
{
SecondLow++;
if (SecondLow == 10)
{
SecondLow = 0;
SecondHigh++;
}
if (SecondHigh == 6)
{
MinuteLow++;
SecondHigh = 0;
}
if (MinuteLow == 10)
{
MinuteLow = 0;
MinuteHigh++;
}
if (MinuteHigh == 6)
{
HourLow++;
MinuteHigh = 0;
}
if (HourLow == 10)
{
HourLow = 0;
HourHigh++;
}
if ((HourHigh == 2) && (HourLow == 4))
{
HourHigh = 0;
HourLow = 0;
}
INTCONbits.T0IF = 0;
}
}
Valamit nem jól számolsz... 4/32768 --> kb. 122 us , ez a léptetési órajeled ideje. Ebből kell 65536 db, hogy megszakításod legyen --> 8 s ( az OPTION alapján 256-os az osztód ! ) ! Ez azt jelenti, hogy 8 s alatt számolna neked 1 -et !
szerk.:
Idézet: „#define _XTAL_FREQ 32768” Ezt magadnak írtad ? A hozzászólás módosítva: Szept 29, 2013
Nem félreértelmezel valamit ? Ha 32768-as kvarcról működteted a PIC-et, akkor az XT beállítás nem jó ! A hozzászólás módosítva: Szept 29, 2013
De a TIMER0 az csak 8 bites ennél a PIC-nél, nem 16! Vagy miért számolsz 65536-al?
Akkor mire kell állítani, ha nem XT?
Itt valaki nagyon nem kerek.
Bár még nem teljesen világos, hogy akkor hol is van a kvarc, és milyen frekvenciájú?!
Ha a főoszcinak raktál be 32.768kHz-es kvarcot, akkor a megszakítás 32768/4/256/256 = 0.125Hz lenne, vagyis minden 8. másodpercben léptetné csak a másodperc változót.
De a főoszciról egyébként nem érdemes járatni óraalapot.
Ha tényleg FOSC-nak raktad be ezt a kvarcot, akkor a konfigbiteknél XT helyett LP-t kell beállítani (lehet ez okozza a hibát).
LP beállítás kell, zenetom jól írta ezen a frekin!
Azért írtam 65536-ot, mert 256-os ( 8 bit ! ) előosztót állítottál a 8 bites regiszterhez, ami összesen 16 bitesnek felel így meg !
32768 a kristály igen, ezért nem értem hogy miért kellett 256-os osztó, mikor 32-es kellene. De akkor átálítom LP-re, és kiderül mi lesz. Aztán áttervezem akkor külön órajelforrásra.
A TMR1 alkalmas erre a feladatra. Van neki oszcija direkt erre a frekire. Es az meg 16 bites is. Masik: Az IT rutinban ne tartozkodj sokaig mert igy sohasem lesz pontos orad. Jelzobitek allitasaval a foprogramban kell elvegezni a szamitasokat.
Rendben, köszi! Akkor átírom azt is!
Idézet: „Az IT rutinban ne tartozkodj sokaig mert igy sohasem lesz pontos orad.” Szerintem ez most nem gond, mert a hardver simán számol, nem kell "előretekerni" a számlálót , de általában igaz !
Én is így gondoltam, ezért írtam a interruptba.
Idézet: „Azért írtam 65536-ot, mert 256-os ( 8 bit ! ) előosztót állítottál a 8 bites regiszterhez, ami összesen 16 bitesnek felel így meg !”
Erre nem is gondoltam már így késő este
Na tényleg az volt a baj, hogy nem LP-n volt, hanem XT-n. Nem is gondoltam volna, hogy ennyit számít. Mindíg tanulok valami újjat Mostmár az elősztót is 32-re állítottam, és jól számol.
Egyébként majd szeretnék DFC77-es vevőt hozzá, így annyira nem lényeg, ha naponta pár másodpercnyit késne...
Köszönöm a segítséget!
!
Mondtam én.
Tegnap este óta megy, nem veszem észre rajta, hogy késik vagy siet bár másodpercet azt még nem látok. úgyhogy király a cucc
Hello!
Van egy PIC16F690, ICSP-n programozva.
#include <xc.h>
#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Selection bits (BOR enabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
void main(void)
{
OSCCON=0b1100001;
ANSEL=0x00;
ANSELH=0x00;
TRISA=0x06;
TRISB=0x70;
TRISC=0x07;
while(1)
{
if (PORTBbits.RB6==0) // 1-es csatorna
{
if (PORTBbits.RB7==1)
{
PORTBbits.RB7=0;
}
else
{
PORTBbits.RB7=1;
}
while (PORTBbits.RB6==0)
{
delay(1000);
}
}
else
{
;
}
ifek..... minden bemenet-kimenet párra.
RB6->RB7
RB5->RC7
RB4->RC6
RC2->RC3
RC1->RC4
RC0->RC5
RA2->RA4
RA1->RA5
A bal oldal bemenet, a jobb oldal kimenet.
Ha a fenti konfig alapján bekapcsolom a kimenetek magasak, és a hozzájuk tartozó bemenetekkel tudom őket kapcsolgatni.
Ha nullázom a portokat, tehát odaírok még egy PORTA=0,PORTB=0,PORTC=0 a TRIS után akkor az RC6 kimenet magasan indul el, és kapcsolgatni se tudom, mert csak addig marad alacsony a kimenet amíg a hozzá tartozó bemenetet alacsonyan tartom. Mit hagytam ki?
Megvan, elírtam egy összekapcsolást.
Kérdés. Egy tápról működő PIC és relék esetén ki tudom eléggé szűrni valahogy a tápot, hogy 9 relé(9*100mA) egyszerre kapcsolása ne resetelje a PIC-et? A hozzászólás módosítva: Szept 30, 2013
Dioda-pufferkondi kombo a PIC tapjaban?
Dióda még nincs, pufferkondi is csak a főtápon van a 7805 után, még azt is növelem. Mekkora puffer lehet elég a PIC tápra, és a diódát hová kéne tennem konkrétan és hogyan?
Sziasztok
Egy matematikai pardoxonban kovájgok és nem találok ki. Milyen egyenlettel tudnék byte-ot átszámolni "0x"és hex stringre?
Szia!
Egy lehetőség: először is csinálsz egy 16 elemű karakter tömböt [0..9, A, B.. E, F] (tehát itt a számok ASCII kódját tárolod!).
Aztán szétválasztod az átszámolandó számot két 4bites számra, és ezeket a számokat felhasználod tömb indexként. Tehát legyen mondjuk a (decimálisan) 91 (0101 1011). A felső 4 bit értéke 5, vagyis hozzárendelet a tömb 5. elemét (a 0. elem a 0!), ez 5.
Ezután veszed az alsó négy bitet, ez 11. A tömb 11. eleme a "B" lesz. Összeolvasva: 5B.
Ha erre gondoltál...
Nem tudom, nem teljesen. Legalábis azt gondoltam, hogy van valami egyszerü számitás mert ez nekem teljesen idegen. Vagyis értem csak a kivitelezéssel van bajom.
Igazábol flowcode-ban szeretnék számolni de nem teljesen tiszta a dolog. A hozzászólás módosítva: Szept 30, 2013
|
|