Fórum témák
- • Elfogadnám, ha ingyen elvihető
- • Kenyérpirító nem kapcsol ki időben
- • Klíma szervizelés, javítás
- • Gázkazán vezérlő hibák
- • MyElecParts alkatrész kereső és készlet nyilvántartó
- • ZC-18 kazán
- • Erősítő mindig és mindig
- • IPTV, azaz, TV-zés internet szolgáltatón keresztül
- Varrógép lassulás
- • Szobatermosztát bekötése
- • Karácsonyi fényfüzérek
- • Videoton EA 6383 s (tuning)
- • Kombikazán működési hiba
- • Villanyszerelés
- • Indukciós főzőlap javítása
- • Audiofil, High End Audio
- • Felajánlás, azaz ingyen elvihető
- • Vicces - mókás történetek
- • Hegesztő inverter javítás
- • Sprint-Layout NYÁK-tervező
- • Hibrid erősítő
- • Tápegységgel kapcsolatos kérdések
- • Lemezjátszó beállítása, javítása
- • Kerámialapos tűzhely
- • ESP32 bootloader
- • Androidos okos telefonok
- • WiFi / WLAN alapkérdések
- • LCD TV probléma
- • PIC - Miértek, hogyanok haladóknak
- • Arduino
- • PC táp javítása
- • STK erősítők javítások
- • Dióda helyettesítés
- • Szárítógép problémák
- • Vásárlás, hol kapható?
- • Leválasztó transzformátor
- • Autós erősítős kérdések, problémák
- • Elektromos távirányítós kapunyitó
- • NYÁK-fólia rendelés
- • Akkumulátor töltő
- • Kikapcsolás késleltető
- • Li-Ion saját akkucsomag készítése
- • Hőkioldó bekötése áramkörbe
- • SMD forrasztás profin
- • Tesla tekercs építése
- • Vezetékes telefon szerelés
- • Néhány wattos szünetmentes tápegység
- • Suzuki Swift elektronika
- • Ponthegesztő készítése házilag
- • Digitális forrasztóállomás
- • Parkside akkuk javìtása
- • Transzformátor készítés, méretezés
- • Akkumulátoros fúró
- • Szilárdtest relé
- • Kompresszor építés (levegő)
» 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.
Továbbá:
- Ha egy módosítható (Peripheral Pin Select) lábat kétirányú funkcióra (pl. I2C vonalnak) használunk fel, mind a kimeneti mind a bemeneti beállítást el kell végezni (a digitálissá állításon kívül).
Egy egész litániát írtunk, de csak ennyi maradt a sárga mezőben.
Kijavítottam erre :
if (pp < PUFF_SIZE)
{ puffer[pp++]= UART1_Read(); // Get received byte
if (pp < 20){puffer[pp] = 0;}
}
Mellékeltem egy képet a kimenetről. Megduplázza a választ.
Akkor az rx és tx lábat be és kimenetre kell állítanom ? Így?
TRISB.F1 = 1; // RB1 RX
TRISB.F2 = 0; // RB2 TX
A hozzászólás módosítva: Jún 5, 2019
Típustól függ a beállítás. ld. Adatlap (E)USART fejezet.
18F252: TRISC7 = 1; TRISC6 = 0;
18F2550:TRISC7 = 1; TRISC6 = 1;
Ez egy 16f628A , megnéztem az adatlapját, de én nem találom benne.
Adatlap
TX9: 9-bit Transmit Enable bit van , de hogy kimenet vagy bemenetre hogyan állítom , nem látom.
Jah , de :
Idézet: „1.TRISB<1> and TRISB<2> should both be set to‘1’ to configure the RB1/RX/DT and RB2/TX/CKpins as inputs. Output drive, when required, iscontrolled by the peripheral circuitry”
Ezek szerint akkor a tx kimenet és rx bemenetre van állítva. A hozzászólás módosítva: Jún 5, 2019
Na most kinulláztam a tömb összes elemét :
#define PUFF_SIZE 6
if (UART1_Data_ready())
{
if (pp < PUFF_SIZE)
{
puffer[pp++]= UART1_Read(); // Get received byte
if (pp < 20)
{
puffer[pp] = 0;
}
}
// Bekapcsolás
if(strstr(puffer, on_cm))
{
UART1_Write(13);
UART1_Write_text("Bekapcs.");
UART1_Write(13);
PORTB.F7 = 1;
puffer[0] = 0;
puffer[1] = 0;
puffer[2] = 0;
puffer[3] = 0;
puffer[4] = 0;
puffer[5] = 0;
pp = 0;
}
//Kikapcsolás
if(strstr(puffer, off_cm))
{
UART1_Write(13);
UART1_Write_text("Kikapcs.");
UART1_Write(13);
PORTB.F7 = 0;
puffer[0] = 0;
puffer[1] = 0;
puffer[2] = 0;
puffer[3] = 0;
puffer[4] = 0;
puffer[5] = 0;
pp = 0;
}
}
De változatlan a helyzet. A hozzászólás módosítva: Jún 5, 2019
8 bitről váltáskor szerintem az esetek többségében mindenki így van.
A 16 és 32 bites PIC-ek doksijában sosincs részletekbe bele menő leírás a reference manual ban találsz mindig részletesebb leírást adott esetben example-t.
Viszont ha nézted az UART-os reference manual-t egy szó sincs erről benne, mivel ez nem az UART része hanem a PPS-é (IO).
Section 12. I/O Ports with Peripheral Pin Select (PPS) doksiban található egy ilyen szekciót:
Idézet: „
When a remappable peripheral is active on a given I/O pin, it takes priority over all other digital
I/O and digital communication peripherals associated with the pin. Priority is given regardless of
the type of peripheral that is mapped.Remappable peripherals never take priority over any
analog functions associated with the pin.”
Érdemes (teljes,projet) example-t keresni rengeteg ilyen időhúzó dolgot elkerülhetsz.
A másik lehetőség MCC-vel vagy Harmony-val (32 bit) generáltatni egy kódot és megnézni az initet sokat segíthet. A hozzászólás módosítva: Jún 5, 2019
(#) |
c27 hozzászólása |
Jún 5, 2019 |
|
/ |
|
|
Sziasztok!
Egy 18F4431-nél elakadtam ott, hogy 2 ADC csatornát akarok beolvasni, de sehogy se sikerül.
Beállítom a Multi-Channel Mode bit ACSCH 1-re. Minden más alapon. Az ADCON1 0-1 bitjét próbálom állítgatni, de sehogy se jövök rá, hogy lehet a 2 csatorna értékeit 2 külön változóba beírni.
Csak 1 csatorna olvasása működik, de multi channel már nem. Az Adatlapba se tudok elmenni, hogy mikor és hogy lehet kiolvasni. A BFEMT bitet kéne figyelni?
ADCON0bits.ADON = 1; //ADC ENEABLE
Delay10TCYx(3); //WAIT 3uSEC
ADCON0bits.GODONE = 1; //ADC START
while(ADCON0bits.GODONE); //WAITING FOR ADC FINISHED
ADCON0bits.ADON = 0;
ADCON1bits.ADPNT0=0;
ADCON1bits.ADPNT1=0;
ADC_ACT=ADRESH;
ADC_ACT<<=8;
ADC_ACT+=ADRESL;
Így mindig a 2. csatorna értékeit írja bele a változóba. Nem tudom, hogy lehetne lépkedni a kettő között.
És az I2C-vel ezt nem is teheted meg mindig 8 biten PPS-el van felette még nem láttam olyat ami I2C-re PPS-el lenne maximum átváltható egy másik kijelölt alternatív lábra A hozzászólás módosítva: Jún 5, 2019
Közbe megtaláltam a hibát a Buffer nem volt engedélyezve.
Mázlista
Kiragadtad a lényeget....
16 és 32 bites kontrollereken is be kell állítani ilyen esetben a lábat bemenetnek is és kimenetnek is.
Ezenkívül megjelent, kapható a 8 bites 18F2xK42, 18F4xK42, amiken az adatlap (DS40001869C-page 265) szerint a két I2C modul vonalai átkonfigurálható (remappable) lábakon vannak.
Az strstr függvény visszatérési értéke egy char típusú mutató, nem a mutatott érték, vagy NULL pointer, ha nincs egyezőség. Ezt teszed if-be. Ring buffer-es feladat, ahogy már írták is.
Nem értem miért kell ring buffer ehhez.
Én nem fogadok és küldök egyszerre. Küldök és várom az adatot , majd ha kaptam vissza választ küldök tovább, de egyszerre nem fogadok és küldök.
( Nem mondom hogy nem lenne szebb és gyorsabb és jobb, de nekem nincs meg még a tudásom hozzá, hogy azt megcsináljam.)
Csináltam egy ilyet :
char puffer=0;
char i=0;
if (UART1_Data_Ready())
{
for(i = 0; i < 3; i++)
{
puffer[i] = UART1_Read(); // Így elméletileg lesz 0,1,2 helyem a tömbbben.
}
// Bekapcsolás rész ------------------------
if(puffer[0] == 'o' && puffer[1] == 'n')
{
UART1_Write(13);
UART1_Write_text("Bekapcs.");
UART1_Write(13);
// Puffer ürítése
puffer[0] = 0;
puffer[1] = 0;
}
// Kikapcsolás rész ------------------------
if(puffer[0] == 'o' && puffer[1] == 'f' && puffer[2] == 'f')
{
UART1_Write(13);
UART1_Write_text("Kikapcs.");
UART1_Write(13);
// Puffer ürítése
puffer[0] = 0;
puffer[1] = 0;
puffer[2] = 0;
}
}
De nem fordul le. Beolvasom a kapott karaktereket szépen sorban , 0 ás , 1 es és 2 es helyre a puffer tömbbe.
Majd karakterenként vizsgálom , hogy a várt karakterek benne vannak e az adott 0 - 1- 2 helyen.
Ha benne vannak, akkor mehet a be és kikapcs szöveg vissza válaszként és ürítem ezeket a helyeket a következő on és off parancs számára.
Idézet: „Pointer requed és Operator '' is not applicable to these operands ''” hibákat kapok a fordításkor.
Mit rontok el? A hozzászólás módosítva: Jún 5, 2019
(#) |
lóri hozzászólása |
Jún 5, 2019 |
|
/ |
|
|
Sziasztok!
A múltkori i2c-kérdésem tárgyát képező kódot csatolom.
Hátha találtok benne valami kivetnivalót.
Légyszi nézzétek meg.
Köszi:L.
// PIC24EP512GU810 Configuration Bit Settings
// 'C' source line config statements
// FGS
#pragma config GWRP = OFF // General Segment Write-Protect bit (General Segment may be written)
#pragma config GSS = OFF // General Segment Code-Protect bit (General Segment Code protect is disabled)
#pragma config GSSK = OFF // General Segment Key bits (General Segment Write Protection and Code Protection is Disabled)
// FOSCSEL
#pragma config FNOSC = PRIPLL // Initial Oscillator Source ion bits (Primary Oscillator (XT, HS, EC) with PLL)
#pragma config IESO = OFF // Two-speed Oscillator Start-up Enable bit (Start up with user-ed oscillator source)
// FOSC
#pragma config POSCMD = HS // Primary Oscillator Mode bits (HS Crystal Oscillator Mode)
#pragma config OSCIOFNC = OFF // OSC2 Pin Function bit (OSC2 is clock output)
#pragma config IOL1WAY = ON // Peripheral pin configuration (ow multiple reconfigurations)
#pragma config FCKSM = CSECME // Clock Switching Mode bits (Both Clock switching and Fail-safe Clock Monitor are enabled)
// FWDT
#pragma config WDTPOST = PS32768 // Watchdog Timer Postscaler bits (1:32,768)
#pragma config WDTPRE = PR128 // Watchdog Timer Prescaler bit (1:128)
#pragma config PLLKEN = ON // PLL Lock Wait Enable bit (Clock switch to PLL source will wait until the PLL lock signal is valid.)
#pragma config WINDIS = OFF // Watchdog Timer Window Enable bit (Watchdog Timer in Non-Window mode)
#pragma config FWDTEN = OFF // Watchdog Timer Enable bit (Watchdog timer enabled/disabled by user software)
// FPOR
#pragma config FPWRT = PWR128 // Power-on Reset Timer Value bits (128ms)
#pragma config BOREN = OFF // Brown-out Reset (BOR) Detection Enable bit (BOR is disabled)
#pragma config ALTI2C1 = OFF // Alternate I2C pins for I2C1 (SDA1/SCK1 pins are ed as the I/O pins for I2C1)
#pragma config ALTI2C2 = ON // Alternate I2C pins for I2C2 (ASDA2/ASCK2 pins are ed as the I/O pins for I2C2)
// FICD
#pragma config ICS = PGD2 // ICD Communication Channel bits (Communicate on PGEC2 and PGED2)
#pragma config RSTPRI = AF // Reset Target Vector bit (Device will obtain reset instruction Primary flash)
#pragma config JTAGEN = OFF // JTAG Enable bit (JTAG is disabled)
// FAS
#pragma config AWRP = OFF // Auxiliary Segment Write-protect bit (Aux Flash may be written)
#pragma config APL = OFF // Auxiliary Segment Code-protect bit (Aux Flash Code protect is disabled)
#pragma config APLK = OFF // Auxiliary Segment Key bits (Aux Flash Write Protection and Code Protection is Disabled)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#include <string.h>
#include <stdlib.h>
#include <p24EP512GU810.h>
#define i2c_idle() while ((I2C2CONbits.I2CSIDL) | (I2C2STATbits.R_W))
#define i2c_start() I2C2CONbits.SEN = 1; while(I2C2CONbits.SEN)
#define i2c_rstart() I2C2CONbits.RSEN = 1; while(I2C2CONbits.RSEN)
#define i2c_stop() I2C2CONbits.PEN = 1; while(I2C2CONbits.PEN)
#define i2c_ack(ackbit) I2C2CONbits.ACKDT = ackbit; I2C2CONbits.ACKEN = 1; while(I2C2CONbits.ACKEN)
#define FCY 40000000 // Instruction cycle frequency, Hz - required for __delayXXX() to work
#include <libpic30.h> // __delayXXX() functions macros defined here
#define I2C_SDA TRISAbits.TRISA3
#define I2C_SCL TRISAbits.TRISA2
#define I2C_ACK 0 //pozitív nyugtázás
#define I2C_NAK 1 //negatív nyugtázás
/* Változótípusok és uniók definiálása ******************************/
typedef unsigned char uint8; // 8 bites, el?jel nélküli szám
typedef unsigned int uint16; //16 bites, el?jel nélküli szám
typedef unsigned long uint32; //32 bites, el?jel nélküli szám
typedef signed char int8; // 8 bites, el?jeles szám
typedef signed int int16; //16 bites, el?jeles szám
typedef signed long int32; //32 bites, el?jeles szám
typedef _16 {
uint16 word;
struct {
uint8 lo_byte;
uint8 hi_byte;
} ;
} 16;
typedef _32 {
uint32 dword;
struct {
uint16 lo_word;
uint16 hi_word;
} ;
uint8 byte[4];
} 32;
16 adat2;
32 adat4;
unsigned char ee_buffer[64];
void I2C_PRG( void );
void IOSetup( void );
void ee_read( void );
void ee_read_sync( void );
void ee_write( void );
void Init( void );
void i2c_init( void );
uint8 i2c_getc( uint8 ack2send );
uint8 i2c_putc( uint8 data );
//void i2c_write1(uint8 addr,uint8 data);
void i2c_write2( uint8 addr, uint8 d1, uint8 d2 );
void i2c_writeN( uint8 addr, uint8* data, uint8 cnt );
//void i2c_read1(uint8 addr,uint8* p1);
void i2c_read2( uint8 addr, uint8* p1, uint8* p2 );
void i2c_readN( uint8 addr, uint8* p1, uint8 cnt );
void i2c_init( void ) {
I2C_SCL = 1;
I2C_SDA = 1;
I2C2BRG = 99;
OSCTUN = 0;
I2C1ADD = 0;
I2C2MSK = 0;
I2C2CONbits.SMEN = 0; /* SMBUS specifikus bemenet tiltása */
I2C2CONbits.DISSLW = 0; /* Slew rate vezérlés engedélyezve (400kHz mód) */
// I2C2CONbits.I2CSIDL = 0;
// CLKDIVbits.DOZE = 0;
// CLKDIVbits.PLLPOST = 0;
// CLKDIVbits.PLLPRE = 0;
// CLKDIVbits.FRCDIV = 0;
// Configre SCA/SDA pin as open-drain. This may change device to device.
//Refer the datasheet for more information.
// ODCAbits.ODCA2 = 1;
// ODCAbits.ODCA3 = 1;
I2C2CONbits.A10M = 0;
I2C1CONbits.SCLREL = 1;
I2C2CONbits.I2CEN = 1; // az MSSP egység engedélyezése
}
uint8 i2c_getc( uint8 ack2send ) {
i2c_idle( );
I2C2CONbits.RCEN = 1; // a master engedélyezése egy bájt vételére
while ( !I2C2STATbits.RBF ); // megvárjuk, amíg a bájt beérkezik
i2c_ack( ack2send ); // kiküldjük a nyugtázó bitet
return ( I2C2RCV ); // visszatérünk a bájttal
}
uint8 i2c_putc( uint8 data ) {
I2C2TRN = data; // kirakunk egy bájtot SSPBUF-ba
while ( I2C2STATbits.TBF ); // megvárjuk,amíg az íráslezajlik
i2c_idle( ); // megvárjuk a busz aktivitás végét
return ( I2C2STATbits.ACKSTAT ); // a nyugtázó bittel térünk vissza
}
void i2c_write2( uint8 addr, uint8 d1, uint8 d2 ) {
i2c_start( );
i2c_putc( addr & 0xFE );
i2c_putc( d1 );
i2c_putc( d2 );
i2c_stop( );
}
void i2c_writeN( uint8 addr, uint8* data, uint8 cnt ) {
uint8 i;
i2c_start( );
i2c_putc( addr & 0xFE );
for ( i = 0; i < cnt; i++ ) {
i2c_putc( *data );
data++;
}
i2c_stop( );
}
void i2c_read2( uint8 addr, uint8* p1, uint8* p2 ) {
i2c_start( );
i2c_putc( addr | 0x01 );
*p1 = i2c_getc( I2C_ACK );
*p2 = i2c_getc( I2C_NAK );
i2c_stop( );
}
void i2c_readN( uint8 addr, uint8* p1, uint8 cnt ) {
uint8 i;
i2c_start( );
i2c_putc( addr | 0x01 );
for ( i = 0; i < cnt; i++ ) {
if ( i != cnt - 1 ) *p1 = i2c_getc( I2C_ACK );
else *p1 = i2c_getc( I2C_NAK );
p1++;
}
i2c_stop( );
}
void IOSetup( void ) {
ANSELA = 0; // Minden port digitalis
ANSELB = 0;
ANSELC = 0;
ANSELD = 0;
ANSELE = 0;
ANSELG = 0;
TRISA = 0b0000000000001100; // I2C bemenetekre állítva..
TRISB = 0b0000000011111111;
TRISC = 0b1111000000000000;
TRISD = 0b0000000000000001;
TRISE = 0b0000000000000000;
TRISF = 0b0000000000000000;
TRISG = 0b0000000000001100;
PORTA = 0; // 0b0100 0110 0000 0000
PORTB = 0;
PORTC = 0;
PORTD = 0;
PORTE = 0;
PORTF = 0;
PORTG = 0;
// OSCCONbits.COSC = 0b011; //011 = Primary Oscillator (XT, HS, EC) with PLL
// OSCCONbits.NOSC = 0b011; //011 = Primary Oscillator (XT, HS, EC) with PLL
CLKDIVbits.DOZE = 0; //000 = FCY divided by 1 Processor Clock Reduction bits
CLKDIVbits.DOZEN = 0; //0 = Processor clock and peripheral clock ratio forced to 1:1
// CLKDIVbits.FRCDIV = 0b111; //000 = FRC divided by 1 (default)
CLKDIVbits.PLLPOST = 0; //00 = Output divided by 2
PLLFBDbits.PLLDIV = 38; //M40
// Initiate Clock Switch to Primary Oscillator with PLL (NOSC=0b011)
__builtin_write_OSCCONH( 0x03 );
__builtin_write_OSCCONL( OSCCON | 0x01 );
// Wait for Clock switch to occur
while ( OSCCONbits.COSC != 0b011 );
// Wait for PLL to lock
while ( OSCCONbits.LOCK != 1 );
}
void I2C_PRG( void ) {
// unsigned char c;
//write
i2c_init( );
// __delay_ms(5);
i2c_idle( );
i2c_start( );
i2c_putc( 0xA0 ); //címzés
i2c_putc( 0x00 ); // szkóppal vizsgálva csak az 0xA0 része hajtódik végre
i2c_putc( 0x00 ); // ha eléggé fel veszem az órajelet kb 1.2MHz re akkor belefér a címzés része is
// Látszólag csak 35-45 us idő keret áll rendelkezésre az íráskor.
//olyan mintha valami letiltaná a kimenetet.
i2c_putc( 0x20 ); // itt már az adat írása lenne ha menne....
i2c_putc( 0x40 );
i2c_putc( 0x30 );
i2c_putc( 0x55 );
i2c_putc( 0x34 );
i2c_stop( );
__delay_ms( 5 ); //írási folyamat kivárása
}
void ee_read( void ) {
unsigned char i, u;
u = 64;
i2c_idle( );
i2c_start( );
i2c_putc( 0xA0 );
i2c_putc( 0x00 );
i2c_putc( 0x00 );
i2c_start( );
i2c_putc( 0xA0 | 0x01 ); // eeprom-ból való olvasás egy 64 bájtos szegmens ez a rész úgytünik, hogy müködik de csak nullákat olvas
for ( i = 0; i < u; i++ ) { // mivel nem tudtam bele írni semmit
if ( i != (u - 1) ) {
ee_buffer[i] = i2c_getc( 0 );
} else ee_buffer[i] = i2c_getc( 1 );
}
i2c_stop( );
}
void ee_write( void ) {
unsigned char i, u;
u = 64;
//
// i2c_idle( );
// i2c_start( );
// i2c_putc( 0xA0 );
// i2c_putc( 0x00 );
// i2c_putc( 0x00 );
// for ( i = 0; i < u; i++ ) {
// i2c_putc( ee_buffer[i] );
// }
// i2c_stop( );
// __delay_ms(5);
}
int main( ) {
IOSetup( );
I2C_PRG(); // írnánk az epromba..
// Fo Menu
while ( 1 ) {
PORTGbits.RG15 = (!PORTGbits.RG15); // led villogtatás
__delay_ms( 50 );
}
}
Megpróbálom megcsinálni ring bufferben. Proteusban szimulálva tökéletes. Élesben viszont 1x 2x jön vissza válasz és utána rossz lesz.
Szerintetek?
#define PUFF_SIZE 3 //20 volt
// Változók beállítása
char puffer[PUFF_SIZE];
char tail = 0;
char head = 0;
char full = 0;
// Vezérlő parancsok beállítása
char off_cm[] = "off";
char on_cm[] = "one";
void main()
{
// uart init stb...
TRISB.F1 = 1; // RX bemenet
TRISB.F2 = 0; // TX kimenet
while(1)
{
if (UART1_Data_ready())
{
if (full == 1)
{
head = 0;
full = 0;
}
else
{
puffer[head]= UART1_Read(); // Get received byte
head = (head +1) % PUFF_SIZE;
if(head == tail)
{
full = 1;
}
}
// Bekapcsolás
if(strstr(puffer, on_cm))
{
UART1_Write(13);
UART1_Write_text("Bekapcs.");
UART1_Write(13);
PORTB.F7 = 1;
memset(puffer, 0, sizeof puffer);
}
//Kikapcsolás
if(strstr(puffer, off_cm))
{
UART1_Write(13);
UART1_Write_text("Kikapcs.");
UART1_Write(13);
PORTB.F7 = 0;
memset(puffer, 0, sizeof puffer);
}
}
}
}
A hozzászólás módosítva: Jún 5, 2019
Elnézést, már nem tudtam törölni, badarság az első mondat. Rosszul paramétereztem a printf-et a CodeBloks-ban.
(#) |
c27 hozzászólása |
Jún 6, 2019 |
|
/ |
|
|
Sziasztok!
Az meg lehet csinálni, hogy van egy változóm 0-127 között és ki szeretném íratni printf-el LCD-re mégpedig úgy, hogy az egyes helyi érték előtt legyen egy pont is? Az a változó lényegében pont a 10 szeresét tartalmazza a nekem kellő értéknek egy tizedespont pontossággal, csak az a fránya pontot kellene beszúrni valamilyen egyszerű módszerrel.
Igen!
Milyen program nyelven? A hozzászólás módosítva: Jún 6, 2019
C, de a változóm unsigned char és a picet sem akarok terhelgetni, ha bonyolult.
De melyik C?
Mert pl CCS-C-ben valahogy így nézne ki:
printf(lcd_putc,"TEMP: %3.1f ", temperature);
Kőbaltás megoldás: osztod tízzel, printf - eredmény, pont, maradék
Ajjaj
Eléggé furin vannak az elnevezések.Ha az I2C2-t használod,akkor mindnek legyen az a nevében,mert így könnyen belemész abba,hogy a másik I2C-nek írsz be valamit .Pl: 129. ,147. sor.
Ja,és csak while-ket annyira nem jó használni,mert megakadhat a progi,dobj mellé timert,WD-t. A hozzászólás módosítva: Jún 6, 2019
C18 fordító.
A változóm unsigned char típus esetleg lehet unsigned int, de jobb lenne ha 8 bitnél nem lenne nagyobb.
Nem tudom a fordító hogy kezelné le. Osztom tízzel unsigned charból nem lesz maradék.
C18-at nem ismerem ... nincs maradékos osztás művelete?
Esetleg osztod 10-el, majd az eredményt szorzod tízzel és a kivonod az eredeti értékből!
Így mindig ki fog maradni 1 válasz. Talán ez segít
if (UART1_Data_ready())
{
if (!full)
{
puffer[head]= UART1_Read(); // Get received byte
head = (head +1) % PUFF_SIZE;
if(head == tail)
{
full = 1;
}
}
if (full)
{
head = 0;
full = 0;
}
// Bekapcsolás
if(strstr(puffer, on_cm))
{
UART1_Write(13);
UART1_Write_text("Bekapcs.");
UART1_Write(13);
PORTB.F7 = 1;
memset(puffer, 0, sizeof puffer);
}
//Kikapcsolás
if(strstr(puffer, off_cm))
{
UART1_Write(13);
UART1_Write_text("Kikapcs.");
UART1_Write(13);
PORTB.F7 = 0;
memset(puffer, 0, sizeof puffer);
}
}
Ehhez szét kéne bontanom a számot tehát 0-127 között van egy unsigned char típusú változóm.
Én azt szeretném, hogy így nézzen ki: 0.0-12.7.
A szétbontáson gondolkodok melyik a jobb a picnek ha elosztom 10-el és kivonom az eredetiből megkapva a maradékot, pár sor talán nem olyan vészes, vagy floatként kezdem kezelni, típuskényszerítéssel nem tudom működik e és ha igen akkor a fordító mire fordítja.
Megpróbálom megnézni mindkét megoldást, bár az első lehet gyorsabb és egyszerűbb.
Szia!
Karakterenként írd ki!
Szazas = valtozo/100;
Tizes = (valtozo - 100*Szazas)/10;
Egyes = valtozo%10;
Ezeket egyesével kiírva, megfelelő helyen közéjük a pont ( ASCII kódhoz kell hozzá még 0x30!)!
De kiírathatod a százast és a tízest egyszerre:
SzT= valtozo/10; <-- ezt Printf-el !
A többi ugyanúgy! A hozzászólás módosítva: Jún 6, 2019
Köszi , az a helyzet, hogy így pedig minden 3. küldött adatra válaszol csak. Ez mitől lehet?
Mellékeltem egy képet.
megj. A váltózók így vannak beállítva :
// Órajel beállítása (Kvarc)
#define _XTAL_FREQ 16000000
#define PUFF_SIZE 3
// Változók beállítása
unsigned int cnt;
char puffer[PUFF_SIZE];
char tail = 0;
char head = 0;
char full = 0;
// Vezérlő parancsok beállítása
char off_cm[] = "off";
char on_cm[] = "one";
char dev_id[] = "ID: sh";
A hozzászólás módosítva: Jún 6, 2019
Közben töröltem, mert rosszul értelmeztem, amit írtál !
Köszönöm, hogy ránéztél. Elvileg csak az egyik i2c-t használjuk.
|
|