PIC16F88-AD převodník-změna napětí způsobí přeblikávání LED

Si mě pobavil, tobě chybějí i háčky.
Já vím, měl jsi na mysli oddělovací čárku a tečku na konci věty, je tak? :smiley:

Ano měl sem na mysli interupční znaménka, psát s hačkama a čárkama je pro me oprus
me dostalo prave tohle

proto sem tak reagoval :slight_smile:

Tudle jsem to zkoušel v C je to pro 16f690, tak kdyby někdo potřeboval pro inspiraci. Budu rád, když se k tomu vyjádří i někdo zkušenější, funguje to, ale udělat se dá všechno lépe :slight_smile:

[code]
#define _XTAL_FREQ 4000000
#include <htc.h>

unsigned char aaa;

void init()
{
T2CON = 0b01001100; //nastavení časovače
TMR2IE=1;
PEIE=1;
GIE=1;
TMR2IF=0;
}

void ADint()
{
TRISC= 0b00000000;
TRISA= 0b00000100;
ANSEL= 0b00000100; // nastavení pinu RA2 jako analog (1)
ADCON0=0b00001000; // (0<<CHS0)|(1<<CHS1)|(0<<CHS2)|(0<<CHS3)|(1<<ADON);
ADCON1=0b00110000; //(1<<ADCS2)|(0<<ADCS1)|(1<<ADCS0);

}

unsigned char prevod()
{
unsigned char hodnota;
ADON=1; // zapnutí převodníku
GODONE=1; //zapnutí převodu

	while(GODONE);
	
	hodnota=ADRESH;
	
	return hodnota;	

}

void main (void)
{
ADint();

while(1)
{
aaa=prevod();
__delay_ms(10);

if(aaa <= 256 & aaa >= 224)
	   PORTC = 0b11111111;
if(aaa <= 223 & aaa >= 192)
	   PORTC = 0b01111111;
if(aaa <= 191 & aaa >= 160)
	   PORTC = 0b00111111;
if(aaa <=159 & aaa >= 128)
	   PORTC = 0b00011111;
if(aaa <= 127 & aaa >= 96)
	   PORTC = 0b00001111;
if(aaa <= 95 & aaa >= 64)
	   PORTC = 0b00000111;
if(aaa <= 63 & aaa >= 32)
	   PORTC = 0b00000011;
if(aaa <= 31 & aaa >= 6)
	   PORTC = 0b00000001;
if(aaa <= 5 & aaa >= 0)
	   PORTC = 0b00000000;

}
}[/code]

da ssa to napisat aj bez <= => len s < > ale ci to uspori nejaky kod neviem.
samozrejme krajne polohy by mali bt s rovnasa.

Zdravim panove,

mam problem, na ktery jsem kratky. Pouzivam PK3, 16f872 a hi-tech lite. Na LCD zobrazuji 10b hodnotu ze vstupu AN0 (0 az 5V). Cisilka skacou pekne od 0 az do 1023, ale v jednom intervalu visi na hodnote 256 (od hodnoty cca 169 do tech 256)a to odpovida napetim cca 0,75V az cca 1,15V. Proste v tomhle intervalu napeti na RA0 je vystup na konstantni hodnote 256. A mimo tenhle interval to chodi jak ma. Za kazdou radu dik.
16f872cele.c (2.2 KB)

heh, tak jsem na to prisel. Problem byl ve spatnem casovani prevodu. Zmenil jsem z fosc/2 na fosc/8 a je to ok 8) .

Nevedel by nekdo proc se to projevilo jen v tomhle intervalu ? Mel jsem za to, ze kdyz je spatny cas prevodu tak to ukazuje nesmysly v celem rozsahu nebo alespon od nejakeho cisla po nektery kraj rozsahu. Ale uprostred?

Měl bych prosbu, číst AD převodník v pohodě umím, odesílat data na displej taky pomocí I2C taky, ale narazil jsem na to, že když něco změřím AD převodníkem, tak se mi to uloží do ADRESH (jen 8 bitů, pro mou aplikaci stačí), na vstupu mám dělič třemi, takže měřím napětí v rozsahu 0-15V no a nevím, jak na displej dostat hodnotu napětí v čitelné formě a né v binární 0-255, potřeboval bych to s přeností na jedno desetinné číslo, takže např 14,5V (jelikož budu zobrazovat vždy 3 číslice, tak jsem si představoval, že bych měl v jednom registru 0-150 a to by ukazovalo napětí).

Ať přemýšlím, jak přemýšlím, tak nevím jak to udělat v ASM na 8- bitech:( poradíte někdo? (už hledám od rána po netu a všude nacházím řešení v C, což neumím)

Při přepočtu můžeš uvažovat např. takto:

Potřebuješ převést číslo x = 0…255 na y = 0…150. Teoreticky to znamená y = x / 255 * 150. Ale protože počítáš v celých číslech, budeš počítat s číslem * 256, aby byla hodnota v horním bajtu výsledku. Což znamená y = x * (256/255*150) = x * 151. Pokud není k dispozici hw násobička, tak lze číslo převést sčítáním binárních zlomků - tj. násobení *151 je stejné jako sečíst x + (x<<1) + (x<<2) + (x<<4) + (x<<7). Sčítá se 16bitově, výsledek je v horním bajtu. … Jiná možnost by byla převod tabulkou s 256 položkami.

Z převedeného čísla (=napětí v desetinách V) lze jednotlivé číslice získat dělením 100 a pak 10. Namísto dělení lze opět použít násobení s vyšším rozsahem, ale tady bude možná vhodnější převod odečítáním - nejdříve odečítat 100 (dokud je číslo >= 100), tím se zjistí 1. číslice, pak odečítat 10 ke zjištění 2. číslice a zbytek je 3. číslice.

skvělé, vůbec mě nenapadlo násobit do 16bitů, vynásobil jsem to tedy 151 a je to skvěle funkční, moc děkuji :exclamation: