Fórum témák
- • Kondenzátor
- • Dobozolási technikák, műszerdobozok
- • Villanymotor
- • Erősítő mindig és mindig
- • Klíma szervizelés, javítás
- • Boombox javítás
- • Akkumulátor töltő
- • Arduino
- • Sütő javítás
- • Elektromos távirányítós kapunyitó
- • Vegyes barkácsfogások
- • Digitális óra
- • Hűtőgép probléma
- • Elfogadnám, ha ingyen elvihető
- • Nagyfeszültségű tápegység
- • TV hiba, mi a megoldás?
- • Számítógép hiba, de mi a probléma?
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • Szünetmentes táp javítása, élesztése
- • Felajánlás, azaz ingyen elvihető
- • Erősítő építése elejétől a végéig
- • Műhelyünk felszerelése, szerszámai
- • Kombikazán működési hiba
- • Függvénygenerátor építése
- • SMD, mi a típusa?
- • Hibrid erősítő
- • Suzuki Swift elektronika
- • Videomagnó problémák
- • Általános antennás kérdések, válaszok
- • Érdekességek
- • STK erősítők javítások
- • DC-DC konverter max. kapacitív terhelése
- • Háromfázisú aggregátor
- • Audiofil, High End Audio
- • Alternativ HE találkozó(k)
- • Központi fűtés (vezérlés)
- • IMI villanymotor
- • Borhűtő vezérlő panel
- • Androidos okos telefonok
- • Klíma beszerelése, fűtés-hűtés házilag
- • Súlymérés
- • Laptop javítás, tuning
- • Varrógép elektronika
- • Mosógép vezérlők és általános problémáik
- • Analóg oszcilloszkóp javítása
- • Videoton EA-7386-s erösítő
- • Digitális mérleg
- • Kapcsolási rajzot keresek
- • Triak és tirisztor helyettesítése
- • Rádióamatőrök topikja
- • Hangszórójavítás (otthon)
- • LED-es világítás
- • Whirlpool mosógép
- • Vásárlás, hol kapható?
- • Autóelektronika
» Több friss téma
|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
Ez nem a sima nano ra vonatkozik, azon 5V ról megy a kontroller, de van rajta egy 3.3V stab ha valami perifériát etetni kéne esetleg. A Vdd referencia ezért 5V alapból, ha átállítod külsőre akkor rá lehet kötni a 3.3V stab kimenetét az aref referencia bemenetre, ezután nem 0-5V hanem 0-3.3V között fog mérni, nagyobb lesz a hasznos felbontás, pontosabb a mérés.
Azért irta a referenciafeszültséget mert úgy állítólag pontosabb a mérés. De azt hiszem sehogy se lesz jó mert a projektembe nem csak egy LM35 van hanem poti-t, LDR-t, meg egyénb szenzorokat is használok. És a referenciát az összes input lábon beállítja ,de nekem az csak az A1-en kéne, a többin nem. Gondolom olyat nem lehet ,hogy csak A1-en állitom be a referenciát
Lehet igazad van, nem néztem meg milyen vezérlő van a nano-n.
Ettől függetlenül a külső referencia feszültséget nem szokták tolerálni Vss felett.
Láttam olyan projektet ahol menet közben kapcsolgatták a referenciát menet közben
Én inkább enyire nem bonyilítanám
Van egy programom ami lefagy időnként, vagy legalábbis nem azt csinálja mint kellene, az állapotot tudom detektálni. Lehetséges a RAM-ot vagy egyéb memória területeket törölni? Ez segítene?
a watchdog valamiért nem működik talán a bootloader miatt, arra is gondoltam hogy egy portot összekötöm a reset lábbal, ezt input alapból, majd amikor resetelni kell átírom outputra , majd L szintre. A hozzászólás módosítva: Feb 15, 2022
Nem címzel valami tömböt túl?
Úgy tudom a C ben , legalábbis korábban lehetet ilyet benézni, és akkoremory leak miatt elfogy a ram.
Volt benne olyan is, de már kijavitottam.
Ha szoftveresen akarsz resetelni, akkor gondban lehetsz, mert elszáll a program akkor honnan tudod hogy resetelni kell?
En inkább egy monstabilt kötnék a resetre, amit egy portlábon rendszeresen újra indïtasz. Ha elszállsz, akkor eltelik az idő hogy nem indítottad újra, és akkor majd ő tol egy resetet, ami rendbehoz mindent. Ez minden vezérlővel kell hogy működjön, akkor is ha nincs WD timer.
Igen ez is jó megoldás, vannak is erre külső watchdog ic-k hasonlóan működnek mint a sima monostabil.
Én inkább megtalálnám benne a hibát...
Köszönöm, egyser már felraktam ide a kódot (HGA22 óra), az analóg komparátorra érkezik jel, 2kHz körül, ami 200baud sebességű FSK információt hordoz, ezt felskálázom 1200baudra, és ezt veszi az UART modul (itt lehet a gond), dekódolja, majd I2C buszos kijelzőre írja az adatokat.
#include <Wire.h>
#include "LiquidCrystal_I2C.h"
#include "HT16K33.h"
#define Bittime 435 //435 2.___ 410 1.
#define window_size 4 //moving average filter
#define Signalarray 230
//LiquidCrystal_I2C lcd(0x27, 16, 2);
HT16K33 seg(0x70);
unsigned long sample;
unsigned long lastsample;
int value = 0;
int sum = 0;
int readings[window_size];
volatile int averaged = 0;
int index = 0;
unsigned long lastsample1;
byte state = 0;
byte laststate = 0 ;
volatile byte j = 0;
int nosig = 0;
volatile unsigned int bitle[Signalarray];
volatile byte pr = 0;
volatile byte calc = 0;
bool HGAStartBitDetected = false;
byte HGAData[64];
byte HGAByteCounter = 0;
byte crc = 0;
byte year = 21;
byte month = 1;
byte day = 1;
byte hour = 12;
byte minute = 0;
byte sec = 0;
byte halfsec;
byte nap = 1;
unsigned long previousMillis = 0;
bool sync = false;
unsigned int nosync = 1200;
const int interval = 500;
const unsigned int bh = 4540;
byte inByte = 0;
volatile byte th = 0;
extern volatile unsigned long timer0_millis;
unsigned long new_value = 0;
bool sendt = true;
void setMillis(unsigned long new_millis) {
uint8_t oldSREG = SREG;
cli();
timer0_millis = new_millis;
SREG = oldSREG;
sei();
}
void setup () {
cli();
TCCR1A = 0;
TCCR1B = 0;
OCR1A = 29;
TCCR1A = _BV(WGM10) | _BV(COM1A0);
TCCR1B = _BV(WGM13) | _BV(CS10);
DDRB |= _BV(1);
pinMode(2, INPUT_PULLUP);
pinMode(5, OUTPUT);
pinMode(13, OUTPUT);
PORTD = PORTD & B11011111;
PORTB = PORTB & B11011111;
DIDR1 |= (1 << AIN0D); // Disable Digital Inputs at AIN0 and AIN1
ADCSRA &= ~(1 << ADEN);
ADCSRB |= (1 << ACME); //Set ACME bit in ADCSRB to use external analog input at AIN1 -ve input
ADMUX = 0x01; //select A1 as input
ACSR =
(0 << ACD) | // Analog Comparator: Enabled
(0 << ACBG) | // Clear ACBG to use external input to AIN0 +ve input
(0 << ACO) | // Analog Comparator Output: OFF
(1 << ACI) | // Analog Comparator Interrupt Flag: Clear Pending Interrupt by setting the bit
(1 << ACIE) | // Analog Comparator Interrupt: enabled
(0 << ACIC) | // Analog Comparator Input Capture: Disabled
(1 << ACIS1) | (1 << ACIS0); // Analog Comparator Interrupt Mode: rising edge
sei();
attachInterrupt(digitalPinToInterrupt(2), sign, RISING);
Serial.begin(1200, SERIAL_8E1);
//lcd.init();
//lcd.backlight();
//lcd.setCursor(0, 0);
//lcd.print(" HGA22 CLOCK ");
seg.begin();
Wire.setClock(200000);
seg.displayOn();
seg.setDigits(4);
seg.brightness(4);
delay(100);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {//internal 2Hz
//if (th == 1) {//externel 2Hz on INT0
//th = 0;
previousMillis = currentMillis;
nosync++;
halfsec++;
if (halfsec % 2 == 0) {
sec++;
}
if (sec > 59) {
sec = 0;
minute++;
}
if (minute > 59) {
minute = 0;
hour++;
}
if (hour > 23) {
hour = 0;
}
if (halfsec % 2 == 0 ) {
/*
Serial.print("20");
Serial.print(year);
Serial.print("-");
Serial.print(month);
Serial.print("-");
Serial.print((day));
Serial.print(" ");
Serial.print((hour));
Serial.print(":");
Serial.print((minute));
Serial.print(":");
Serial.print(sec);
Serial.print(" ");
Serial.println();
*/
}
if (halfsec % 10 == 0) {
//lcd.setCursor(0, 1);
//lcd.print(Tsensor.temp());
//lcd.print("C ");
}
if (sync == true) {
//lcd.setCursor(0, 0);
//lcd.print(" 20");
//lcd.print(year);
//lcd.print("-");
//if (month < 10)lcd.print("0");
// lcd.print(month);
// lcd.print("-");
// if (day < 10)lcd.print("0");
// lcd.print((day));
// lcd.print(" ");
// lcd.setCursor(7, 1);
// if (hour < 10)lcd.print("0");
//lcd.print((hour));
// lcd.print(":");
// if (minute < 10)lcd.print("0");
// lcd.print((minute));
// lcd.print(":");
// if (sec < 10)lcd.print("0");
// lcd.print(sec);
// lcd.print(" ");
// if ( nosync > 1200) {
// lcd.setCursor(15, 1);
// lcd.print("!");
// }
// else
// {
// lcd.setCursor(15, 1);
// lcd.print(" ");
// }
}
//if ((hour == 12 ) && minute == 0 && sec == 10 && halfsec % 2 == 0 ) {
//seg.displayOff();
//sendt = false;
//}
//if ( sec == 0 && halfsec % 2 == 0 && sync == true ) {
//seg.displayOn();
//sendt = true;
// }
if ( nosync > 1200) {
seg.displayOff();
}
else
{
seg.displayOn();
}
//if (sendt == true) {
if (sec % 10 != 0) {
seg.displayTime(hour, minute, true, false);
seg.displayColon(1);
}
else
{
seg.suppressLeadingZeroPlaces(2);
seg.displayFloat(Tsensor.temp(), 2);
seg.displayColon(0);
}
//}
}
if (Serial.available() > 0) {
inByte = Serial.read();
if (HGAStartBitDetected)
{
HGAData[HGAByteCounter] = inByte;
if (HGAByteCounter < 64)HGAByteCounter++;
if (HGAByteCounter == 3)
{
if (HGAData[1] != HGAData[2])
{
HGAStartBitDetected = false;
}
}
if (HGAData[1] + 6 == HGAByteCounter)
{
HGAStartBitDetected = false;
crc = (HGAData[13] + HGAData[12] + HGAData[11] + HGAData[10] + HGAData[9] + HGAData[8] + HGAData[7] + HGAData[6] + HGAData[5] + HGAData[4]);// & 255;
if (HGAData[0] == 0x68 && HGAData[1] == 0x0A && HGAData[2] == 0x0A && HGAData[5] == 0x00 && HGAData[6] == 0x00 && HGAData[7] == 0x00 && HGAData[15] == 0x16 && (HGAData[14] == crc))
{
//Serial.print(HGAData[14],HEX);
//Serial.print(" ");
//Serial.print(crc,HEX);
//Serial.print(" ");
//Serial.print(HGAData[15], HEX);
//Serial.println();
if (HGAData[13] <= 99 && HGAData[12] <= 12 && (HGAData[11] & 0x1F) <= 31 && (HGAData[10] & 0x1F) < 24 && (HGAData[9] & 0x3F) < 60 && ((HGAData[8] & 0xFC) >> 2) < 60) {
PORTB = PORTB | B00100000;
delayMicroseconds (40); //cd4060 reset
setMillis(new_value);
sync = true;
nosync = 0;
year = HGAData[13];
month = HGAData[12];
day = HGAData[11] & 0x1F;
hour = HGAData[10] & 0x1F;
minute = HGAData[9] & 0x3F;
sec = ((HGAData[8] & 0xFC) >> 2);
nap = ((HGAData[11] & 0xE0) >> 5 );// a hét napja
while (Serial.available() > 0)Serial.read();
PORTB = PORTB & B11011111;
}
}
}
}
else
{
if (inByte == 0x68)
{
HGAData[0] = 0x68;
HGAStartBitDetected = true;
HGAByteCounter = 1;
}
}
}
if (pr == 1) {
pr = 0;
//1200baud 8E1:
for ( byte i = 1 ; i <= j; i++ ) {
//Serial.println(bitle[i]);
if (bitle[i] < 7500 && bitle[i] >= 1000) bitle[i] = bh * 2 / 12 * 1;
else if (bitle[i] < 12500 && bitle[i] >= 7500) bitle[i] = bh * 2 / 12 * 2;
else if (bitle[i] < 17500 && bitle[i] >= 12500) bitle[i] = bh * 2 / 12 * 3;
else if (bitle[i] < 22500 && bitle[i] >= 17500) bitle[i] = bh * 2 / 12 * 4;
else if (bitle[i] < 27500 && bitle[i] >= 22500) bitle[i] = bh * 2 / 12 * 5;
else if (bitle[i] < 32500 && bitle[i] >= 27500) bitle[i] = bh * 2 / 12 * 6;
else if (bitle[i] < 37500 && bitle[i] >= 32500) bitle[i] = bh * 2 / 12 * 7;
else if (bitle[i] < 42500 && bitle[i] >= 37500) bitle[i] = bh * 2 / 12 * 8;
else if (bitle[i] < 47500 && bitle[i] >= 42500) bitle[i] = bh * 2 / 12 * 9;
else if (bitle[i] < 52500 && bitle[i] >= 47500) bitle[i] = bh * 2 / 12 * 10;
else if (bitle[i] < 57500 && bitle[i] >= 52500) bitle[i] = bh * 2 / 12 * 11;
else if (bitle[i] < 62500 && bitle[i] >= 57500) bitle[i] = bh * 2 / 12 * 12;
}
//Serial.println();
for ( byte i = 1 ; i <= j; i++ ) {
if (i % 2 == 1) {
PORTD = PORTD | B00100000;
}
else
{
PORTD = PORTD & B11011111;
}
delayMicroseconds((bitle[i]));
}
PORTD = PORTD & B11011111;
j = 0;
}
}
void sign() {
th = 1;
}
ISR(ANALOG_COMP_vect)
{
sample = micros();
value = sample - lastsample;
sum = sum - readings[index];
readings[index] = value;
sum = sum + value;
index = (index + 1) % window_size;
averaged = sum / window_size;
lastsample = sample;
if (averaged > Bittime && averaged < 550 ) {
state = 1;
nosig = 0;
}
if (averaged < Bittime && averaged > 350 ) {
state = 0;
nosig ++;
}
if (state != laststate) {
bitle[j] = (sample - lastsample1);
if (j < Signalarray)j++;
lastsample1 = sample;
}
laststate = state;
if (nosig > 150 && j > 0) {
nosig = 0;
pr = 1;
}
}
Bár nem néztem át tüzetesen a programkódodat (te írtad, te érted ), de a megszakítás a Delay-jel, sőt, az LCD rutinbeli Delay-ekkel is összeakadhat. Arduino-n vagy egyik, vagy másik vagy gyorsabb mikrovezérlő (120-240 MHz-es órajelű) kell a dekódoláshoz.
Én is építenék HGA22 dekódert - segítek a szoftver megírásában, ha segítesz az FM vevő megépítésében (4 topikban is futott ez a vevő téma). A hozzászólás módosítva: Feb 16, 2022
Az UART modult nem lehet levinni 200Baudra alapban?
200Baud feldolgozásához 120-240MHz-es órajel??! ))) Szép új világ, talán még egy hello world futtatásához is elég lehet?
Sajnos nem, 16M kristállyal 300baud a minimum, még érdekesebb hogy a windows soros terminálok sem tudják a 200baudot, beírhatom de valójában 300-on megy.
Köszönöm. Késöbb felrakom az aktuális kapcsolási rajzot.
Dehogynem! 1Baud-ig teszteltem nemrég a PC baud generátorát, simán ment még! A 200Baud nem jelenhet gondot szerintem egyik hardvernek sem! Ha a program nem tudja, akkor cseréld le olyanra, ami nem korlátoz szabvány értékekre....
Esetleg kvarc csere 10MHz-esre? )
Akkor ki kell lépnem az arduino korlátaiból, nem nagy gond mert lehet olyan bootloader fájlt is írni ahol módosítva van a kristály frekvencia és magát a bootloadert nem kell lecserélni a kontrollerben, 8MHz kristállyal is lehetséges, régebben kaphatóak voltak ilyen panelek.
A legutóbbi verzió, kérdezz ha valami nem világos.
Minél zajosabb a környezet annál előbb kifagy, valahol az arduino Serial.available körül kell keresni a hibát megérzésem szerint.
A 200 Baud feldolgozása csak az egyik feladata a programnak. A részprogramok együtt nem működnek megfelelően. Ma már a 16MHz-es órajelű mikrovezérlőkhöz hasonló árszinten sokkal gyorsabb és lassabb hardver is használható. Én is kérdezhetném: 200 Baudra miért kell 16MHz-es Arduino mikrovezérlő, amikor létezik olcsóbb, lassabb, akár 6 lábú verzió is?
...És teljesen jogos lenne a kérdésed!!
Azonban nyilván az Arduino, mint elterjedt eszköz, amit csak leemelsz a polcról jobbik esetben mindig kéznél van, és egyszerű, kényelmes rá programot írni! Emiatt gyakran jobb választás, mint pl egy 6 lábú PIC-el megcsinálni azt, amire az is kényelmesen elég lenne!
De egy 120-240MHz-es procit ilyen feladatra egyszerűen szégyen lenne berakni már(főképp, mert gondolom 32 bites amúgy is). Én is erősen benne vagyok egy szoftver-rádióban éppen, és ha leírnám, mennyi mindent csinál a program, kb elszörnyednél, és azt mondanád, az biztos lehetetlen...., pedig "csak" 70MHz/16bit...
Ez igaz, erre nem gondoltam....
Bár, ha a cél a számítógépbe való információ juttatás, akkor végképp ki lehet hagyni akár az egész mikrovezérlőt is, programostól.... Én egy teszt erejéig simán beküldtem a soros portra a demodulált HGA jelet a 200Baud-al, és tökéletesen ment a hibátlan vétel...
A célom DCF77 vevős (és GPS vevős) óra kiváltása HGA22 vevős órával. A demodulált FM rádiójelet ne (a drága) SDR vevő, hanem egy minél egyszerűbb FM vevő biztosítsa. Az amilyen-van-a-polcon típusú mikrovezérlő ezt feldolgozza, kijelzi, ugyanúgy, ahogy a DCF77 vagy GPS vevő órák teszik.
GPeti1977 rajzához a megépítési információk hiányoznak - pedig megér egy misét...
Járható(bb) út egy olcsó FM vevő kit (TEA5767, RD5807, SI4703, amik max. 108 MHz-esek) vagy meglévő rádió áthangolása 108 MHz-ről 135 MHz-re pl a kvarc frekvencia megváltoztatásával? A hozzászólás módosítva: Feb 17, 2022
Tévedsz 3 nagyságrendet, a hga22 nem 135MHz-en ad hanem 135kHz-en. Írd le mit nem értesz.
Gondolom a kapcsolási rajzodon lévő nagy mennyiségű érték nélküli alkatrészekre gondolt HeZ Ha közzétételre is szánsz valamit, nagyon nem árt legalább minimális szinten gatyába rázni a kapcsolási rajzot!
Bizony nem mindegy a MHz és a KHz...
Járható(bb) út egy olcsó vevő kit vagy meglévő rádió áthangolása?
A cél az utánépítés. Miért kell két egymást követő fokozat? Miért és mikor kapcsolod a D9 kapcsolót? A D5 kimenetnek mi a funkciója? Hogyan és mivel állítod be, hangolod a vevőt? A hozzászólás módosítva: Feb 17, 2022
Mivel 3 3 egymás utáni fokozat van az alkatrészek értéke meg van adva egy egy helyen így logikus hogy a másik két helyen is ugyanaz lesz.
Egy analóg AM vevő KF-je 450kHz, 9 kHz sávszélességgel, ide 2,4kHz KF kell, ha több az arduino már nem tudja megmérni a micros 4us felbontásával a frekvencia változást.
Logikus - neked! Másnak, aki esetleg kevésbé járatos a te elképzelésedben, korántsem biztos, hogy az lesz! Ne kimagyarázd magad, hanem lásd be, nem véletlenül van az alkatrészeknek legalább értékük megadva, amit minden egyes alkatrészhez erősen ajánlott odaírni! Ez így egy kézi sniccnek, önmagad számára elmegy, de ha már másnak is meg akarod mutatni, nem kell ennyire lustának lenned!
|
|