Napsal: 06 pro 2011, 17:36
Vyrobíš si z hodnoty a čísla pinu masky (AND a OR) a těma vymaskuješ ten port.
Vše, co potřebujete vědět o elektronice :-)
http://elektrobastlirna.cz/
Atlan píše:existuje nieco take
#define mono PORTEbits.RE2
a potom mozes mono=1; nastaví dany bit na log 1,,, mono=0; na 0
Inak je to nestandartne v ccku ale co uz...
Kód: Vybrat vše
hodnota = get & 0x80;
pin = get & 0x7;
if(pin==0) RBpin0 = hodnota;
elseif(pin==1) RBpin1 = hodnota;
elseif(pin==10) RBpin2 = hodnota;
...
...
...eXilim píše:elseif(pin==10) RBpin2 = hodnota;
eXilim píše:co máš na mysli tím zapíšeš?
Kód: Vybrat vše
void setPin(unsigned char get) {
unsigned char pin;
unsigned char h;
h = get & 0x80; //hodnota
h = h >> 7;
pin = get & 0x7;
//nastavení pinu
if(pin == 0x0) RBPin0 = h;
elseif(pin == 0x1) RBPin1 = h;
elseif(pin == 0x2) RBPin2 = h;
elseif(pin == 0x3) RBPin3 = h;
elseif(pin == 0x4) RBPin4 = h;
elseif(pin == 0x5) RBPin5 = h;
elseif(pin == 0x6) RBPin6 = h;
elseif(pin == 0x7) RBPin7 = h;
}Kód: Vybrat vše
#include "18c252.h"
#include "uart.h"
unsigned long proc_type 0x8252;
void main() {
unsigned char read;
read = getRx();
baudUSART (BAUD_IDLE_CLK_HIGH &
BAUD_8_BIT_RATE &
BAUD_WAKEUP_ON &
BAUD_AUTO_ON);
//!!! Tohle by měl asi volat před tím getRx(). Po čtení je trochu pozdě ne?
//!!! Taky nechápu to &. Nemělo by se použít spíš OR než AND? Takhle vyjde vždycky nula, ne?
if (read & 0x40) setPwm(read);
else setPin(read);
}
unsigned char getRx() {
unsigned char result;
result = ReadUSART();
return result;
}
void setPin(unsigned char get) {
unsigned char pin;
unsigned char hodnota;
hodnota = get & 0x80;
pin = get & 0xF;
//nastavení pinu
//!!! Co tohle?
unsigned char mask; // to dát na začátek bloku
mask = 1 << pin;
if ( hodnota )
portB |= mask;
else
portB &= ~mask;
//!!! To portB má být port, ale já nevím, jak se ta proměnná jmenuje. To si najdi v dokumentaci k překladači.
//!!! Taky ten port asi budeš muset nejdřív nastavit, aby měl všechny piny výstupní, implicitně bývají vstupní.
}
Kód: Vybrat vše
#include "p18c252.h"
#include "usart.h"
#include "pwm.h"
#pragma config OSC = HS
unsigned long proc_type 0x8252;
unsigned char getRx();
void setPin(unsigned char get);
void setPwm(unsigned char get);
void init();
void init() {
//inicializace uartu
baudUSART (BAUD_IDLE_CLK_HIGH &
BAUD_8_BIT_RATE & //8 bitový přenos
BAUD_WAKEUP_ON & //Hlidání příchozí komunikace
BAUD_AUTO_ON); //Automaticka rychlost
//inicializace portu
TRISB = 0; //Všechny piny RB sou výstupní
//inicializace pwm
SetOutputPWM1 (SINGLE_OUT, PWM_MODE_1); //?
OpenPWM1(0xFF); //?
SetDCPWM1(0); //?
}
void main() {
unsigned char read;
init();
read = getRx();
if (read & 0x40) setPwm(read);
else setPin(read);
}
unsigned char getRx() {
unsigned char result;
result = ReadUSART();
return result;
}
void setPin(unsigned char get) {
unsigned char pin;
unsigned char h;
unsigned char mask;
h = get & 0x80; //hodnota
h = h >> 7;
pin = get & 0x7;
mask = 1 << pin;
if (h) PORTB |= mask;
else PORTB &= ~mask;
}
void setPwm(unsigned char get) {
unsigned char frek;
frek = get & 0x3F; //00xxxxxx - Vyčteme frekvenci
//změna frekvence PWM
//?
}
Aha, no jo, to je divný. Většinou to bývá přes OR, tohle jsem ještě neviděl.eXilim píše:Ano, ta inicializace má být předtím, neaktualizoval jsem tu kod, jsou tam & podle dokumentace knihoven pro překladač (http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_C18_Libraries_51297f.pdf viz 2.10)
Jo a ne.eXilim píše:To maskování neovlivní bity které jsou už nastavené?
To by asi mohlo fungovat. Teda, ty inicializace jsem nekontroloval. To neznám.eXilim píše:V tuhle chvíli to mám takto: ...
Kód: Vybrat vše
#include "p18c252.h"
#include "usart.h"
#include "pwm.h"
#pragma config OSC = HS
unsigned long proc_type 0x8252;
unsigned char pB = 0x0; //Nadefinuju proměnou pB kde bude uložená vždy poslední hodnota PORTB
unsigned char getRx();
void setPin(unsigned char get);
void setPwm(unsigned char get);
void init();
void init() {...
}
void setPin(unsigned char get) {
unsigned char pin;
unsigned char h;
unsigned char mask;
h = get & 0x80; //hodnota
h = h >> 7;
pin = get & 0x7;
mask = 1 << pin;
if (h) pB |= mask;
else pB &= ~mask;
PORTB = pB;
}