Fórum témák
- • Villanyszerelés
- • Sonoff kapcsolók informatikai háttere (rendszer topológia)
- • Gázkazán vezérlő hibák
- • Li-Ion saját akkucsomag készítése
- • Audiofil, High End Audio
- • Infra távirányítás
- • Kombikazán működési hiba
- • Oszcilloszkóp, avagy hogyan kell használni?
- • WLAN router
- • Digitális mérleg
- • Forrasztópákák - melyik miért jó
- • Kapcsolóüzemű (PWM) végfok építése
- • Számítógép hiba, de mi a probléma?
- • Felajánlás, azaz ingyen elvihető
- • Li-Po - Li-ion akkumulátor és töltője
- • Muzeális készülékek-alkatrészek restaurálása
- • Westen 240 Fi gázkazán hiba
- • Akkumulátor töltő
- • Elektroncső
- • Garázskapu mozgató
- • Toroid transzformátor
- • Digitális forrasztóállomás
- • Vicces - mókás történetek
- • Autóelektronika
- • Indukciós főzőlap javítása
- • CNC építése házi alkatrészekből az alapoktól
- • Vezetékes telefon szerelés
- • Mosógép vezérlők és általános problémáik
- • Mosogatógép hiba
- • Villanymotor bekötése
- • Hegesztő inverter javítás
- • Folyamatábrás mikrokontroller programozás Flowcode-dal
- • PIC - Miértek, hogyanok haladóknak
- • Rendelés külföldről (eBay - Paypal)
- • Érdekességek
- • IMI villanymotor
- • HDMI bekötés
- • Villanypásztor
- • Páraérzékelő szenzor
- • Multiméter - miért, milyet?
- • Léptetőmotorok (vezérlése)
- • Oszcilloszkóp vétel, mit gondoltok?
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • Elektromos távirányítós kapunyitó
- • Elfogadnám, ha ingyen elvihető
- • Erősítő mindig és mindig
- • MyElecParts alkatrész kereső és készlet nyilvántartó
- • DSC riasztó
- • Klíma beszerelése, fűtés-hűtés házilag
- • Erősítő építése elejétől a végéig
- • Próbapanel (dugaszolós)
- • Kapcsolási rajzot keresek
- • Telefon és LAN hálózat kialakítása
- • Fejhallgató erősítő
- • Leválasztó transzformátor
» Több friss téma
|
Fórum » PIC programozása C nyelven, C-Compiler
Ez az, ezt kerestem..., köszi!!!
Sziasztok!
Ezt a programot szeretném UPP628-as programozóval beégetni:
#include <xc.h>
#define _XTAL_FREQ 2097120 //define crystal frequency to 20MHz
// CONFIG
#pragma config FOSC = XT // Oscillator Selection bits (RC oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define gomb RA0
int k=0;
int z=3;
int t;
int n=1;
void main() {
ADCON1 = 0x0F; //digitális bemenet és nem analóg
TRISB = 0x00; //Port-B as Output
TRISA = 0x01; //RA as input
T1CON = 0x30; //Timer beállítás. ki kell számolni 1 sec alatti m?veletek számát: XTAL_FREQ/4/Prescaler= 1 sec alatti m?veletszám
// megszakítások beállítása
/* PIE1bits.TMR1IE=1; // Timer1 megszak. engedélyezés
PIR1bits.TMR1IF=0; // Timer1 megszakításjelz? törlése
INTCONbits.PEIE=1; // periféria megszak. engedélyezés
INTCONbits.GIE=1; */ // globális megszak. engedélyezés
// TMR1H=0x0B; Feltöltés 16 bit-es timernél a fels? és als? 8 bitet külön adjuk meg. Vagy hexadec vagy rendes számmal.
//TMR1L=0xDB; Innen fog indulni egyesével felfelé a számláló és FFFF-nél túlcsordul, akkor indul 0-ról vagy újabb feltöltésnél onnantól
//TMR1=3035;
T1CONbits.TMR1ON=0; //Timer nem indul
PIR1bits.TMR1IF=0; //Nincs túlcsordulva
while (1)
{
if (gomb==1)
{
__delay_ms(300);
if (gomb==1)
{__delay_ms(2000);
if (gomb==1)
{ PORTBbits.RB6=1;
__delay_ms(1000);
PORTBbits.RB6=0;
__delay_ms(1000);
PORTBbits.RB6=1;
// T1CONbits.TMR1ON=1;
z=0;
while (n)
{__delay_ms(1000);
// if (PIR1bits.TMR1IF==1) //ha túlcsordult
// { PIR1bits.TMR1IF=0;
z=z+1;
if (gomb==1) {n=0;}
}
// T1CONbits.TMR1ON=0;
PORTBbits.RB6=0;
}
n=1;
}
PORTBbits.RB3=1;
T1CONbits.TMR1ON=1;
k=0;
while (k<z+2)
{
if (PIR1bits.TMR1IF==1) //ha túlcsordult
{ PIR1bits.TMR1IF=0;
k=k+1;}
if (k==1)
{
PORTBbits.RB5=1;
}
if (gomb==1)
{PORTBbits.RB5=0;}
if (k==z+1)
{
PORTBbits.RB5=0;
}
if (k==z+2)
{
PORTBbits.RB3=0;
}
}
T1CONbits.TMR1ON=0;
}
}
}
A program szépen lefordult, az égetés után azt írja "Konfig word hiba".
Az ellenőrzésre pedig ezt:
"Kód hiba itt:0x0000 Kiolvasva 0x3FFF, ellenőrizva: 0x2FF2"
Mi lehet az oka?
Köszönöm!
Nem ismerem ezt a programozót... Ha csinálsz egy törlést és utána visszaolvasod, akkor mi van a config word-ben?
Töröltem, majd visszaolvastattam és mindenhol 3FFF szerepel. 0x2007:3FFF.
Próbáld ki hogy a konfigokat végig kikommenteled, újrafordítod, akkor így besül-e...
Esetleg utána egyesével visszarakod a konfig sorokat és mindig próbálsz egyet sütni...
Minden verzióra ugyanez a hibaüzenet jön...
Másik programozóval meg kellene próbálni, akkor kiderül hogy a pic, vagy az égető/sw a rossz
Köszönöm. Egy 10 perces ki/bekapcsolással most hibátlanul lefutott.
Most próbapanelen próbálom, de teljesen másképp működik, mint a program. 3 db 1,5 V-os elemről táplálom, stabil 4,71 V. Lehet, hogy kevés?
Vagy lehet, hogy a próbapanel nem mindig érintkezik biztosan? Vagy kipurcant a PIC?
Ha a kapcsolót be se kapcsolom, akkor is van a 9. kimeneten feszültség. Hol 3,8 V, hol 0 V, ingadozik.
Húzd fel a bemenetet 1 - 10 kΩ-os ellenállással. 4.71 V-nak bőven elégnek kell lennie.
És gondolod, hogy ezzel a zűrzavaros működés meg is oldodna?
Egyébként 4k7 ellenállással fel van húzva.
Ha a PIC rossz, akkor már az égetés ellenőrzésekor felmerül hiba, vagy előfordulhat olyan is, hogy hibátlanul beég a szoftver, de fizikailag mégis hibás a PIC?
Nem közöltél kapcsolási rajzot, az ilyen hibás működések egyik alapja általában az, hogy lebeg a bemenet.
Ha a programozáshoz használt lábak működnek, attól még a kontroller egyik-másik portja lehet hibás.
Egyszerűsítsd le a programot a végletekig. Ha a bemenet magas, a kimenet is magas, ha a bemenet alacsony, a kimenet is. Ezzel ellenőrizhető egy ki- és bemenet páros.
Köszönöm! Ez önmagában is egyszerű volna, ha egy nyomógombot benyomunk, akkor meghúz egy relé tranzisztoron keresztül, majd 1 s után egy másik relé is meghúz. Utána kikapcsol a második relé, majd az első is. Ha hosszan nyomjuk a nyomógombot, akkor egy LED világít.
De nem működik, ezért leegyszerűsítettem egy nyomógombra és egy LED-es kimenetre, amit az első relé helyére tettem. De gombnyomás nélkül is világít a LED, hol erősebben, hol kevésbé. Ahogy a programban is látszik csak egy bemenetet hagytam bemenetnek, a többi kimenet. A nyomógombot bekötöttem a bemenetet (RA0) és + 5V-ra közé, és a földet összekötöttem a bemenettel 4k7 ellenálláson át.
Valószínű kuka a kontroller?
Ettől sokkal egyszerűbb programot készíts, a feltöltött eléggé zavaros. if (gomb==1) {
PORTBbits.RB6=1;
}
else {
PORTBbits.RB6=0;
}
Sziasztok!
CRC32 -t próbálok ellenőrizni pic24 -el, de nem kapok jó eredményt.
Az adatokat, és a CRC -t ellenőriztem egy webes crc generátorral, ott jó eredményt kapok. De a C kódom valahol hibás, nem találom hogy mi a baj vele.
byte testByteArray[177] = {0x82, 0x81, 0x80, //Header
0x54, //Lenght
0x00, 0x00, 0x00, 0x32, 0x03, 0xE8, 0x00, 0xC8, 0x03, 0x20, 0x06, 0x23, 0x06, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D,
0xC6, 0x00, 0x00, 0x0D, 0xCA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x1B, 0x00, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7,
0x00, 0x32, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x53, 0x0F, 0x47, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x08, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
0x69, 0x7A, 0xA6, 0x51}; //CRC32
//uLong CRC_POLYNOM = 0xEDB88320;
uLong CRC_POLYNOM = 0x04C11DB7;
//uLong CRC_POLYNOM = 0x82608EDB;
//uLong CRC_POLYNOM = 0xDB710641;
uLong crc = 0;
uLong RecCrc =
(((uLong)(testByteArray [172]) << 24) & 0xFF000000) |
(((uLong)(testByteArray [173]) << 16) & 0x00FF0000) |
(((uLong)(testByteArray [174]) << 8) & 0x0000FF00) |
((uLong)(testByteArray [175]) & 0x000000FF);
int i = 0;
for (i = 0; i < 173; i++)//172
{
crc = crc ^ testByteArray[i];
int j = 0;
for (j = 0; j < 8; j++)
{
if (crc & 0x0001) crc = (crc >> 1) ^ CRC_POLYNOM;
else crc = (crc >> 1);
}
if ((crc == RecCrc) && (RecCrc != 0))
{
Nop(); //Csak teszt, ha bárhol egyezés lenne...
}
}
A csatolt kép kijelölt sorában látszik, hogy kijön a helyes 0x697AA651 ellenőrző kód, de nekem nem sikerül ezt az eredményt kapnom.
Szia,
A tömböd nem 177 hanem 176 hosszú. A rekord CRC-t a 172-175 index-ekről olvasod.
Ezt javítva meg, kicsit más algoritmust használva működik:
byte testByteArray[176] = {0x82, 0x81, 0x80, //Header
0x54, //Lenght
0x00, 0x00, 0x00, 0x32, 0x03, 0xE8, 0x00, 0xC8, 0x03, 0x20, 0x06, 0x23, 0x06, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D,
0xC6, 0x00, 0x00, 0x0D, 0xCA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x1B, 0x00, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7,
0x00, 0x32, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x53, 0x0F, 0x47, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x08, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
0x69, 0x7A, 0xA6, 0x51}; //CRC32
uLong CRC_POLYNOM = 0xEDB88320;
//uLong CRC_POLYNOM = 0x04C11DB7;
//uLong CRC_POLYNOM = 0x82608EDB;
//uLong CRC_POLYNOM = 0xDB710641;
uLong mask;
uLong crc = 0xFFFFFFFF;
uLong RecCrc =
(((uLong)(testByteArray [172]) << 24) & 0xFF000000) |
(((uLong)(testByteArray [173]) << 16) & 0x00FF0000) |
(((uLong)(testByteArray [174]) << 8) & 0x0000FF00) |
((uLong)(testByteArray [175]) & 0x000000FF);
int i = 0;
for (i = 0; i < 172; i++)//172
{
crc = crc ^ testByteArray[i];
int j = 0;
for (j = 0; j < 8; j++)
{
mask = -(crc & 1);
crc = (crc >> 1) ^ (CRC_POLYNOM & mask);
}
}
crc = ~crc;
printf("CRC=%8.8X\n", crc);
printf("Rec CRC=%8.8X\n", RecCrc);
if ((crc == RecCrc) && (RecCrc != 0))
{
printf("OK\n");
}
else {
printf("NOT OK\n");
}
Sziasztok!
Valaki próbálta már UART-nál Asynchronous Address Mode-t. Úgy olvastam, ha 9. bit be van állítva, akkor címet vár ellenőrzi is, hogy helyes-e a cím, ha pedig 0 a 9. bit akkor adatot vár. Viszont csak akkor fogadja az adatot, ha előtte a cím egyezett az előre beállított címmel. Én most egy raspberry-ről küldök neki adatot, de úgy veszem észre, bármi amit elküldök neki, azt ő beolvassa, akkor is ha rossz címmel küldöm ki. Esetleg van valakinek erre ötlete, mit ronthatok el? ( PIC18F26K83, az rpi-nél meg a paritást bitet billentgetem,hogy éppen címet v adatot küldök.)
Jó lenne kicsit konkrétabbá tenni a kérdést.
Csatolj egy ábrát (szkóp / logikai analizátor), hogy mit küldött a Pi és azt minek értelmezte a PIC (nyilván ez utóbbiról nem kell ábra, elég ha leírod).
Egy számot(címet) és egy karakter sorozatot küldök a PI-ről és azt egy az egyben beolvasom UART-on és ki is küldöm UART-on, amit a PI beolvas és kiírja konzolon. A cím és minden karakter úgy ahogy van visszajön a PI-re, akkor is ha rossz címmel kezdem. Ugye ha rosszul értelmezne bármit is, akkor végképp nem kéne beolvasnia semmit. A hozzászólás módosítva: Szept 21, 2021
Délutánra tudok csak csinálni szkóp képet. Viszont addig segítenél, az miben fog előre elvinni, mit kell majd keresnem rajta?
Az első kép az cím byte (0x01) a második az adat (0x06) és 115200 a baudrate.
Szerettem volna látni, hogy valóban megvan a 9 bit.
Szélesebb képen jobban lehetne látni, így eléggé találgatósba mondom, de én leginkább start bit + 8 adat bitet látok a képeken. Nem tudom mit gondolsz erről?
(Csak az ábra miatt):
http://esd.cs.ucr.edu/labs/serial/serial.html
Szia!
Próbáltam szélesebb képeket csinálni és kijelölni mettől-meddig tarthat a jel. Elővettem egy másik PIC-et, ahol ugyanúgy beállítottam a 9bit-es módot és kiküldtem először egy address-t aztán egy data-t ezek láthatók a képeken, őszintén szólva, én először analizálok így UART jelet, de ahogy számoltam szerintem itt már meg van a 11bit(9+start+stop). Közben elég érdekes dolgot tapasztaltam, ha nem küldök ki cím byte-ot csak adatot, akkor a vevő PIC nem fogadja az adatokat, viszont ha kiküldtek bármilyen cím byte-ot mindegy, hogy egyezik-e a beállított vevő címmel, utána elkezdi fogadni a bejövő adat byte-okat. A datasheet erre vonatkozó részéről nekem az jön le, hogy a cím byte ellenőrzése hardware-esen történik, szóval most ötletem sincs, hogy mit lehetne ezzel kezdeni
Nah nem szóltam, világos a datasheet csak én vagyok sötét. A 2 PIC között sikeresen működik, rossz címnél eldobja az adatot. Már csak az RPI-ből kell értelmes jelet kicsikarnom és akkor működnie kéne azzal is. Köszönöm a segítségedet.
Nem ismerem az RPI-nek a soros port kezelését, de C#-ban "nem" tudsz 9 bites átvitelt csinálni a soros porton.
Pontosabban, tudsz csak a controller-ektől eltérően, C#-ban úgy lehet megoldani, hogy nem cím bit van hanem paritás bit, mikor címet küldesz mark (mindig '1') paritást kell állítani, mikor adatot akkor space-t (mindig '0').
|
|